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 标识符的命名规则和规范关键字保留字键盘输入

让你直接嗨的2W字JAVA重点知识汇总(包含Java基础JVMJava并发)

java基础 2. 数据类型

java 基础

java基础语法(三大基础)

Java 基础语法万字解析 Java 的 String 类