如果以下有与Java堆栈和JVM常量池有关的可以访问下面的连接
前期记得自己学习编程语言的时候,只要能写出代码就可以。编程语言不就是写程序的吗?自己报着这种目的性很强的心态去学习,忽略了其中的精彩部分,学完C++之间学Java感觉Java中的String和C++中的没有什么区别,都是能存储大小随意变化的字符串。
如:String s="12345"; s = "0";如果是字符串数组的话那就不,感觉很方便很好用。
话不多说了,看一段代码如果能直接看出结果的你可以回头了。
package com.tzx.ne; public class Text { /** * @param args */ public static void main(String[] args) { String a = "1234561"; String a1 = new String("1234561"); String a2 = new String(); a2 = "1234561"; System.out.println(a==a1); System.out.println(a==a2); System.out.println(a1==a2); System.out.println("================="); String b = "1234561"; String b1 = "123456"; String b2 = "1"; String b4 = "123456" + 1; System.out.println(b==b4); String b5 = b1 + b2; System.out.println(b==b5); System.out.println(b4==b5); String b6 = "123456" + b2; System.out.println(b==b6); System.out.println(b4==b6); System.out.println(b5==b6); } /** * false * true * false * ================= * true * false * false * false * false * false * */ }
String类的本质是字符数组char[],其次String类是final的,是不可被继承的,String还是特殊的封装类型,使用String时可以直接赋值,也可以用new来创建对象,但是这二者的实现机制是不同的。Java运行时维护一个String池,池中的String对象不可重复,没有创建,有则作罢。
第一句String a = "12341561";是在String池当中创建一个"123461"的常量。
第二句String a1 = new String("123461");是首先在栈当中创建一个a1的引用,在堆当中创建一个String对象,其内容是"123461",而a1指向的是堆内存中这个对象的首地址。
在这里添加一点东西:Java当中比较一共有两种方式一种是a==a1,一种是a.equals(a1);前者比较的是地址,后者比较的是内容。
所以a1和a的指向不一样他们的地址也就不一样。
第三句a2 = new String();先是a2指向new的这个对象的堆中的地址空间,然后a2 = "123461";这时因为"132461"在常量池当中已经存在了,所以a2指向的是常量池当中"1234561",这时判断a和a2他们的地址必然是相等的,而a1和a2也必然是不等的。
下面主要说的是Sring的+:
第四句:b4 = "123456" + 1;因为"1234156"和1都是存储在常量池当中的,所以Java首先解析的是"1324561" + 1它的结果是一个字符串常量,在常量池当中找"1234561"如果有那就返回它的引用,如果没有那么就创建后返回该引用。结果是有的所以b==b4.
第六句和第九句分别是b5=b1+b2;b6="123456" + b2;因为String不是基础类型,所以这个时候他们返回的就不是字符串常量了,而是一个对象,对象时存储的堆当中的,所以b5和b6是指向等式后面的返回的堆中对象的地址。
Java中与String有关的且不得不说的事