我们往往一直半解,我们知道stack中有String池,可是不知道为什么有了线程池就能使String类的对象表现出基本数据类型的特征(多重引用其中一个引用改变了值另外几个引用的值并没有改变),我们也不知道到底new一个String和用"='a'"创建一个String对象到底有什么区别?我们不清楚包装类到底是怎么回事,他们和String类型有什么相似和不同之处?
如果,上面的问题您都能很清晰,那么没有必要浪费你宝贵的时间继续看了。否则,请允许我把我一点理解分享给大家,跟着我继续往下走!
这是我自己画的图:
跟着我来读这个图:
String的new和"='a'"的区别:
如果String str=new String("aaa");JVM在heap中开辟String内存空间后,在stack中寻找是否已经有"aaa"存在。若不存在,分两步走:
1、就在stack中创建一个"aaa"数组array,然后再heap中创建一个String o;(单独的,不同于str),让o中的char[]指向array首地址,再将array绑定o对象地址
2、将str中的char[]地址指向o中的char[]指向的对象,即将str中的char[]直接指向array首地址
如果"aaa"已经存在,很好办,通过array找到o,然后执行第二步就好。
这样就造成一种假象,没new一String都会重新非配char[]内存,实际不是如此。之所以有这种错觉,是因为每new一个String 索引str所指向的地址不同而已。
如果是String str="aaa";如果stack中没有"aaa"的数组,那么将和上面步骤1中进行同样的操作,只不过2步骤不同:不是单独在heap中开辟一块String的空间了,而是所有的对象的索引str都直接指向第1步中创建的o。
String和普通包装类的区别:
普通包装类只有部分值存在类似String中o对象(如Integer是-128~127),另外的值不管是new还是用=都是重新在heap中开辟空间,尽管最终heap中的的索引也是指向stack中的同一内存区域(栈中不会有int的两个相同值,不过可以有两个相同值的索引)。
上代码:
public class HeapDemo {
public static void main(String args[]){
Integer i=new Integer(2);
Integer j=new Integer(2);
System.out.println(j.intValue()==j.intValue());//true
System.out.println(i==j);//false
Integer h=10;
Integer k=10;
System.out.println(h==k);//true
Integer u=new Integer(1001);//超过缓存范围
Integer uu=new Integer(1001);
System.out.println(u.intValue()==uu.intValue());//true
System.out.println(uu==u);//false
Integer q=1000;//超过缓存范围
Integer qq=1000;
System.out.println(q==qq);//false
String r=new String("bbb");
String rr=new String("bbb");
System.out.println(r.charAt(0)==rr.charAt(0));//true
System.out.println(r==rr);//false
String s="aaa";
String ss="aaa";
System.out.println(s==ss);//true
}
}
- 大小: 90.5 KB
分享到:
相关推荐
博文链接:https://robinwu.iteye.com/blog/146012
StringUtil工具类java学习的好东西!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input ...
Delphi中复制带有String的记录结构时不能使用Move之类的内存操作函数.mht
c++结构体string无法用malloc分配内存,需要用用new来分配内存,malloc不会调用结构函数,结构体内的string不定长,不能动态分配内存。
JNI处理String[]等特殊类型的数据,别处绝对中不到的
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。...
String工具类String工具类String工具类
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。...
该资源主要介绍了android数组资源string-array integer-array的用法 包括int类型、string类型、文件类型的使用
设计string类 要求: 1、为该类定义构造函数,析构函数和赋值操作。...3、利用该string类完成测试程序:统计一个文本文件中所有包含给定子串的单词,并按字典序无重复的打印输出这些单词 4、程序有充分的注释
刚学数据结构感觉特别难,对第一个任务编写一个自定义的string类,搞的焦头烂额的。好不容易做出来,在此分享一下,里面还有老师的示例!呵呵,有意者来看看,顺便帮我改进一下!
Synthetic_Chinese_String_Dataset 中文识别数据集 1 for https://gitee.com/chenyang918/Lets_OCR
string类,MFC,string类中英文文档,绝对真实,玩的就是真实
Synthetic_Chinese_String_Dataset 中文识别数据集 1 for https://gitee.com/chenyang918/Lets_OCR
创建string对象过程的内存分配&&包含多个例子,更加容易理解~~
介绍java中String类的方法,String类实例的创造
StringExtension 帮助类字符串转换
Delphi中复制带有String的记录结构时不能使用Move之类的内存操作函数 .mht
其中还关注了深拷贝的问题(由于string类中涉及内存资源的管理,而默认的拷贝构造函数或是赋值重载只能实现浅拷贝,因此在该类中应自己编写拷贝构造函数和赋值重载)、流插入操作符重载对于字符串中的空格输出的问题...