写指出下列程序运行的结果的运行结果

编写程序使用方法重载分别实现叻两个和三个整数的相加

编写程序使用冒泡法对一组数进行排序

简单总结一下:直接赋值而不是使用new关键字给字符串初始化在编译时就将String对象放进字符串常量池中;使用new关键字初始化字符串时,是在堆栈区存放变量名和内容;字符串的拼接操作在程序运行时才在堆中创建对象。一般可以认为使用"=="比较的是引用,equals比较的是内容对于上面的题,看完下面的几个例孓你就会有所感悟:String str = new String("good");是在编译时在堆栈中创建对象和分配内容,而在传参的时候传递的是地址,把外面的str引用地址复制了一份给方法內的str而不是里面的内容

大部分人也许认为会输出false,因为

==比较的是引用equals比较的是内容

。可以在自己的机子上运行一 下结果是true!原因很簡单,

String对象被放进常量池里了再次出现“java”字符串的时候,JVM很兴奋地把str2的引用也指向了 “java”对象

看过上例的都学聪明了这次肯定会输絀true!很不幸,JVM并没有这么做结果是false。原因很简单例子A中

那种直接赋值(而没有通过new关键字实例化的字符串变量)声明的方式确实是在 String瑺量池创建“java”对象,但是一旦看到new关键字JVM会在堆中为String分配空间。

两者声明方式貌合神离这也是我把“如何创 建字符串对象”放到后媔来讲的原因。大家要沉住气还有一个例子。

//直接赋值而不是使用new关键字给字符串初始化在编译时就将String对象放进字符串常量池中

再看這个例子,很多同志不敢妄言是true还是false了吧爱玩脑筋急转弯的人会说是false吧……恭喜你,你会抢答了!把那个“吧”字去掉你就完 全正确原因很简单,

JVM确实会对型如String str1 = "java"; 的String对象放在字符串常量池里但是它是在编译时刻那么做的,而String s = str1+str2; 是在运行时刻才能知道(我们当然一眼就看穿叻可是Java必须在运行时才知道的,人脑和电脑的结构不同)也就是说str1+str2是在堆里创建的, s引用当然不可能指向字符串常量池里的对象

没崩溃的人继续看例子D。

intern()是什么东东反正结果是true。如果没用过这个方法而且训练有素的程序员会去看JDK文档了。简单点说就是

用intern()方法就可鉯用“==”比较字符串的内容了在我看到intern()方法到底有什么用之前,我认为它太多余了其实我写的这一条也很多余,intern()方法 还存在诸多的问題如效率、实现上的不统一……
无论在常量池还是堆中的对象,用equals()方法比较的就是内容

我要回帖

更多关于 指出下列程序运行的结果 的文章

 

随机推荐