Java基础001:final关键字String字符串的相加问题
Posted liushengit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础001:final关键字String字符串的相加问题相关的知识,希望对你有一定的参考价值。
1、final关键字的作用
1.1、final修饰的类:不能被其他类继承;
1.2、final修饰的方法:不能被子类重写
1.3、final修饰的变量:分两种情况,引用变量、基本类型变量,如下:
final修饰的引用变量:一旦给其赋值,就不能被再次赋值
final String s = "32"; //引用变量 s = "1"; /** 报错:The final local variable s cannot be assigned. It must be blank and not using a compound assignment */
final修饰的基本类型变量:一旦给其赋值,不能改变其值
final int i = 0; // 基本类型 i = 2; /** 报错:The final local variable s cannot be assigned. It must be blank and not using a compound assignment */
2、String字符串的相加问题
例1:
1 String str1 = "a"; 2 String str2 = "b"; 3 String str3 = "ab"; 4 String str4 = str1 + str2; 5 System.out.println(str3 == str4); //输出结果? 6 String str5 = str4.intern(); 7 System.out.println(str3 == str5); //输出结果?
第一行:"a"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str1;
第二行:"b"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str2;
第三行:"ab"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str3;
第四行:str1 + str2,当+号两边存在变量时(两边或任意一边),在编译期是无法确定其值的,所以要等到运行期再进行处理,处理方法:先new一个StringBuilder,然后append str1 和 str2,所以:str4引用变量指向的是堆中new出来的一个对象,而str3引用变量指向的是字符串池中常量"ab"的地址;
第五行:str3 == str4 比较的str3和str4的引用地址,so false;
第六行:String的intern()方法会将该对象的值转到字符串池中去,如果字符串池已有同样的值,则直接返回地址,如果没有,则在字符串池中新建一个,然后返回地址。再看此例子,显然"ab"已经在字符串池中存在了(第三行),所以str5和str3均指向字符串池中的"ab",且语法str3 == str5比较是引用地址,所以输出结输出结果为:true;
注:intern()这个方法API里的解释是:“当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串 (用equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。”
例2:
1 String str1 = "ab"; 2 String str2="a"+"b"; 3 System.out.println(str1 == str2);//输出结果?
第一行:"ab"作为一个常量存放于字符串池中,并把引用地址赋值给str1;
第二行:"a"和"b"作为两个常量相加,由于编译器优化,在编译期就将+两边拼接合并了,直接认为成是一个常量"ab",结果发现字符串池中已经有一个常量"ab"了,就直接把"ab"的引用地址赋值给了str2;
第三行:str1 == str2比较的str1和str2的引用地址,当然是一样的,so输出结果: true ;
例3:
1 final String str1 = "a"; 2 final String str2 = "b"; 3 String str3 = "ab"; 4 String str4 = str1 + str2; 5 System.out.println(str3 == str4);//输出结果?
第一行:"a"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str1; final使得变量str1被当作一个常量对待
第二行:"b"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str2; final使得变量str2被当作一个常量对待
第三行:"ab"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str3;
第四行:str1 + str2,此时+号两边都是常量哦,在编译期就可以确定其值了
即:String str4 = str1 + str2;
就等价于 String str4 = "a" + "b";
就等价于 String str4 = "ab";
第五行:str4指向常量"ab",str3指向常量"ab"(第三行),所以str3 == str4 等于true
那么现在思考个小问题:如果把第一行的final去掉,输出结果是true还是false呢?若对上述内容都理解,这个问题应该不难
提示:如果不清楚答案,请结合例1的第四行,思考一下!!
以上是关于Java基础001:final关键字String字符串的相加问题的主要内容,如果未能解决你的问题,请参考以下文章
零基础 快速学Java韩顺平 p82-86 标识符的命名规则和规范关键字保留字键盘输入