《Java程序猿面试笔试宝典》之字符串创建与存储的机制是什么
在Java语言中。字符串起着非常关键的数据。字符串的声明与初始化主要有例如以下两种情况:
(1) 对于String s1=new String(“abc”)语句与String s2=new String(“abc”)语句,存在两个引用对象s1、s2,两个内容同样的字符串对象”abc”。它们在内存中的地址是不同的。仅仅要用到new总会生成新的对象。
(2) 对于String s1 = “abc”语句与String s2 = “abc”语句。在JVM中存在着一个字符串池,当中保存着非常多String对象,并且能够被共享使用,s1、s2引用的是同一个常量池中的对象。因为String的实现採用了Flyweight的设计模式。当创建一个字符串常量的时候。比如String s = “abc”,会首先在字符串常量池中查找是否已经有同样的字符串被定义,它的推断根据是String类equals(Object obj)方法的返回值。
假设已经定义,则直接获取对其的引用,此时不须要创建新的对象,假设未定义,则首先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。
因为String是不可变类,一旦创建好了就不能被改动,因此String对象能够被共享并且不会导致程序的混乱。
详细而言:
String s=“abc”; //把“abc”放到常量区中,在编译时产生。
String s=“ab”+”c”; //把“ab”+“c”转换为字符串常量“abc”放到常量区中。
String s=new String(“abc”); //在执行时把“abc”放到堆里面的。
比如:
String s1=“abc”; //在常量区里面存放了一个”abc”字符串对象
String s2=“abc”; //s2引用常量区中的对象,因此不会创建新的对象
String s3=new String(“abc”) //在堆中创建新的对象
String s4=new String(“abc”) //在堆中又创建一个新的对象
为了便于理解。能够把String s = new String(“abc”)语句的执行人为地分解成两个过程:第一个过程是新建对象的过程,即new String(“abc”),第二个过程是赋值的过程,即String s=。
因为第二个过程中仅仅是定义了一个名为s的String类型的变量,将一个String类型对象的引用赋值给s,因此在这个过程中不会创建新的对象。
第一个过程中new String(“abc”)会调用String类的构造函数:
public String(String original){
//body
}
在调用这个构造函数的时候,传入了一个字符串常量。因此语句new String(“abc”)也就等价于”abc”和new String()两个操作了。假设在字符串池中不存在”abc”。则会创建一个字符串常量”abc”,并将其加入到字符串池中,假设存在。则不创建。然后new String()会在堆中创建一个新的对象。所以str3与str4指向的是堆中不同的String对象,地址自然也不同样了。
如图 5 5所看到的。
下图两种字符串存储方式
引申:对于String类型的变量s。赋值语句s=null与s=“”是否同样?
对于赋值语句s=null,当中s是一个字符串类型的引用,它不指向不论什么一个字符串。而赋值语句s=“”中 s是一个字符串类型的引用,它指向另外一个字符串(这个字符串的值为“”,即空字符串)。
常见笔试题:
new String(“abc”)创建了几个对象?
答案:一个或两个。假设常量池中原来有“abc”,那么仅仅创建一个对象,假设常量池中原来没有字符串“abc”,那么就会创建两个对象。
相关文章
- [大数据量]java移位运算与位运算与数据类型的存储
- 在Java下使用NTP获取时间
- java学习笔记10--泛型总结
- java中Calender类的详细用法(详解)
- Java实现 LeetCode 136 只出现一次的数字
- Java实现第九届蓝桥杯递增三元组
- Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
- Java实现 蓝桥杯VIP 算法训练 黑色星期五
- 对象存储在什么地方(java编程思想)
- Java对存储过程的调用方法
- Java -- JDBC 学习--调用函数&存储过程
- Java每日一练(20230408)
- Redis开发:hash存储自定义Java对象及value的序列化器设置
- Atitit mybatis的扩展使用sql udf,js java等语言 目录 1.1. 默认,mybatis使用xml,sql等语言来书写业务流程1 2. 使用ognl调用java函数1 3
- Atitit 文件存储标准化api 总结 目录 1. 操作系统,进行操作1 1.1. FileUtils类的应用1 1.2. 各大api 比较2 2. Java。Io用apache的commo
- Atitit Java内容仓库(Java Content Repository,JCR)的JSR-170 文件存储api标准 目录 1. Java内容仓库1 2. Java内容仓库2 2.1.
- java怎样将一组对象传入Oracle存储过程
- 【 华为OD机试 2023】 上班之路/是否能到达公司(C++ Java JavaScript Python)
- 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射
- Java 方法
- Java日志 - log4简单使用实例及其再次封装