zoukankan      html  css  js  c++  java
  • Javase(String类为什么是final)

    1、什么是final

    final意思是,最终,如果一个类不想被子类继承,或者不想被子类的方法重写,可以用final修饰此类,final类中的方法默认也会是final类型的。final关键字可以修饰类类的成员变量、类的成员方法、局部变量

    (1)被final关键字修饰后的变量(成员变量、局部变量)只能赋值一次,final修饰后的变量只能在这个类的内部使用,不能在类的外部直接使用

    (2)引用类型的变量值为对象地址值,赋值之后,地址不能再更改,但是地址内的对象属性值可以修改

    (3)final 标记的成员变量必须在声明的同时或在该类的构造方法中显式赋值:

    2、String类特点

    (1)String类的源码:

    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
    
        /** use serialVersionUID from JDK 1.0.2 for interoperability */
        private static final long serialVersionUID = -6849794470754667710L;

    (2)创建一个类继承String类:

     继承String类的时候报错,这是因为String类已经被声明为final是不能被子类继承的。

    3、String类为什么被声明为final的?

    (1)安全性:

    String类不能被继承,就没有办法修改该类,所以保证了该类的安全性。

    (2)效率问题:

    如果在每次使用String类的时候为了保证安全性都用final修饰,会比较麻烦降低效率,直接在类内部声明,提高了效率。

    (3)为了实现字符串常量池:

    创建字符串时,如果该字符串已经存在于池中,则将返回现有字符串的引用,而不是创建新对象(节省内存)。多个String变量引用指向同一个内地地址,如果字符串是可变的,用一个引用更改字符串将导致其他引用的值错误,这样的话字符串常量池将不能实现。

    (4)为了线程安全:

    因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。

    (5)为了实现String可以创建HashCode的不可变性:

    因为字符串是不可变的,所以在它创建的时候HashCode就被缓存了,不需要重新计算。字符串的处理速度要快过其它键的对象,这也是Map的key用String最多的原因。

  • 相关阅读:
    HTML标签(二)
    HTML 表单
    HTML列表
    HTML表格
    Critical Section Problems
    Stack, Queue and Priority Queue
    Introduction to Dynamic Set
    Introduction to Divide-and-Conquer
    Sorting Algorithms Overview
    Python学习笔记(三)数据类型
  • 原文地址:https://www.cnblogs.com/zhai1997/p/12354769.html
Copyright © 2011-2022 走看看