java String 常量变量

编译时替换
final String a = "hello";   //字面常量
final String b = "world";  //字面常量
String c = a+b;    //此处会在编译时直接替换成String c = "helloworld"
final String a = "hello"; //字面常量
String b = "world";    //变量
String c = a+b;    //此处会new StringBulider().append()

举例:

“” 括起来的都是字面常量 放在常量池中

public static void main(String[] args){
    String hello = "hello",lo="lo";
    String.out.print(hello == "Hello");    //true  hello引用常量池中的"hello"所以相等
     String.out.print(Other.hello == "Hello");  //true 都是引用常量池中的hello
      String.out.print(hello == "Hel"+"lo");  //true  两个常量池字符串拼接 直接相等
       String.out.print(hello == "Hel"+lo);  //false  常量+变量 =  new StringBuilder   
        String.out.print(hello == ("Hel"+lo).intern());  //true  字符串对应的常量池中的字符串(有返回引用,没有加一个返回引用)
}

public static class Other{
    public static String hello = "Hello";
}
jdk6 和 jdk7 下 intern 的区别

相信很多 JAVA 程序员都做做类似 String s = new String(“abc”)这个语句创建了几个对象的题目。 这种题目主要就是为了考察程序员对字符串对象的常量池掌握与否。上述的语句中是创建了2个对象,第一个对象是”abc”字符串存储在常量池中,第二个对象在JAVA Heap中的 String 对象。


1.将String常量池 从 Perm 区移动到了 Java Heap区

2.String#intern 方法时,如果存在堆中的对象,会直接保存对象的引用,而不会重新创建对象。

public static void main(String[] args) {
    String s = new String("1");
    s.intern();
    String s2 = "1";
    System.out.println(s == s2);

    String s3 = new String("1") + new String("1");
    s3.intern();
    String s4 = "11";
    System.out.println(s3 == s4);
}

打印结果是

  • jdk6 下false false
  • jdk7 下false true
jdk 1.6下:

“1” 直接存在perm常量池中,s 引用的是堆里面的1,s.intern() 检查常量池中有不操作,s2 引用常量池中的”1”,所以不相等。


“1” 直接存在perm常量池,s3 引用堆里面建立的”11”对象,s3.intern() 检查不存在,常量池中加入”11”,,s4 引用常量池中的”11”,所以不相等

image

jdk 1.7下: 常量池存在堆中,没有perm区了

“1” 直接存在堆中常量池中,s 引用的是堆里面的新建的”1”对象,s.intern() 检查常量池中有不操作,s2 引用常量池中的”1”,所以不相等。


“1” 直接存在堆中常量池,s3 引用堆里面建立的”11”对象,s3.intern() 检查不存在,常量池中直接引用堆中的”11”,s4 引用常量池中的”11”引用 也就引用的第一次堆中建立的”11”,也就是s3,所以相等

image

参考: https://blog.csdn.net/goldenfish1919/article/details/80410349

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值