《Java 底层原理》String字符串详解

前言

Java 字符串底层是如何存储的,如何提高性能的,今天就来好好了解一下。

字符串的存储结构

Jvm 有专门的字符串常量池用于存放字符串,存放字符串的数据结构是HashTable。

HashTable的数据结构如下:

看个案例:

public class StringDemo {
    public static void main(String[] args) {
        String a = "11";
        String b = new String("11");

        System.out.println("a的HashCode:" a.hashCode());
        System.out.println("b的HashCode:" b.hashCode());

        System.out.println("a==b :" (a==b));   // 比较的指针地址
        System.out.println("a.equals(b) :"  a.equals(b));   // 比较的是hashCode
    }
}

运行结果:

通过案例我们来详细说明一下,Jvm如何创建一个String字符串的。

String 字符串会创建多少个Oop(Oop 是指Java 对象在Jvm中的存在形式)?

String a = "11";

我们可以通过idea 来看创建了多少个Oop。

调式字符串赋值后。 char[] 和 String 都加一了。

说明创建了两个Oop

char[] 对应 TypeArrayKlass

String  对应  TypeArrayOopDesc

画图说明字符串在Jvm 中的存在形式:

String a = new String ("11");   -- 创建了3和Oop

再来看一下String 拼接的案例

public class StringDemo2 {
    public static void main(String[] args) {
        String s1 = "1";
        String s2 = "2";
        String s3 = s1 s2;
        String s4 = "12";
        System.out.println("s3 == s4: " (s3 == s4));
    }
}

运行结果:

拼接字符串的实现原理用一句话完美解释:

new StringBuilder(s1).append(s2).toString();    // toString 方法中有一个new String的逻辑。

并且拼接后的字符串是不放入常量池的。 看看toString 的源码

public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
}

new String(value, 0, count) ,这种方式创建的String 不放入常量池。

那有什么方式可以将拼接的字符串放入常量池吗?答案是肯定的。

public class StringDemo2 {
    public static void main(String[] args) {
        String s1 = "1";
        String s2 = "2";
        String s3 = s1 s2;
        s3.intern();       // 将拼接的字符串放入常量池
        String s4 = "12";
        System.out.println("s3 == s4: " (s3 == s4));
    }
}

intern 方法就是将拼接的字符串放入常量池。

再来看一个案例:

public class StringDemo2 {
    public static void main(String[] args) {
        final String s1 = "1";
        final String s2 = "2";
        String s3 = s1 s2;
        String s4 = "12";
        System.out.println("s3 == s4: " (s3 == s4));
    }
}

运行结果:

原因是s1,s2 都是final修饰,表示不会变,那么String s3 = s1 s2; 其实也不会变,所以和 s3 = “12” 等价。

总结

String 字符串对应数据存放在字符串常量池。

拼接字符串实际就是StringBuilder 拼接。

final 修饰的情况。

intern 方法的作用是 将字符串加入常量池。

来源:https://www.icode9.com/content-1-878401.html

(0)

相关推荐

  • Java基础知识面试题(2020最新版)

    文章目录 Java概述 何为编程 什么是Java jdk1.5之后的三大版本 JVM.JRE和JDK的关系 什么是跨平台性?原理是什么 Java语言有哪些特点 什么是字节码?采用字节码的最大好处是什么 ...

  • 科技·Kotlin从入门到精通,基本数据类型

    Kotlin的基本数值类型包括Byte.Short.Int.Long.Float.Double等.不同于Java的是,字符不属于数值类型,是一个独立的数据类型.类型位宽度Double64Float32 ...

  • 字符串

    原文链接http://zhhll.icu/2020/06/14/java%E5%9F%BA%E7%A1%80/%E5%AD%97%E7%AC%A6%E4%B8%B2/java%E5%9F%BA%E7% ...

  • java 面向对象编程

    什么是面向对象 回顾方法的定义与调用 方法的定义 import java.io.IOException; //Demo01 类 public class Demo01 { //main方法 publi ...

  • Java学习_Java核心类

    字符串和编码 字符串在String内部是通过一个char[]数组表示的,因此,可以按下面的写法: String s2 = new String(new char[] {'H', 'e', 'l', ' ...

  • Java字符串详解

    字符串即字符的组合,在Java中,字符串是一个类,所以我们见到的字符串都是对象. 常见创建字符串手段: 每当有一个字面值出现的时候,JVM虚拟机就会创建一个字符串 调用String的构造方法创建一个字 ...

  • 透视干货!透视原理及画法详解你知道多少?

    透视原理及画法 ​ ​ 透视原理及画法 ​ ​ 透视原理及画法 ​ ​ 透视原理及画法 ​ ​ 透视原理及画法

  • 透视干货!先码!!手绘街景中透视原理及画法详解 !

    透视干货!先码!!手绘街景中透视原理及画法详解 !

  • 永磁同步电动机的原理与结构详解

    近些年永磁同步电动机得到较快发展,其特点是功率因数高.效率高,在许多场合开始逐步取代最常用的交流异步电机,其中异步启动永磁同步电动机的性能优越,是一种很有前途的节能电机. 1 永磁同步电动机 永磁同步 ...

  • HSL调色原理及案例详解

    HSL调色原理及案例详解

  • 高光白色阴影黑色原理及案例详解

    高光白色阴影黑色原理及案例详解

  • 除尘器分类及工作原理动图详解,一文在手,掌握所有!

    除尘器是通风除尘系统重要设备之一.除尘器工作的好坏将直接影响到车间.厂区,甚至居民区的环境卫生.掌握了除尘器的分类及工作原理才能够更好的选择和使用除尘器! 一.过滤式除尘器 袋式除尘器的形式.种类很多 ...

  • 他山之石:三元九星风水原理及案例详解

    赣南杨公赖公风水 赖布衣风水研究院,阳宅.阴宅堪舆.公司.商业风水调理. 28篇原创内容 公众号 在风水理气中,二十四山空位是个十分重要的概念.如全无所知.或一知半解.或概念模糊,在立向布局时就很容易 ...

  • 地暖热水交换器是什么 地暖热水交换器工作原理介绍【详解】

    寒冷的冬季即将到来,因此,家庭对热水的需求量也逐渐增多,那么如何方便快捷的使用热水呢?下面小编就为大家推荐一款地暖热水交换器,它可以极大程度上满足我们对热水的需求,让我们一起来看一下吧. 它有一交换罐 ...