java String 常量变量

Posted mangues

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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”,所以不相等

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

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


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

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

以上是关于java String 常量变量的主要内容,如果未能解决你的问题,请参考以下文章

java中的常量和变量

java 类字面常量,泛化的Class引用

Java SE——java语言编程练习格式化字符和常量

Java语言基础_类型和运算——字面量和常量

Java编程进阶常量变量及作用域

JavaSE学习总结——Java语言编程练习格式化字符与常量