理解Java中的String
1. String是如何实现的?
里面是char数组实现的,最新的版本换成了byte数组(ASCII占1位,中文的话占2位).
2. 字符串常量池
Java堆内存中一个特殊的存储区域,当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象.JDK 1.6及之前字符串常量池是存放在方法区的,JDK 1.7才开始放在堆中.
3. 为什么设计成不可变的? final修饰
- 提高String Pool的效率和安全性.
- 多线程安全
4. String,StringBuilder,StringBuffer的区别
StringBuilder和StringBuffer的核心代码逻辑都是一样的,都在父类AbstractStringBuilder里面,父类维护着一个char类型的数组,需要操作字符串数据的时候其实就是在操作这个数组里面的数据.String里面也维护着一个char类型的数组,只不过是final修饰的,任何change操作都会新创建String,而不是在原来的基础上修改.
- String是不可变的字符序列,StringBuilder和StringBuffer是可变的字符序列.
- StringBuffer是线程安全的,StringBuilder是线程不安全的.
- 速度上: StringBuilder > StringBuffer > String
5. String中的intern方法是什么含义?
intern方法可以用来声明字符串,它会从字符串常量池中查询当前字符串是否存在,存在则直接返回当前字符串;不存在就会将当前字符串放入常量池中,再返回.
6. 编译器对String做了哪些优化?
使用"+“连接常量字符串与常量字符串的时候,会将字符串全部加在一起然后存放. 如果用”+"号连接字符串与变量的时候,则是创建StringBuilder或StringBuffer来拼接.
7. "+"连接符的实现原理
先来一段简单的代码:
public class Solution {public static void main(String[] args) {int i = 10;String s = "dasdas";System.out.println(s + i);}}
javap看一下它的字节码:
public static void main(java.lang.String[]);Code:0: bipush 102: istore_13: ldc #2 // String dasdas5: astore_26: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;9: new #4 // class java/lang/StringBuilder12: dup13: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V 调用StringBuilder的构造方法16: aload_217: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 调用append方法20: iload_121: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; //调用append方法24: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; //调用toString方法27: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 调用println方法30: return
所以当字符串与其他变量相加的时候,其实会创建StringBuilder(或StringBuffer)来完成.
咱们来看另一段代码:
public class Solution {private static final String TAG = "tag";public static void main(String[] args) {String s = "dasdas" + TAG;String b = "I like " + "java";String c = s + b;}}//反编译后
public static void main(java.lang.String[]);Code:0: ldc #3 // String dasdastag 自动就给我拼接好了2: astore_13: ldc #4 // String I like java 自动拼接好了5: astore_26: new #5 // class java/lang/StringBuilder 使用StringBuilder拼接9: dup10: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V13: aload_114: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;17: aload_218: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;21: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;24: astore_325: return
可以看到,编译器在连接字符串时,需要连接的字符串都是常量,就会在编译期直接将其相加;如果需要连接的是变量,则会使用StringBuilder(或StringBuffer)进行拼接.
8. String str = new String(“abc”)创建了多少个对象?
代码的执行过程和类的加载过程不同.在类的加载过程中,确实在运行时常量池中创建了一个"abc"对象,而在代码执行过程中只创建了一个String对象.
这里String str = new String(“abc”)涉及的是2个对象.
理解Java中的String相关推荐
- 深入理解Java中的String(原地址https://www.cnblogs.com/xiaoxi/p/6036701.html)
深入理解Java中的String 一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class Stringimplem ...
- 深入理解Java中的String
一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class Stringimplements java.io.Seri ...
- 全面理解Java中的String数据类型
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...
- c++中string插入一个字符_Java内存管理-探索Java中字符串String(十二)
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 一.初识String类 首先JDK API的介绍: public final class String extends O ...
- 深入理解Java中的内存泄漏
理解Java中的内存泄漏,我们首先要清楚Java中的内存区域分配问题和内存回收的问题本文将分为三大部分介绍这些内容. Java中的内存分配 Java中的内存区域主要分为线程共享的和线程私有的两大区域: ...
- 深入理解Java中的final关键字
深入理解Java中的final关键字 http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什 ...
- java中字符流 字节流_理解Java中字符流与字节流的区别
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...
- java中demo接人_return的用法_如何理解java中return的用法?
C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...
- java 字符串是对象吗_解析Java中的String对象的数据类型
解析Java中的String对象的数据类型 2007-06-06 eNet&Ciweek 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所 ...
最新文章
- shell 字符串操作
- 3.1 神经网络概览-深度学习-Stanford吴恩达教授
- Linux基础命令---zip
- Go 语言编写 CPython 扩展 goPy
- python学习HTML之CSS(2)
- java 怎么调试到第三方库的内部,在有源码的情况下
- 三年经验java工资,含爱奇艺,小米,腾讯,阿里
- vue或js解析文件excel表格js通过插件解析表格读取文件
- Retrofit的简单使用
- 爬虫神器:一条命令下载《复仇者联盟3:无限战争》
- matlab abs()le8,《MATLAB_语言与数学运算》练习答案
- 考计算机一级应该学什么条件,计算机一级考试要求
- 15个简单的JS编码标准让你的代码更整洁
- iOS---Xcode中删除描述文件Provisioning Profiles
- Rename_suffix
- C++编程-买卖股票的最佳时机
- css改变水平线的颜色
- 红米3 android 版本升级失败,疑似官方推送错误固件 红米Note3全网通升级后变砖...
- CentOS_anydesk
- Oracle ASM存储Spfile解析
热门文章
- matlab有限差分法求解温度场,MATLAB在求解温度场中的应用
- G1实现原理之记忆集与卡表
- 09 Marr算子(LoG算法)
- locust分布式压测
- Oracle数据库删除用户和删除表空间及常见错误解决
- Android—RadioButton(单选框)和CheckBox(复选框)
- git的基本架构欣赏
- 阿克希龙电能管理系统能源管理能源统一管理,提高其效率。
- [python]TypeError: only size-1 arrays can be converted to Python scalars
- 铁四院闵阳师弟的坐标转换软件MY Coordinate Tool2.7介绍