jdk1.7后字符串的总结

public class InternDifference{
    public static void main(String[] args){
      String s = new String("a");//会在堆上创建一个对象,如果字符串常量池没有,也会在常量池创建一个对象,有则不会
      s.intern();//直接返回常量池中相应字符串的引用 因为上面new时在常量池也创建过了
      String s2 = "a";
      System.out.println(s == s2);  //false 因为s还是指向堆中的对象的地址,s2指向常量池中的地址   如果是s.intern()=s2就是true了
      String s3 = new String("a") + new String("a");
      s3.intern();//“aa”在常量池中没有,所以在常量池保存当前这个字符串的引用地址,并返回该引用地址
      String s4 = "aa";  //指向常量池保存的那个引用,也就是指向同一个地址
      System.out.println(s3 == s4);  //true
  }
}
String.intern()方法是一种手动将字符串加入常量池中的方法,原理如下:如果在常量池中存在与调用intern()方法的字符串等值的字符串,就直接返回常量池中相应字符串的引用,否则在常量池中复制一份该字符串,并将其引用返回(Jdk7中会直接在常量池中保存当前字符串的引用);Jdk6 中常量池位于PremGen区,大小受限,不建议使用String.intern()方法,不过Jdk7 将常量池移到了Java堆区,大小可控,可以重新考虑使用String.intern()方法,但是由对比测试可知,使用该方法的耗时不容忽视,所以需要慎重考虑该方法的使用;String.intern()方法主要适用于程序中需要保存有限个会被反复使用的值的场景,这样可以减少内存消耗,同时在进行比较操作时减少时耗,提高程序性能。
 另外 String s3 = str1 + str2;  //因为str1 ,str2为字符串对象,所以会用strinfbuffer,会new对象,所以是在堆上创建对象
 String s3 = “123” + “345”;  //字符串常量相加,会在字符串常量池找,有则返回没有则在字符串常量池创建
posted @ 2020-03-26 22:21  北城cheng  阅读(289)  评论(0编辑  收藏  举报