Java String那点事

简介: String是我们平时接触最多的一种数据类型之一,不同语言有自己内部的实现,今日一起看下Java中String的内部实现。常问问题面试中常被提及的String问题String为什么是Final的?参考为什么字符串类是Final的new String("abc")创建了几个对象?String.intern()有什么用途?顺着字符串可能往下问到JVM相关的东西,一般Java开发最后都会问到JVM相关的。

String是我们平时接触最多的一种数据类型之一,不同语言有自己内部的实现,今日一起看下Java中String的内部实现。

常问问题

面试中常被提及的String问题

  1. String为什么是Final的?参考为什么字符串类是Final的
  2. new String("abc")创建了几个对象?
  3. String.intern()有什么用途?

顺着字符串可能往下问到JVM相关的东西,一般Java开发最后都会问到JVM相关的。

剖析

new String("123")与"123"的区别

当你再Idea中new String的时候,Idea会提示你,很少这样构建对象,经常这样做会导致性能的问题。这种构建方法通过拷贝一个村庄的字符串来实例化新的字符串。


img_934c9281566f5665909a804d2e3b4cb0.png
image.png

从自己码编译层面看:
String s = new String("123");
String s = "123";
编译后的字节码:


img_edf0ce12fd4966b7d1f4ee3c97e4837b.png
image.png

可以看出来new String("123")在字节码层面上多了好几条指令,多几条指令当然更费时间。
new 代表新建对象

img_036f6cef82fe712cfc9b5cbe4c9889ac.png
image.png

dup 在栈上复制栈顶的元素


img_95212fb312415969079192ad6942c8e6.png
image.png

ldc 把单个常量放到栈上


img_70e015878eb1ec901a4bf4e6778a9614.png
image.png

String.intern

大家都知道使用intern方法的时候,如果字符串常量池中不存在这个字符串,就把这个字符串放入常量池中,如果存在则直接取常量池中的对象。

实际上开发中很少使用这个方法,在动态拼接字符串的时候可能会有很多字符串不存在字符串常量池中,这个情况相对较少,有相应的场景可以使用。

最后

很多Java语言层面上的东西,在编译成字节码之后就清晰了许多,学会看java的字节码文件吧。

目录
相关文章
|
8天前
|
Java API 索引
Java基础—笔记—String篇
本文介绍了Java中的`String`类、包的管理和API文档的使用。包用于分类管理Java程序,同包下类无需导包,不同包需导入。使用API时,可按类名搜索、查看包、介绍、构造器和方法。方法命名能暗示其功能,注意参数和返回值。`String`创建有两种方式:双引号创建(常量池,共享)和构造器`new`(每次新建对象)。此外,列举了`String`的常用方法,如`length()`、`charAt()`、`equals()`、`substring()`等。
14 0
|
23天前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
24 0
|
30天前
|
Java
Java String split()方法详细教程
Java String split()方法详细教程
20 0
|
1月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类
Java StringBuffer 和 StringBuilder 类
15 0
|
1月前
|
存储 缓存 安全
【Java】Java中String不可变性的底层实现
【Java】Java中String不可变性的底层实现
9 0
|
27天前
|
Java 索引
【Java】String类常用方法总结
【Java】String类常用方法总结
20 0
|
28天前
|
SQL Java
使用java中的String类操作复杂的字符串
使用java中的String类操作复杂的字符串
9 0
|
28天前
|
存储 Java 索引
Java String类
Java String类
12 0
|
28天前
|
安全 Java 索引
Java StringBuffer 类
Java StringBuffer 类
7 0
|
1月前
|
存储 安全 Java
Java String 类
Java String 类
18 1