zoukankan      html  css  js  c++  java
  • 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”;  //字符串常量相加,会在字符串常量池找,有则返回没有则在字符串常量池创建
  • 相关阅读:
    软件架构师是如何工作
    安装flume由于HBASE出现的错误
    学习记录(Python集合)
    bzoj4199: [Noi2015]品酒大会
    清橙A1484
    codeforces 232D Fence
    bzoj2337: [HNOI2011]XOR和路径
    bzoj3143: [Hnoi2013]游走
    codeforces 235 B. Let's Play Osu!
    bestcoder单调区间
  • 原文地址:https://www.cnblogs.com/wl889490/p/12577913.html
Copyright © 2011-2022 走看看