JAVA中STRING为什么用FINAL修饰
STRING为什么要用final修饰?
首先:我们先了解一下final关键字的作用
-
final修饰为基本数据类型:如果修饰的是基本数据类型,则该数据类型为常量,该值无法修改。如final int a = 1;
-
final修饰一个引用
-
如果引用为引用数据类型,比如对象,数组,则该对象,数组本身可以修改,但指向该对象或者数组的地址的引用不能修改,final int[] a = {1,2}也是属于引用数据类型
-
如果引用时类的成员变量,则必须当场赋值,否则编译会报错,如
-
class A{
-
private final aa;//没赋值,会报错,private final aa = "12";应该这样;
-
}
-
用来修斯一个方法
-
当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承,如:
-
class Person {
-
public final void say() {
-
System.out.println("说....");
-
}
-
public void eat() {
-
System.out.println("吃...");
-
}
-
}
-
class Teacher extends Person {
-
//1. final修饰的方法不能被重写,但此方法仍然被继承
-
/*@Override
-
public void say() {
-
System.out.println("老师在一本正经的说...");
-
}*/
-
-
public void eat() {
-
System.out.println("老师在大口大口的吃...");
-
}
-
}
-
public class Demo02 {
-
public static void main(String[] args) {
-
Teacher t = new Teacher();
-
t.say();
-
}
-
}
-
final修饰类,表示类不能被继承,用网上一句话,就是断子绝孙类
其次,为什么STRING要用FINAL修饰
-
FINAL在STRING中修饰了类和一个char型数组,如下:
-
public final class String
-
implements java.io.Serializable, Comparable<String>, CharSequence {
-
/** The value is used for character storage. */
-
private final char value[];
-
-
/** Cache the hash code for the string */
-
private int hash; // Default to 0
-
根据定义可知STRING是不可变的,不可变有以下两点点组成
-
STRING类中的数据由一个private final char value[];,该数组由final修饰,表示该数组指向的地址不可变
-
value由private修饰,说明该值只能被该类所改变,不能被其他继承下去的类改变,所以STRING的不可变性就由此产生
-
为了安全,用了FIANL修饰STRING,不可被继承
-
不可变的好处
-
可以实现字符串池,在变量池中,多个字符串对象的应用可以放心指向一个STRING实例,因为这个实例不可变,所以可以放心使用
-
,因为字符串是不可变的,所以字符串是线程安全的
-
字符串不可变,所以它在创建的时候,HASHCODE就被缓存了,这就使得字符串很适合坐MAP的KEY,因为MAP的KEY是要根据HASHCODE去找桶,根据桶再去equals对象。
STRING的面试题
-
STRING为什么用FINAL修饰,为了安全,本篇上半部分已经介绍
-
STRING用SUBSTRING为什么是新建的,这个也是因为STRING是不可变性,比如“aa”.subString(0,1)="a",因为"aa"在常量池中已经存在,且不可变,所以就需要在新建一个对象"a",subString源码为
-
public String substring(int beginIndex, int endIndex) {
-
if (beginIndex < 0) {
-
throw new StringIndexOutOfBoundsException(beginIndex);
-
}
-
if (endIndex > value.length) {
-
throw new StringIndexOutOfBoundsException(endIndex);
-
}
-
int subLen = endIndex - beginIndex;
-
if (subLen < 0) {
-
throw new StringIndexOutOfBoundsException(subLen);
-
}
-
return ((beginIndex == 0) && (endIndex == value.length)) ? this
-
: new String(value, beginIndex, subLen);
-
}

浙公网安备 33010602011771号