0
点赞
收藏
分享

微信扫一扫

Java中与String有关的且不得不说的事


如果以下有与Java堆栈和JVM常量池有关的可以访问下面的连接

​​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是指向等式后面的返回的堆中对象的地址。


举报

相关推荐

0 条评论