专栏首页CherishTheYouthJava基础笔记之String相关知识

Java基础笔记之String相关知识

(二)String

  • Sring 被声明为 final ,因此不可被继承。
  • String的不可变性 看String的定义(java9版本):
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { 
        /** value为存储TSring字符的字符数组 */
        private final byte[] value; 
        /** 使用Coder标识使用哪种编码 **/ 
        private final byte coder;
}

value被声明为final类型,这意味着 value 数组初始化之后就不能再引用其它数组,并且 String 内部没有改变 value 数组的方法,因此可以保证 String 不可变。

  • 不可变的好处:

  • 可以缓存 hash 值: 因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。
  • String Pool 的需要: 如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。如下图:

我的理解:比如说 String myName = "Cherish";这个Cherish字符串一旦被创建,就会存到内存上某个地址如 0x58 处,然后这个字符串会被放到String Pool中,之后你再传建一个 String yourName = "Cherish",那么,这个yourName将不会重新分配一块内存并把Cherish存进去,而是,直接指向前面创建的 “Cherish”的内存,以后无论你创建多少个 “Cherish”字符串,他都是指向最初的那个“Cherish”的地址。如下图:

另一边,如果我改变myName的值,则原来保存的值不会改变,而只会另外开辟一块空间,把改变后的字符串存进去,如下图:

  • 安全性: String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。
  • 线程安全: String 不可变性天生具备线程安全,可以在多个线程中安全地使用。
String、StringBuffer and StringBuilder(面试考察点,待深入研究)
1.可变性
  • String 不可变
  • StringBuffer 和 StringBuilder 可变

2.线程安全

  • String 不可变,因此是线程安全的
  • StringBuilder 不是线程安全的;
  • StringBuffer 是线程安全的,内部使用 synchronized 进行同步;
StringPool (面试考察点 new String(“xxx”)和 直接 = “xxx”的区别)

  • 字符串常量池(String Pool)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定。不仅如此,还可以使用 String 的 intern() 方法在运行过程中将字符串添加到 String Pool 中。
  • 当一个字符串调用 intern() 方法时,如果 String Pool 中已经存在一个字符串和该字符串值相等(使用 equals() 方法进行确定),那么就会返回 String Pool 中字符串的引用;否则,就会在 String Pool 中添加一个新的字符串,并返回这个新字符串的引用。
  • 创建字符串变量的方式:

  1. String str = new String("Cherish"); 以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"Cherish"这个对象,若不存在则会在实例池中创建"Cherish"对象,同时在堆中创建"Cherish"这个对象,然后将堆中的这个对象的地址返回赋给引用str,若实例池存在则直接在堆中创建"test"这个对象,然后将堆中的这个对象的地址返回赋给引用str。
  2. String str = "Cherish"; 以这种方式赋值时,JVM会先从String Pool中查询是否存在"Cherish"这个对象,如果存在,直接把String Pool中"Cherish"的地址返回给str。如果不存在,则会在String Pool中创建"Cherish"对象,并把String Pool中该对象的地址返回给str。

final关键字(拓展)

final关键字:在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局?> 部变量):

  • 修饰类: 修饰类当用final去修饰一个类的时候,表示这个类不能被继承

注意: a. 被final修饰的类,final类中的成员变量可以根据自己的实际需要设计为fianl。 b. final类中的成员方法都会被隐式的指定为final方法。

  • 修饰方法: 被final修饰的方法不能被重写 使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。 因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。 一个类的private方法会隐式的被指定为final方法
  • 修饰变量:
  • 当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;
  • 如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象(也就是地址不能改变)了,但该引用所指向的对象的内容是可以发生变化的;
  • final修饰一个成员变量(属性),必须要显式初始化;
  • final变量和普通变量的区别: 一段代码:
public class Test { 
    public static void main(String[] args)  { 
        String a = "hello2";   
        final String b = "hello"; 
        String d = "hello"; 
        String c = b + 2;   
        String e = d + 2; 
        System.out.println((a == c)); //true
        System.out.println((a.equals(e))); //true
        System.out.println((a == e)); //false
    } 
} 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 编程之美求二进制数中1的个数

    对于一个字节(8bit)的变量,求其二进制中“1”的个数,要求算法的执行效率尽可能地高。

    算法与编程之美
  • 算法 | 广度优先遍历BFS

    BFS算法,也称作广度优先搜索算法。是一种图形搜索演算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点,如果发现目标,则演算终止。(百度百科)

    算法与编程之美
  • 数据结构|单例类

    要知道什么是单例类,首先就得清楚什么是单例模式。单例模式,是一种简单的常用软件设计模式,在程序运行中有且只有一个实例。既应用该模式的一个类只能有一个对象实类,这...

    算法与编程之美
  • 走进Java接口测试之AOP统一日志记录

    上一文走进Java接口测试之日志框架Logback中,介绍了目前接口测试框架中常见的 logback 日志框架的整合知识。在很多时候,我们在开发一个测试框架时,...

    高楼Zee
  • Android Gradle系列-入门篇

    接下来的一段时间会对Android Gradle的相关知识进行梳理,所以借此整理成一个系列。如果你是刚入行的新秀,那么这个系列将会非常适合你,因为Android...

    Rouse
  • 深度学习实战 fashion-mnist数据集预处理技术分析

    fashion-mnist数据集以四个gzip格式的方式存储在远程服务器上,利用keras的get_file()下载到本地的keras缓存目录。

    算法与编程之美
  • 程序猿怎样写出让别人无法维护的代码?

    总之,我们的口号是—— Write Everywhere, Read Nowhere

    极乐君
  • Python基础 | 你应该掌握的generator (一)

    如果你能够很快的看出区别,那么恭喜你,你的python基础非常的扎实,如果不能,那么本文对于你来说就非常有价值。

    算法与编程之美
  • 数据结构|希尔排序

    希尔排序是插入排序的一种,是直接插入排序算法的一种更高效的改进版。(学习希尔排序之前需要了解插入排序)。

    算法与编程之美
  • 谈一谈|Win10下安装和使用Linux系统Ubuntu

    3.先点击‘启用或关闭windows功能’,再勾选‘适用于Linux的windows子系统’。

    算法与编程之美

扫码关注云+社区

领取腾讯云代金券