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的理解的更多相关文章

  1. Java常量字符串String理解

    Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用  "eq ...

  2. Java常量字符串String理解 String理解

    以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用  "equals" 3.Strin ...

  3. 对Java中字符串的进一步理解

    字符串在程序开发中无处不在,也是用户交互所涉及到最频繁的数据类型,那么字符串不仅仅就是我们简单的理解的String str = "abc";一起来更加深入的看一下 在Java中,字 ...

  4. python字符串(string)方法整理

    python中字符串对象提供了很多方法来操作字符串,功能相当丰富. print(dir(str)) [..........'capitalize', 'casefold', 'center', 'co ...

  5. C#字符串string以及相关内置函数

    C#字符串string函数 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  6. c/c++日期时间处理与字符串string转换

    转自:https://www.cnblogs.com/renjiashuo/p/6913668.html 在c/c++实际问题的编程中,我们经常会用到日期与时间的格式,在算法运行中,通常将时间转化为i ...

  7. python开发_python中字符串string操作

    在python中,对于字符串string的操作,我们有必要了解一下,这样在我们的以后的开发中会给我们带来很多方便 下面是我学习的笔记: #python-string #python中的字符串用单引号' ...

  8. 关于jvm中的常量池和String.intern()理解

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  9. C++中字符数组和字符串string

    字符数组 C++中字符数组用char str[]能够用来表示一个字符串. (1)   数组的大小和字符串的长度. 数组的大小一定要大于字符串的长度,由于系统会自己主动补上一个'\0'作为字符串的结束标 ...

随机推荐

  1. java nio--采用Selector实现Socket通信

    server: /** * 选择器服务端 * Created by ascend on 2017/6/9 9:30. */ public class SelectorServer { // publi ...

  2. Java基础学习总结(83)——Java泛型总结

    1. 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型 ...

  3. Educational Codeforces Round 60 (Rated for Div. 2) 即Codeforces Round 1117 C题 Magic Ship

    time limit per test 2 second memory limit per test 256 megabytes input standard inputoutput standard ...

  4. [luoguP2387] 魔法森林(LCT + 并查集)

    传送门 并查集真是一个判断连通的好东西! 连通性用并查集来搞. 把每一条边按照 a 为关键字从小到大排序. 那么直接枚举,动态维护 b 的最小生成树 用 a[i] + 1 ~ n 路径上最大的 b[i ...

  5. 别墅房间 CodeVS原创

    时间限制: 1 s 空间限制: 64000 KB 题目等级 : 青铜 Bronze 题目描述 Description 小浣熊松松到他的朋友家别墅去玩,发现他朋友的家非常大,而且布局很奇怪.具体来说,朋 ...

  6. Win32编程API 基础篇 -- 3.消息处理 根据英文教程翻译

    消息处理 例子:窗口点击 好的,现在我们已经得到一个窗口了,但我们什么也做不了除了DefWindowProc()允许窗口大小被调整,最大最小化等...这不是很激动人心啊 在接下来的一小节中我将向你展示 ...

  7. Node.js和Chrome V8 引擎了解

    说起Node就不得不先介绍一个Chrome V8 引擎. 随着Web相关技术的发展,JavaScript所要承担的工作也越来越多,早就超越了“表单验证”的范畴,这就更需要快速的解析和执行JavaScr ...

  8. WingIDE 5.0注冊机

    在wingIDE下开发python很方便,但IDE不是免费的,网上有破解的方法.请支持正版. 把下列文件CalcActivationCode.py载入到wingIDE中.LicenseID能够随便给一 ...

  9. POJ 3468 A Simple Problem with Integers(线段树区间更新)

    题目地址:POJ 3468 打了个篮球回来果然神经有点冲动. . 无脑的狂交了8次WA..竟然是更新的时候把r-l写成了l-r... 这题就是区间更新裸题. 区间更新就是加一个lazy标记,延迟标记, ...

  10. 第一章 Java Collections Framework总览

    1.Java容器 Java容器中只能存放对象,对于基本数据类型(byte,short,char,int,long,float,double,boolean),需要包装成对象类型(Byte,Short, ...