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面试常被问到的题目+解答

    第一,anonymousinnerclass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 不行,对于匿名内部类,看到的一句话说的 ...

  2. poj 2455

    题意:由一个点走到另一个点,中间的点可以重复到达,但边只能经过一次,问T条边不重复的路径里,最长的边的最小值. 分析:由于点是可以重用的,因此不必拆点.这道题有重边,而且重边都必须保留,因为点是可以重 ...

  3. iOS消息推送原理和实现总结

    一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图:1. Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provi ...

  4. 基本的数据类型分析----java.lang.Number类及其子类分析

    本文转自http://blog.csdn.net/springcsc1982/article/details/8788345 感谢作者 编写了一个测试程序,如下: int a = 1000, b= 1 ...

  5. PHP array_multisort()

    定义和用法 array_multisort() 函数对多个数组或多维数组进行排序. 参数中的数组被当成一个表的列并以行来进行排序 - 这类似 SQL 的 ORDER BY 子句的功能.第一个数组是要排 ...

  6. HTTP状态码图示

    这里总结下我们日常开发中常用的HTTP状态码,分享一个老外对HTTP状态码形象化用图片表示的网站:https://http.cat/ 总结如下: 表示服务器已经接收到了请求头,并且客户端应该继续发送请 ...

  7. Cocos2d-x教程(34)-三维物体OBB碰撞检測算法

    欢迎增加Cocos2d-x 交流群:193411763 个中心点.1个旋转矩阵和3个1/2边长(注:一个旋转矩阵包括了三个旋转轴,若是二维的OBB包围盒则是一个中心点,两个旋转轴,两个1/2边长). ...

  8. Java---15---单例设计模式:---饿汉式和懒汉式

    概念: 单例模式确保某个类仅仅有一个实例.并且自行实例化并向整个系统提供这个实例.   单例模式有下面特点: 1.单例类仅仅能有一个实例 2.单例类必须自己给自己创建自己的唯一实例 3.单例类必须给全 ...

  9. BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers         本章中,你讲学到: 了解远程evernt ...

  10. LeetCode 237. Delete Node in a Linked List (在链表中删除一个点)

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...