String类是java中常用来对字符串操作的一个类,java程序中所有的字符串文字都可被实现为此类的实例。
与之还有StringBuffer和StringBuilder两个类可对字符串进行操作,下面将对前面提到的这三个类做以总结。
Java中String、StringBuffer及StringBuilder
String
理解String
String 不同于Java中规定的八中基本数据类型,它属于这些之外的引用类型,在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而其引用的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
*引用类型:它是由类型的实际值引用表示的数据类型(功能上可简单的类比成C语言的指针,只是在栈上开辟了一小块内存空间保存一个地址,但没有指针中直接访问内存的概念)
Sting str = "hello word";
如何创建字符串
常用的几种构造方法:
// 方式一
String str = "Hello wold";
// 方式二
String str2 = new String("Hello wold");
官方文档中提供的 String 构造方法的部分截取
Sting字符串的比较
因为其是引用类型,所以两种该类型创建的变量使用 == 进行比较时,与基本数据类型不同,而比较的是这两个引用是否指向同一个对象,而要想要比较其表示的对象值是否相等时,需要用到String类下的equals方法
String str1 = new String("hello word");
String str2 = new String("hello word");
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//true
字符常量池的理解
在Java中设计String类时使用了一种设计模式——享元模式(即对对象的重用提供一种解决方案,使用共享技术对相同或者相似对象实现重用)
JVM虚拟机中,底层维护了一块区域用来存放字符串,即字符串常量池
如果在创建String字符串是使用直接赋值的方式,则该实例化的对象会自动被保存到字符串常量池中
如下次再使用相同方法创造,若字符串常量池中以用该值的对象,则会直接引用该对象,反正再创建
ps:如果使用构造方法创建字符串(new String(“abc”)),则会在堆上开辟两个内存空间不会自动保存到字符串常量池中
String类两种实例化对象的区别:
直接赋值创建(String str = “abc”):只开辟一个内存空间,并该字符串对象会自动保存到字符串常量池中以供下次创建使用
构造方法创建(String str = new String(“abc”)):会开辟两个内存空间,new的对象在堆普通区中,创建的字符串在常量池中,并且不会自动保存到字符串常量池中,如入池需要调用String的intern()方法
为什么String字符串要设为不可变的?
1.方便实现字符串常量池,不可变则无需考虑深浅拷贝问题
2.因为对象不可变致使无需考虑线程安全问题
3.不可变更加方便缓存hashCode,作为key时可以跟高效的保存到HashMap中
String类常用api
StringBuffer与StringBuilder
由于String声明的字符串本身不可变,如要改变其内容只能改变其引用的指向,因此为了String字符串修改方便,Java提供了两个类StringBuffer与StringBuilder来进行操作
StringBuffer与StringBuilder的功能大部分相同,下面介绍一些其常用api
Constructor :
Modifier:
String 转 StringBuffer/StringBuilder 需要用StringBuffer与StringBuilder的构造方法
StringBuffer与StringBuilder 转 String 直接使用toString()方法
String,StringBuffer与StringBuilder的区别
- String的内容不可修改,StringBuffer与StringBuilder的内容可修改
- StringBuffer采用同步锁实现了线程安全;StringBuilder未实现线程安全
- StringBuffer的toString()方法添加了一个缓冲区,StringBuilder直接复制一次字符数组构建字符串
- 由于StringBuilder未实现线程安全,其方法未加同步锁,使得StringBulider的执行效率远高于StringBuffer
以上便是对String的知识点小结,随着后续学习的深入还会同步的对内容进行补充和修改,如能帮助到各位博友将不胜荣幸,敬请斧正