您的当前位置:首页正文

java string 的内存运算模型,求下面的内存运算,感觉和自己以前了接的有所不一样,求求解。

2014-12-12 来源:二三娱乐

有网友碰到这样的问题“java string 的内存运算模型,求下面的内存运算,感觉和自己以前了接的有所不一样,求求解。”。小编为您整理了以下解决方案,希望对您有帮助:

解决方案1:

你了解的什么样?

解决方案2:

String a ="a";
String b = "b";
String ab = "ab";

String d = new String("ab"); //在堆内存中新开辟了一块空间 存放 ab

String c = a + b; //此处也相当于new
System.out.println(ab ==c); 所以此处为fasle

System.out.println(d == ab); //false
System.out.println(d == c); //false

c ="a" + "b"; //字符串本身拼接,得到字符串ab,他会现在内存中找ab,如果存在就交给c,如果不存在ab就new
System.out.println(ab ==c);//所以为true
System.out.println(ab ==c);
}

解决方案3:

String这个类比较特殊,他有一个自己的String池。
原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。比如你的 "a"+"b"
原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。比如你的 a+b

就是说 你 a="aabb"; 打印 a=="aabb" 和 a=="aa"+"bb" 为真。打印a== new String("aaaa")为假
String aa="aa";String bb="bb";打印a==aa+bb也为假

显示全文