String构造方法与内存分析
2018-02-20 21:59
155 查看
String构造方法与内存分析
源代码public class StringTest { public static void main(String[] args) { //第一种构造方法 String str="Hello World!"; String str0="Hello World!"; String str1="Hello "+"World!"; //判断String变量内存地址是否一致,采用"=="运算符,判断内容是否一致,采用equals() //hashCode() System.out.println(str.hashCode()+":----->"+(str==str1)); //内存地址一样,指向相同 System.out.println(str0.hashCode()+":----->"+(str==str0)); //第二种构造方法 //空字符串""和空对象null不一样 //使用new关键字将会在堆中新建一个String对象 String str2=new String(); String str3=new String("Hello World!"); System.out.println(str3.hashCode()+"---->"+(str==str3)); //str3指向堆中的内容 //将堆中的对象初始化到方法区的常量池中 String str4=str3.intern(); //str4将指向常量池中的相同的已有的内容,而不会重新创建对象 System.out.println(str4.hashCode()+"---->"+(str==str4)); String[] strArray={"string","test"}; System.out.println(strArray.toString()+" "+strArray); } //NullPointerException:空指针异常 //调用相关方法时,要注意String对象不是一个空对象 public static boolean isEquals(String str){ String str1="Hello"; return str1.equals(str); //准确 //return str.equals(str1); //有风险:str可能为空字符串,将报NullPointerException异常 } }
运行结果为:
-969099747:----->true -969099747:----->true -969099747---->false -969099747---->true [Ljava.lang.String;@15db9742 [Ljava.lang.String;@15db9742
分析:
第一种构造方法:
String对象会直接加载在栈里,字符串内容变为常量存在于方法区的常量池里,并且所有内容相同的String均会指向同一个内存地址,因为为其赋初值时会先在方法区寻找是否有这个常量,如果有则指向这个常量,而不会新建常量,如果没有则在常量池里再新建一个常量。例子中的str,str0都指向常量池中同一个常量,因此使用”==”运算符时输出结果为true。
str1被创建时会新建两个常量”Hello “和”World!”,再连接在一起,然后取常量池里寻找一个相同内容,如果有,则指向已有的内容地址,之前的两个临时常量会被作为垃圾自动回收。
第二种构造方法:
使用new关键字来创建String将会在堆里面新建一个String对象,不同于方法区的常量池。
相关文章推荐
- 回顾JavaSE(4)-String(3)四行代码分析String字面值对象和构造方法对象的内存分配
- Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)
- Java内存分析(3)——String的Intern方法详解
- Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)
- JAVA进程占用高内存原因分析与优化方法
- Java之内存分析和String对象
- JVM内存状况查看方法和分析工具
- java 内存溢出分析方法
- 嵌入式软件开发培训笔记——Java第三天(方法重载、对象的构造与初始化过程分析、封装等)
- JavaSE视频学习阶段性总结 三(类的组成,定义,构造方法;对象的创建,内存模型,参数传递)
- Java之内存分析和String对象
- JAVA进程占用高内存原因分析与优化方法
- Libev源码分析08:Libev中的内存扩容方法
- java内存分析+String+equals详解
- Android使用Handler造成内存泄露的分析及解决方法
- C#中Image.FromFile(string path)函数报内存不足错误解决方法
- android studio内存分析方法
- Java中字符串String的研究 即内存分析
- JavaSE8基础 String 通过构造方法把部分一维byte数组转为字符串
- 安卓性能调优:内存使用分析和方法调用优化