字符串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'作为字符串的结束标 ...
随机推荐
- BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...
- 【Lqb T336】Cowboys
[链接] 我是链接,点我呀:) [题意] 出现AB就要交换一下 给你结果序列 问你原序列有多少种可能 首尾可以交换. [题解] 设 dp[i][0]表示i和i-1不交换,达到前i个字符序列的状态的方案 ...
- 如何相互转换逗号分隔的字符串和List --https://blog.csdn.net/yywusuoweile/article/details/50315377
如何相互转换逗号分隔的字符串和List ---https://blog.csdn.net/yywusuoweile/article/details/50315377 方法 2: 利用Guava的Joi ...
- HDU 2242 连通分量缩点+树形dp
题目大意是: 所有点在一个连通图上,希望去掉一条边得到两个连通图,且两个图上所有点的权值的差最小,如果没有割边,则输出impossible 这道题需要先利用tarjan算法将在同一连通分量中的点缩成一 ...
- Linux下汇编语言学习笔记71 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- I - Navigation Nightmare 并查集
Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1 ...
- 最小生成树 C - Building a Space Station
You are a member of the space station engineering team, and are assigned a task in the construction ...
- HashMap源码分析2:扩容
本文源码基于JDK1.8.0_45. final Node<K,V>[] resize() { Node<K,V>[] oldTab = table; int oldCap = ...
- BMP的图像处理
近期碰到了一个问题将图片缩放: 进行了整理发现位图一些主要的结构能够进行整理,得出下面图表: 进行图片缩放的时候会进行一些处理(最临近差值法): 详细的代码例如以下: #include <std ...
- FloatingActionMenu 向上弹出菜单
本人在github上找到了一个FloatingActionsMenu,精简了其效果(原效果有上下左右四个方向)仅仅保留向上的效果,并做了一定的优化. github上的源代码:地址 ,精简后的源代码地址 ...