浅谈String创建对象与String的intern()方法
2018-03-21 21:08
411 查看
1.String创建对象的方式
String a ="123";
如果常量池中有这个字面值的话,直接将a指向常量池中的这个值;否则,创建一个123,并将a指向他
String a =new ("123");
如果常量池中有这个对象的话,则在堆中也会创建一个对象;如果常量池中没有的话,在推中创建出这个对象的同时,在池中也会添加这样一个字面值。
2.String的intern方法
在String对象维持的一个私有池里面存放的字符串“123456789123456789123456789”可能只有一个,因为每次比对都是一样,所以是不会将这样的对象重复放到池里面的,所以调用intern()方法就是完成的这个功能,其返回的只是里面的同一个字符串,而没有创建新的字符串,所以不会占用太多的空间
String a ="123";
如果常量池中有这个字面值的话,直接将a指向常量池中的这个值;否则,创建一个123,并将a指向他
String a =new ("123");
如果常量池中有这个对象的话,则在堆中也会创建一个对象;如果常量池中没有的话,在推中创建出这个对象的同时,在池中也会添加这样一个字面值。
2.String的intern方法
// jdk1.6 // false、true、false、true、false、true // jdk1.7 // false、true、true、true、false、true // jdk1.8 // false、true、true、true、false、true String str1 = new StringBuffer("ja").append("va").toString(); String intern1 = str1.intern(); System.out.println(intern1 == str1); System.out.println(intern1.equals(str1)); String str2 = new StringBuffer("我是").append("中国人").toString(); String intern2 = str2.intern(); System.out.println(intern2 == str2); System.out.println(intern2.equals(str2)); String str3 = new StringBuffer("我是").append("中国人").toString(); String intern3 = str3.intern(); System.out.println(intern3 == str3); System.out.println(intern3.equals(str3)); /** * "java"字符串常量比较特殊,它是固定存在字符串常量池中,所以都是返回了false * Java6中字符串常量池是在永久代区,intern方法会将首次遇到的字符串复制到那里,返回的也是永久代中这个字符串的引用。不建议使用这个方法。 * Java7中字符串常量池被放到了堆中,intern的实现也不再是复制实例,只是在常量池中记录首次出现的实例引用。 * Java8同7一致 */代码解释:(1)java1.6str1、str2和str3都是指向堆内存的地址;intern1、intern2和intern3都是指向永生代的常量池地址;所以,“==”的地址比较肯定都是false,但是equals比较的都是内容,所以都是true;(2)java1.7str1、str2和str3都是指向堆内存的地址由于“java”字符串的特殊性,intern1指向的常量池的地址,所以第一个地址的比较就是false;intern2和str2都是指向同一块堆地址,所以第二个地址的比较就是true;由于str3的字符串已经在常量池中存在,所以intern3就和intern2、str2的地址保持一致;3.intern方法的作用
在String对象维持的一个私有池里面存放的字符串“123456789123456789123456789”可能只有一个,因为每次比对都是一样,所以是不会将这样的对象重复放到池里面的,所以调用intern()方法就是完成的这个功能,其返回的只是里面的同一个字符串,而没有创建新的字符串,所以不会占用太多的空间
相关文章推荐
- String对象的创建及intern()方法
- 浅谈JavaScript中的String对象常用方法
- 字符串与正则表达式1、字符串 String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象,其方法ToString对性能的提高并非很显著。
- 1105 Java中String字面值对象和构造方法创建对象的区别
- String字面值对象和构造方法创建对象的区别:String s = new String("hello")和String s = "hello";的区别
- java面试题:String字面值对象和构造方法创建对象的区别
- java中创建String类型对象的两种方式以及在使用equals()和“==”两种方法时的区别
- 理解String的不同创建方式及intern()方法的作用
- java中String对象的intern方法
- String字面值对象和构造方法创建对象的区别的两个有关==和equals的面试题。
- 【Java面试题】18 java中数组有没有length()方法?string没有lenght()方法?下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
- 常见对象_String字面值对象和构造方法创建对象的区别
- string对象的2种创建方法比较
- JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组
- 浅谈JavaScript中的String对象常用方法
- String 对象的几种创建方法和它的特殊性
- 【Java学习笔记】String对象的不变性和intern()方法——基于Java SE8
- Java中String对象的intern()方法
- 关于java基础类型与引用类型内存存储问题,以及string.intern()方法(String两种创建方式的区别)
- 对象的创建、使用及向String对象添加方法(prototype的使用)