Python 官方文档:入门教程 => 点击学习
目录1、String 是最基本的数据类型吗?2、字符型常量和字符串常量的区别?3、什么是字符串常量池?4、String str=new String(“aaa”)创建了几个对
不是。
Java 中的基本数据类型只有 8
个 :byte、short、int、long、float、double、char、boolean
;除了基本类型,剩下的都是引用类型,Java 5 以后引入的枚举类型也算是一种比较特殊的引用类型。
2
个字节;字符串常量占若干个字节(至少一个字符结束标志) (注意: char 在Java中占两个字节)。字符串常量池:JVM为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串常量池。当需要使用字符串时,先去字符串常量池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符串常量池中。
所处位置说明
1个或者2个
"aaa"
字符串常量了,那么此时会在堆中通过 new String()方法
创建 1
个字符串对象。"aaa"
字符串常量了,此时会创建 2
个对象。首先 "aaa"
该表达式会查看字符串常量池中是否含有 "aaa"
常量,如果没有的话,那么在字符串常量池中就会生成一个值为 "aaa"
的字符串常量,然后再在堆中通过 new String()方法
创建一个值为 "aaa"
的对象。你学 Java
的别这个高频知识点都不知道呀,不知道的赶紧偷摸补一下。
在解析这个问题之前,我们先来做个题目:
public class Test {
public static void main(String[] args) {
String s = new String("2");
s.intern();
String s1 = "2";
System.out.println(s == s1);
String s3 = new String("3") + new String("3");
s3.intern();
String s4 = "33";
System.out.println(s3 == s4);
}
}
输出结果
//jdk6
false
false
//jdk7
false
true
intern
方法在JDK1.6以前 和 JDK1.7以后有不同的处理:
intern
的处理是 先判断字符串常量是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,则将该字符串常量加入到字符串常量区,也就是在字符串常量区建立该常量;intern
的处理是 先判断字符串常量是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,说明该字符串常量在堆中,则处理是把堆区该对象的引用加入到字符串常量池中,以后别人拿到的是该字符串常量的引用,实际存在堆中。可变与不可变
String
// 源码
private final char value[];
String
类中使用字符数组保存字符串,因为有 “final”
修饰符,所以 String
对象是不可变的。对于已经存在的 String
对象的修改都是重新创建一个新的对象,然后把新的值保存进去。
StringBuffer
和 StringBuilder
// 源码
char[] value;
StringBuffer
和 StringBuilder
都继承自 AbstractStringBuilder
类,在 AbstractStringBuilder
中也是使用字符数组保存字符串,这两种对象都是可变的。
String
中的对象是不可变的,也就可以理解为常量,显然线程安全。StringBuilder
是非线程安全的。StringBuffer
对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
// StringBuffer 的追加操作
public synchronized StringBuffer append(StringBuffer sb) {
toStrinGCache = null;
super.append(sb);
return this;
}
性能
String
类型进行改变的时候,都会生成一个新的 String
对象,然后将指针指向新的 String
对象。StringBuffer
每次都会对 StringBuffer
对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder
相比使用 StringBuffer
仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。URL
,文件路径path
,反射机制所需要的String
参数。其不可变性可以保证连接的安全性。如果字符串是可变的,黑客就有可能改变字符串指向对象的值,那么会引起很严重的安全问题。String
是不可变的,保证了hashcode
的唯一性,于是在创建对象时其hashcode
就可以放心的缓存了,不需要重新计算。这也就是Map
喜欢将String
作为Key
的原因。到此这篇关于Java 关于String字符串原理上的问题的文章就介绍到这了,更多相关Java String内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Java关于String字符串原理上的问题
本文链接: https://www.lsjlt.com/news/145257.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0