




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
(完整版)java練習題(含答案)
1.編寫程序,使用多個一維數(shù)組來存儲和輸出乘法小九九。publicclassMultiplication{publicstaticvoidmain(String[]args){int[][]x=newint[9][9];for(inti=0;i<9;i++){for(intj=0;j<9;j++){intm=i+1;intn=j+1;if(i>=j){x[i][j]=m*n;System.out.print(m+"*"+n+"="+x[i][j]+"");}}System.out.println();}}}2.定義一個Student類,包括學號、姓名和成績屬性,并提供SetRecord和GetRecord方法。publicclassStudent{privateintID;privateStringname;privatefloatscore;publicvoidSetRecord(intID,Stringname,floatscore){this.ID=ID;=name;this.score=score;}publicfloatGetRecord(intID){if(ID==this.ID)returnthis.score;elsereturn-1;}publicstaticvoidmain(String[]args){Students=newStudent();s.SetRecord(0,"alex",100);floatSco=s.GetRecord(0);System.out.print(Sco);}}3.給Student類添加一個構造函數(shù),用于初始化學號、姓名和成績。publicclassStudent{privateintID;privateStringname;privatefloatscore;publicStudent(intID,Stringname,floatscore){this.ID=ID;=name;this.score=score;}publicfloatGetRecord(intID){if(ID==this.ID)returnthis.score;elsereturn-1;}publicstaticvoidmain(String[]args){Students=newStudent(0,"alex",100);floatSco=s.GetRecord(0);System.out.print(Sco);}}4.編寫程序,測試字符串“你好,歡迎來到Java世界”的長度,將字符串的長度轉(zhuǎn)換成字符串進行輸出,并對其中的“Java”四個字母進行截取,輸出截取字母以及它在字符串中的位置。publicclassStringTest{publicstaticvoidmain(String[]args){Stringstr="你好,歡迎來到Java世界";intlength=str.length();StringlengthStr=String.valueOf(length);System.out.println("字符串長度為:"+lengthStr);StringsubStr=str.substring(6,10);System.out.println("截取的字母為:"+subStr+",在字符串中的位置為:"+(str.indexOf(subStr)+1));}}1.設計一個坐標類,提供計算當前坐標和其他坐標之間距離等方法。要求所有變量為私有變量,并提供兩個構造函數(shù)。為了實現(xiàn)這個類,我們需要定義兩個私有變量x和y,分別代表坐標的x和y軸坐標值。我們還需要提供getX()和getY()方法來獲取x和y的值,以及setX()和setY()方法來設置它們的值。此外,我們還需要提供一個構造函數(shù),用于創(chuàng)建一個坐標為(0,0)的對象,以及另一個構造函數(shù),用于創(chuàng)建一個具有指定坐標值的對象。最后,我們需要提供一個計算當前坐標和其他坐標之間距離的方法,該方法使用勾股定理計算兩點之間的距離。下面是完整的代碼:publicclassXYdistance{privateintx;privateinty;publicXYdistance(){this.x=0;this.y=0;}publicXYdistance(intx,inty){this.x=x;this.y=y;}publicintgetX(){returnx;}publicvoidsetX(intx){this.x=x;}publicintgetY(){returny;}publicvoidsetY(inty){this.y=y;}publicdoubledistanceTo(XYdistanceother){intdx=this.x-other.getX();intdy=this.y-other.getY();returnMath.sqrt(dx*dx+dy*dy);}publicstaticvoidmain(String[]args){XYdistancem_1=newXYdistance();m_1.setX(10);m_1.setY(10);XYdistancem_2=newXYdistance();doubledistance=m_1.distanceTo(m_2);System.out.println(distance);}}2.編寫一個程序,使用靜態(tài)變量統(tǒng)計一個類產(chǎn)生的實例對象的個數(shù)。為了實現(xiàn)這個程序,我們需要定義一個靜態(tài)變量number,用于記錄實例對象的個數(shù)。我們還需要提供一個構造函數(shù),每次創(chuàng)建一個新的實例對象時,將number加1。最后,我們需要提供一個靜態(tài)方法,用于獲取number的值。下面是完整的代碼:publicclassStatic{privatestaticintnumber;publicStatic(){++number;}publicstaticintgetNumber(){returnnumber;}publicstaticvoidmain(String[]args){newStatic();newStatic();newStatic();System.out.println(Static.getNumber());//輸出3}}3.描述創(chuàng)建string對象的內(nèi)存分配過程。創(chuàng)建一個字符串對象的過程涉及到兩個步驟:字符串常量池和堆內(nèi)存。首先,當我們使用字符串字面量創(chuàng)建一個字符串對象時,Java會首先檢查字符串常量池中是否已經(jīng)存在一個相同的字符串對象。如果存在,則直接返回該對象的引用;否則,創(chuàng)建一個新的字符串對象,并將其添加到字符串常量池中。接下來,Java會在堆內(nèi)存中為新的字符串對象分配空間,并將字符串的內(nèi)容復制到該空間中。由于字符串是不可變的,因此這個空間將一直保持不變,直到該字符串對象被垃圾回收。需要注意的是,如果我們使用new關鍵字顯式地創(chuàng)建一個字符串對象,則不會將該對象添加到字符串常量池中。此時,Java會在堆內(nèi)存中為該對象分配新的空間,無論該字符串是否已經(jīng)存在于字符串常量池中。創(chuàng)建過程分析:當執(zhí)行Strings=newString("abc");時,JVM首先在StringPool中查看是否存在字符串對象“abc”,如果不存在該對象,則先在StringPool中創(chuàng)建一個新的字符串對象“abc”,然后執(zhí)行newString("abc")構造方法,在Heap里又創(chuàng)建一個新的字符串對象“abc”(new出來的對象都放在Heap里面),并將引用s指向Heap中創(chuàng)建的新對象;如果已存在該對象,則不用創(chuàng)建新的字符串對象“abc”,而直接使用StringPool中已存在的對象“abc”,然后執(zhí)行newString("abc")構造方法,在Heap里又創(chuàng)建一個新的字符串對象“abc”,并將引用s指向Heap中創(chuàng)建的新對象。需要注意的是,使用newString("")創(chuàng)建的字符串對象時,會在運行期創(chuàng)建新對象存儲到Heap中。因此,newString("abc")創(chuàng)建字符串對象時,會創(chuàng)建2個對象,編譯期在StringPool中創(chuàng)建一個,運行時Heap中創(chuàng)建一個。這里使用了Java代碼中的publicString(Stringoriginal)這個構造方法,作用是初始化一個新創(chuàng)建的String對象,使其表示一個與參數(shù)相同的字符序列;換句話說,新創(chuàng)建的字符串是該參數(shù)字符串的副本。由于String類是不可變的,因此不必使用該構造方法,除非需要original的顯式副本。例如,Java代碼中的Strings1=newString("abc");Strings2=newString("abc");System.out.println(s1==s2);的結(jié)果是false。這說明只要是用new()來新建對象的,都會在堆(Heap)中創(chuàng)建,而且其字符串是單獨存值的,即使與StringPool中的數(shù)據(jù)相同,也不會與StringPool中的數(shù)據(jù)共享。下面是一個例程:Java代碼1.Strings1="abcdef";2.Strings2="abcdef";3.Strings3="abc"+"def";//編譯期自動優(yōu)化為Strings3="abcdef";4.System.out.println(s1==s2);5.System.out.println(s1==s3);6.System.out.println(s2==s3);在這個例程中,Strings1和Strings2都指向StringPool中的"abcdef"對象,而Strings3是在編譯期自動優(yōu)化為"abcdef",因此也指向StringPool中的"abcdef"對象。因此,第4行輸出false,第5行輸出false,第6行輸出false。1.Strings1="hello";2.Strings2=newString("hello");3.Strings3="he"+"llo";4.Strings4="he";5.s4=s4+"llo";6.System.out.println(s1==s2);7.System.out.println(s1==s3);8.System.out.println(s1==s4);9.System.out.println(s1==ern());10.System.out.println(s2==ern());11.System.out.println(s3==ern());12.System.out.println(s4==ern());13.System.out.println(s1.equals(s2));14.System.out.println(s1.equals(s3));15.System.out.println(s1.equals(s4));運行結(jié)果如下:falsetruefalsetruefalsetruefalsetruetruetruefalse結(jié)果說明:s1和s3都是字符串常量,它們在編譯期就被確定了,所以它們在StringPool中只有一個拷貝。s2是通過new操作符創(chuàng)建的,它在堆中有一個新的對象。s4是一個變量,它在編譯期無法確定它的值,所以它也不會在StringPool中創(chuàng)建。當s4調(diào)用intern()方法時,它會在StringPool中查找是否有相同值的字符串,如果有,則返回該字符串的引用;否則,將該字符串加入StringPool中并返回該字符串的引用。所以s1==ern()返回true,s2==ern()返回false。而s1.equals(s2)、s1.equals(s3)、s1.equals(s4)都返回true,因為它們的值都相同。運行結(jié)果如下:truetruetruetrue解釋:在例程1中,字符串s1和s2都被賦值為常量字符串,即在編譯時就已經(jīng)確定了值,因此s3、s4、s5、s6、s7都指向同一個字符串對象,所以結(jié)果都為true。在例程2中,s1和s2都被聲明為final變量,這意味著它們在編譯時就被解析為常量值,因此s3、s4、s5、s6、s7仍然指向同一個字符串對象,所以結(jié)果都為true。在例程5中,s2被聲明為final變量,但s1并沒有被修飾,因此s4和s5指向的是不同的字符串對象,所以結(jié)果都為false。最后,字符串的連接操作可以在編譯時進行優(yōu)化,因此"abc"+"def"和"abcdef"實際上是等價的,它們都被解析為常量值。因此,例程3和例程4的結(jié)果也都為true。在編譯期,我們可以進行直接優(yōu)化,例如進行常量連接。比如我們有以下Java代碼:Stringa="a";Stringb="b";Stringc="c";Strings=a+b+c;我們可以將其優(yōu)化為:Strings="abc";這樣可以減少在運行時的字符串拼接操作,提高程序的效率。另外,對于使用StringBuilder來拼接字符串的情況,我們需要注意其toString()方法的實現(xiàn)。在調(diào)用toString()方法時,會通過newString()方法在堆中創(chuàng)建一個新的String對象。但是,我們并不能確定這個字符串是否已經(jīng)存在于字符串池中。對于Stringc="c";Strings="a"+"b"+c;這段代碼,編譯器會先將"a"+"b"優(yōu)化生成成字面常量"ab",然后再生成一個StringBuilder對象,最后調(diào)用兩次append()方法,生成最終的字符串s。而對于Stringa="a";Strings=a+"b"+"c";這段代碼,由于a是一個引用變量,編譯器無法將"b"+"c"作為編譯時常量來運算,所以會依次執(zhí)行字符串拼接操作,生成最終的字符串s。對于這種形式的字符串拼接:Stringa="a";Stringb="b";Stringc="c";Strings=a+b+c;我們可以使用StringBuilder來優(yōu)化,代碼如下:Strings=newStringBuilder().append(a).append(b).append(c).toString();下面是關于字符串常量和字符串對象的一些說明:Stringstr1="abc";//是字符串常量,它在編譯期被確定,放在常量池中(共享內(nèi)容值)Stringstr2=newString("abc");//不是字符串常量,不在編譯期確定(不共享內(nèi)容值)如果我們這樣寫:Stringstr1=newString("abc");Stringstr2="abc";System.out.println(str1==str2);//false就會創(chuàng)建兩個引用和兩個對象,兩個引用分別指向不同的兩個對象。如果我們這樣寫:Stringstr1="abc";Stringstr2=newString("abc");System.out.println(str1==str2);//false也會創(chuàng)建兩個引用和兩個對象,兩個引用分別指向不同的兩個對象。最后介紹一下intern()方法,它的定義如下:publicnativeStringintern();在調(diào)用這個方法時,Java虛擬機首先檢查StringPool中是否已經(jīng)存在與該對象值相等對象存在,如果有則返回字符串池中對象的引用;如果沒有,則先在StringPool中創(chuàng)建一個相同值的String對象,然后再將它的引用返回。下面是一個例子:publicclassTestString{publicstaticvoidmain(String[]args){Strings1=newString("abc");//語句1Strings2="abc";//語句2}}執(zhí)行語句(4)后,s4和s5的引用指向的是同一個對象,即在Heap里面的內(nèi)容為abc的字符串對象。執(zhí)行語句(5)后,s5的引用指向了另外一個內(nèi)容為def的字符串對象,而s4的引用仍然指向內(nèi)容為abc的字符串對象。執(zhí)行語句(6)后,s6的引用指向了一個新創(chuàng)建的內(nèi)容為abcdef的字符串對象,而s4和s5的引用仍然指向之前的對象,即內(nèi)容分別為abc和def的字符串對象。在Java中,使用"=="來比較對象時,實際上比較的是兩個對象的內(nèi)存地址,也就是比較"=="左右兩邊的引用是否指向同一個對象。對于Java中的8種原始數(shù)據(jù)類型,"=="比較的是它們的字面值是否相同;對于引用類型,比較的是它們的內(nèi)存地址是否相同。在語句(1)(2)(3)中,由于s1、s2、s3指向不同的對象,它們的內(nèi)存地址不同,因此當執(zhí)行完語句(4)(5)(6)后,它們的結(jié)果都是false。問題5:當執(zhí)行完語句(7)(8)(9)后,它們的結(jié)果分別是什么?首先,s1指向的是在堆中第一次使用new關鍵字生成的對象。當調(diào)用intern方法時,如果StringPool已經(jīng)包含一個等于此String對象的字符串(該對象由equals(Object)方法確定),則返回指向StringPool中的字符串對象的引用。因為StringPool中已經(jīng)有內(nèi)容為abc的對象,所以ern()返回的是StringPool中內(nèi)容為abc的字符串對象的內(nèi)存地址,而s1指向的是Heap上內(nèi)容為abc的字符串對象的引用。因此,由于兩個引用指向的對象不同,所以s1==ern()的結(jié)果為false,即語句(7)結(jié)果為false。對于ern(),它還是會首先檢查StringPool中是否有內(nèi)容為abc的對象,發(fā)現(xiàn)有,則將StringPool中內(nèi)容為abc的對象的地址賦給ern()方法的返回值。因為s2和ern()方法的返回值指向的是同一個對象,所以s2==ern()的結(jié)果為true,即語句(8)結(jié)果為true。對于ern()和ern(),它們都首先檢查StringPool中是否有內(nèi)容為abc的對象,發(fā)現(xiàn)有,則將StringPool中內(nèi)容為abc的對象的地址分別賦給它們的返回值。由于兩者返回的地址都指向同一個對象,所以ern()==ern()的結(jié)果為true,即語句(9)結(jié)果為true。問題6:當執(zhí)行完語句(13)(14)(15)(16)后,它們的結(jié)果分別是什么?語句(13)中,hello=="hello",即hello引用指向的對象是StringPool中的“hello”,因此結(jié)果為true。語句(14)中,hello=="hel"+"lo",由于加號兩邊都是常量值,會組成一個新的常量值"hello"在StringPool里面,如果StringPool已經(jīng)有相同內(nèi)容的就不會再創(chuàng)建,直接返回StringPool里面的內(nèi)容為"hello"的字符串對象的內(nèi)存地址,因此結(jié)果為true。語句(15)中,hello=="hel"+lo,由于加號兩邊有一個不是常量值,會在堆里面創(chuàng)建一個新的"hello"對象,一個在StringPool中,一個在Heap中,因此結(jié)果為false。語句(16)中,h
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商鋪轉(zhuǎn)租定金合同范本
- 農(nóng)機備件采購合同范本
- 合金板材采購合同范本
- 分期買車定金合同范本
- 14商鋪認購合同范例
- 注塑QC組長年終總結(jié)
- 出租檳榔合同范本
- 渠道開發(fā)述職報告
- 汽車生產(chǎn)線操作工練習題+答案
- 人教版部編版小學語文一年級上冊人教版影子教學設計教案13
- 2022年高考(全國甲卷)語文仿真模擬卷【含答案】
- 腸瘺治療PPT醫(yī)學課件(PPT 25頁)
- 員工轉(zhuǎn)正評價表
- 道路交通事故責任認定行政復議申請書范例
- 鄭州大學圖書館平立剖面效果圖
- 高效液相含量測定計算公式
- 公安機關通用告知書模板
- 《小學數(shù)學課程與教學》教學大綱
- 《手機攝影》全套課件(完整版)
- 礦井無計劃停電停風安全技術措施
- 標前合作合同協(xié)議書范本
評論
0/150
提交評論