云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > java练习题(含答案)

java练习题(含答案)

  • 62 次阅读
  • 3 次下载
  • 2025/5/31 16:58:01

1. String str1 = \是字符串常量,它在编译期被确定,放在常量池中(共享内容值)

2. //new String()创建的字符串不放入常量池中

3. String str2 =new String(\不是字符串常量,不在编译期确定(不共享内容值)

Java代码

1. String str1 = new String(\ 2. String str2 = \

3. System.out.println(str1==str2); //false

创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。 Java代码

1. String str1 = \

2. String str2 = new String(\

3. System.out.println(str1==str2); //false

创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。

接下来我们再来看看intern()方法,它的定义如下: Java代码 1. public native String intern();

这是一个本地方法。在调用这个方法时,JAVA虚拟机首先检查String Pool中是否已经存在与该对象值相等对象存在,如果有则返回字符串池中对象的引用;如果没有,则先在String Pool中创建一个相同值的String对象,然后再将它的引用返回。

例程6: Java代码 1. public 2. 3. 4. 5. 6.

class TestString{

public static void main(String args[]){ String s1 = new String(\语句1 String s2 = \语句2

String s3 = new String(\语句3

7.

8. System.out.println(s1 == s2);//语句4 9. System.out.println(s1 == s3);//语句5 10. System.out.println(s2 == s3);//语句6 11.

12. System.out.println(s1 == s1.intern());//语句7

13. System.out.println(s2 == s2.intern());//语句8

14. System.out.println(s1.intern() == s2.intern());//语句9 15.

16. String hello = \语句10 17. String hel = \语句11 18. String lo = \语句12 19.

20. System.out.println(hello == \语句13

21. System.out.println(hello == \+ \/语句14

22. System.out.println(hello == \+ lo);//语句15

23. System.out.println(hello == hel + lo);//语句16

24. } 25.}

问题1:当执行完语句(1)时,在内存里面生成几个对象?它们是什么?在什么地方?

当执行完语句(1)时,在内存里面创建了两个对象,它们的内容分别都是abc,分别在String Pool(常量池)和Heap(堆)里。其字符串的创建过程如下:首先在String Pool里面查找查找是否有 \,如果有就直接使用,但这是本程序的第一条语句,故不存在一个对象\,所以要在String Pool中生成一个对象\,接下来,执行new String(\构造方法,new出来的对象都放在Heap里面。在Heap里又创建了一个\的对象。这时内存里就有两个对象了,一个在String Pool 里面,一个在Heap里面。

问题2:当执行完语句(2)时,在内存里面一共有几个对象?它们是什么?在什么地方?

当执行完语句(2)时,在内存里面一个对象也没有创建。当我们定义语句(2)的时候,如果我们用字符串的常量值(字面值)给s2赋值的话,那么首先JVM还是从

String Pool里面去查找有没有内容为abc的这样一个对象存在,我们发现当我们执行完语句(1)的时候,StringPool里面已经存在了内容为abc的对象,那么就不会再在String Pool里面去生成内容为abc的字符串对象了。而是会使用已经存在String Pool里面的内容为abc的字符串对象,并且会将s2这个引用指向String Pool里面的内容为abc的字符串对象,s2存放的是String Pool里面的内容为abc的字符串对像的地址。也就是说当你使用String s2 = \,即使用字符串常量(\给定义的引用(str2)赋值的话,那么它首先是在

String Pool里面去找有没有内容为abc的字符串对象存在,如果有的话,就不用创建新的对象,直接引用String Pool里面已经存在的对象;如果没有的话,就在 String Pool里面去创建一个新的对象,接着将引用指向这个新创建的对象。所以,当执行完语句(2)时内存里面一共有2个对象,它们的内容分别都是abc,在String Pool里面一个内容abc的对象,在Heap里面有一个内容为abc的对象。

问题3:当执行完语句(3)时,在内存里面一共有几个对象?它们是什么?在什么地方?

当执行完语句(3)时,其执行过程是这样的:它首先在String Pool里面去查找有没有内容为abc的字符串对象存在,发现有这个对象存在,它就不去创建 一个新的对象。接着执行new...,只要在java里面有关键字new存在,不管内容是否相同,都表示它将生成一个新的对象,new多少次,就生成多少个对象,而且新生成的对象都是在Heap里面,所以它会在Heap里面生成一个内容为abc的对象,并且将它的地址赋给了引用s3,s3就指向刚在Heap里面生成的内容为abc的对象。所以,当执行完语句(3)时,内存里面一共有3个对象,其中包含了在String Pool里面一个内容为abc的字符串对象和在Heap里面包含了两个内容为abc的字符串对象。

问题4:当执行完语句(4)(5)(6)后,它们的结果分别是什么?

在java里面,对象用\永远比较的是两个对象的内存地址,换句话说,是比较\左右两边的两个引用是否指向同一个对象。对于java里面的8种原生数据类型来说,\比较的是它们的字面值是不是一样的;对应用类型来说,比较的是它们的内存地址是不是一样的。在语句(1)(2)(3)中,由于s1、s2、s3指向不同的对象,它们的内存地址就不一样,因此可以说当执行完语句(4)(5)(6),它们返回的结果都是false。

问题5:当执行完语句(7)(8)(9)后,它们的结果分别是什么?

首先,s1这个对象指向的是堆中第一次new...生成的对象,当调用 intern 方法时,如果String Pool已经包含一个等于此 String 对象的字符串(该对象由equals(Object)方法确定),则返回指向String Pool中的字符串对象的引用。因为String Pool中有内容为abc的对象,所以s1.intern()返回的是String Pool中的内容为abc的字符串对象的内存地址,而s1却是指向Heap上内容为abc的字符串对象的引用。因而,两个引用指向的对象不同,所以,s1 ==

s1.intern() 为false,即语句(7)结果为false。 对于s2.intern(),它还是会首先检查String Pool中是否有内容为abc的对象,发现有,则将String Pool中内容为abc的对象的地址赋给s2.intern()方法的返回值。因为s2和s2.intern()方法的返回值指向的是同一个对象,所以,s2 == s2.intern()的结果为true,,即语句(8)结果为true。

对于s1.intern(),它首先检查String Pool中是否有内容为abc的对象,发现有,则将String Pool中内容为abc的对象的赋给s1.intern()方法的返回值。对于s2.intern(),首先检查String Pool中是否有内容为abc的对象,发现有,则将String Pool中内容为abc的对象的地址赋给s2.intern()方法的返回值。因为两者返回的地址都指向同一个对象,所以,s1.intern() == s2.intern()的结果为true,,即是语句(9)结果为true。

因此,当执行完语句(7)(8)(9)后,它们的结果分别是false、true、true。

问题6:当执行完语句(13)(14) (15)(16)后,它们的结果分别是什么?

hello == \引用hello指向的对象就是String Pool中的“hello”,即语句(13)的结果为true。

hello == \当加号两边都是常量值时,就会组成一个新的常量值\在String Pool里面,如果String Pool已经有相同内容的就不会再创建,则直接返回String Pool里面的内容为\的字符串对象的内存地址,所以,hello == \结果为true。

hello ==\当加号两边有一个不是常量值,会在堆里面创建一个新的\对象,一个在String Pool中,一个在Heap中,故输出false 。 hel + lo 同上,输出false。 因此,当执行完语句(7)(8)(9)后,它们的结果分别是true、true、false、false。

例程7: Java代码 1. String s1 = \

2. String s2 = new String(\ 3. String s3 = new String(\

4. s2.intern();//虽然执行了s2.intern(),但它的返回值没有赋给s2

5. s3 = s3.intern();//把String Pool中“abc”的引用赋给s3 6. System.out.println(s1 == s2);

7. System.out.println(s1 == s2.intern()); 8. System.out.println(s1 == s3);

运行结果如下: false true true

搜索更多关于: java练习题(含答案) 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

1. String str1 = \是字符串常量,它在编译期被确定,放在常量池中(共享内容值) 2. //new String()创建的字符串不放入常量池中 3. String str2 =new String(\不是字符串常量,不在编译期确定(不共享内容值) Java代码 1. String str1 = new String(\ 2. String str2 = \ 3. System.out.println(str1==str2); //false 创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。 Java代码 1. String str1 = \ 2. String

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com