字符串String的理解
1、String是一个final的类型
即不可被继承修改,一经生成不可改变。所以在代码中使用String s = s1 + s2;的时候,执行完之后s所指向的是一个新生成的对象,这里有个地方值得注意下就是jvm在装载类的时候,如果代码中书写的是字符串,那么返回的对象是直接返回的StringPool中的对象,而如果加号两边有一个变量的话,返回的是一个在堆中分配的新对象。
2、String的StringPool(字符串池)
因为String在编写代码使用很广泛,所以jvm对于String做了一定的优化。即StringPool的出现。首先要说明的是:StringPool仅仅是个缓存并不会破坏程序描述语言原来的特性,无论有没有StringPool的出现,只要你在内存中使用关键字new了一个String的对象,那么在堆中就一定会有一个新增的String类。而StringPool主要如下形式的语法提供帮助:
String s = "abc';
在执行这句代码的时候,JVM会首先查询StringPool,如果在该StringPool中已经存在相应的String实例了,那么将不会在堆中分配相应的内存来生成一个String对象,所以在代码中多次使用上面的声明来声明的变量实际指向的是同一个对象。现在来说一下JVM查找的时候没有找到相应的String对象的情况,这时JVM会在StringPool中生成相应的对象,但是并不会在堆中生成相应的对象,所以只要使用上面的代码声明,堆中将始终不会生成新的String对象。
说到这里,需要提一下的就是String类的intern()方法,该方法返回是始终都是StringPool中的对象,和上面声明代码的效果实际上是一样的,比如你首先使用String s = new String("abc")声明一个变量,然后判断s == s.intern()的话,那么会得到一个false,原因就是因为s是分配在堆中的一个新对象,而intern返回的是StringPool中的对象。
3、StringBuilder和StringBufffer
String每次使用"+"连接字符串的话会生成新的对象,所以在进行字符串连接操作的时候会生成大量的中间对象,不过按理分析的话,如果所使用的连接操作的两端都是常量而不是变量的话那么使用Stringbuilder反而会降低效率。
但是如果是变量进行连接的话,那么StringBuffer的效率将会大大的优于操作符,而且会节省一个对象的内存。然后为什么会出现相应的StringBuilder呢,因为在使用buffer的时候,是有一个字符串的缓存区的,每次append的时候都会向该缓存区写入相应的数据,如果有两个线程同时在操作同一个缓存区,那么我们就应该保证一下写入的顺序是吧,所以append方法是有同步锁的,所以每次在操作的时候就会导致有一个加锁和解锁的操作,但是很多情况下我们的字符串操作都是单线程的,所以为了效率考虑出现了单线程使用的StringBuilder。
StringBuilder:一个可变的字符序列,不保证同步,StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer
要快。
/**
* String 分析测试1
* @author xueji
*/
public class StringTest {
public static void main(String[] args) {
// (1)此句代码产生后在内存中会产生几个对象?
String s1 = new String("abc");
String s2 = "abc";
// (2)此句代码产生后在内存中会产生几个对象?
String s3 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s2 == s3);
System.out.println(s1 == s1.intern());
System.out.println(s2 == s2.intern());
System.out.println(s1.intern() == s3.intern());
}
}
测试结果:
false
false
false
false
true
true
/**
* String 分析测试2
* @author xueji
*/
public class StringTest {
public static void main(String[] args) {
String hello = "hello";
String hel = "hel";
String lo = "lo"; System.out.println(hello == "hel" + "lo");
System.out.println(hello == "hel" + lo);
}
}
测试结果:
true
false
字符串String的理解的更多相关文章
- Java常量字符串String理解
Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用 "eq ...
- Java常量字符串String理解 String理解
以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用 "equals" 3.Strin ...
- 对Java中字符串的进一步理解
字符串在程序开发中无处不在,也是用户交互所涉及到最频繁的数据类型,那么字符串不仅仅就是我们简单的理解的String str = "abc";一起来更加深入的看一下 在Java中,字 ...
- python字符串(string)方法整理
python中字符串对象提供了很多方法来操作字符串,功能相当丰富. print(dir(str)) [..........'capitalize', 'casefold', 'center', 'co ...
- C#字符串string以及相关内置函数
C#字符串string函数 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- c/c++日期时间处理与字符串string转换
转自:https://www.cnblogs.com/renjiashuo/p/6913668.html 在c/c++实际问题的编程中,我们经常会用到日期与时间的格式,在算法运行中,通常将时间转化为i ...
- python开发_python中字符串string操作
在python中,对于字符串string的操作,我们有必要了解一下,这样在我们的以后的开发中会给我们带来很多方便 下面是我学习的笔记: #python-string #python中的字符串用单引号' ...
- 关于jvm中的常量池和String.intern()理解
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...
- C++中字符数组和字符串string
字符数组 C++中字符数组用char str[]能够用来表示一个字符串. (1) 数组的大小和字符串的长度. 数组的大小一定要大于字符串的长度,由于系统会自己主动补上一个'\0'作为字符串的结束标 ...
随机推荐
- Dubbo 是一个分布式服务框架
Dubbo 是一个分布式服务框架-----http://www.cnblogs.com/chanshuyi/p/5144288.html
- 根据判断数组不为空然后取他的值----数组不会为空---只能判断其size是否大于0
private List<Integer> classId=new ArrayList<Integer>(); business.getClassId()!=null 以上为错 ...
- Spark在Executor上的内存分配
spark.serializer (default org.apache.spark.serializer.JavaSerializer ) 建议设置为 org.apache.spark.ser ...
- [BZOJ2594] [Wc2006]水管局长数据加强版(LCT + kruskal + 离线)
传送门 WC这个题真是丧心病狂啊,就是想学习一下怎么处理边权,给我来了这么一个破题! ORZ hzwer 临摹黄学长代码233 但还是复杂的一匹 理一下思路吧 题目大意:给定一个无向图,多次删除图中的 ...
- [luoguP2896] [USACO08FEB]一起吃饭Eating Together(DP)
传送门 由于 Di 只有 3 种情况,那么就很简单了 f[i][j][0] 表示前 i 个,且第 i 个变成 j 的 递增序列最小修改次数 f[i][j][1] 表示前 i 个,且第 i 个变成 j ...
- 过河(codevs 1155)
题目描述 Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥 ...
- C. Hexadecimal's Numbers
C. Hexadecimal's Numbers time limit per test 1 second memory limit per test 64 megabytes input stand ...
- sql server internal book
Frequently Bought Together + + Total price: $131.71 Add all three to CartAdd all three to List Buy t ...
- 网络协议IPV6基础知识点集锦
由于互联网的快速发展与普及,原有的IPV4地址已不能满足网络用户的需求,虽然NAT可以缓解IPV4地址的耗尽,但NAT破坏了网络环境的开放.透明以及端到端的特性,因此IPV6地址协议应运而生. IPV ...
- 高效开发之SASS篇 灵异留白事件——图片下方无故留白 你会用::before、::after吗 link 与 @import之对比 学习前端前必知的——HTTP协议详解 深入了解——CSS3新增属性 菜鸟进阶——grunt $(#form :input)与$(#form input)的区别
高效开发之SASS篇 作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~ 他是谁? 作为前端开发人员,你肯定对css很熟悉,但是你知道css可以自定义吗?大家 ...