更新时间:2022-11-23 08:53:14 来源:极悦 浏览1734次
在Java中一共提供了三种类型可以表示字符串:String、StringBuilder、StringBuffer。
要谈论为什么有三个字符串类型,我们要先聊聊String的一些特性。
1.String是唯一一个设计了字面常量的引用数据类型
String str = "hello";
System.out.println("请输入:");
回顾: 常量指的是不能修改变化的数据量,与它对应的是变量。常量分两种:
(1)符号常量;
(2)字面常量 “符号常量”是给常量起一个名字(符号)
final int STUDENT_NUM = 50;
final double PI = 3.14;
final double PRICE = 3.14;
为什么要给常量起名字? 把业务含义带入到数据量当中; 便于修改,一改全改;
“字面常量”其实更常用,但也更容易被忽略。 当我们在代码中出现:5L,-19,3.4,3.14f,'A',"你的年龄是:"。 所以,注意--字面常量的特点,特别是它的字面书写形式代表了数据类型。
言归正传,我们可以很容易的发现几乎所有的字面常量都是基本数据类型,唯有String这个引用数据类型拥有一个字面常量的设计!
2.String拥有一个“字符串常量池”的设计
由于String的使用量非常大,所以对于String的字面常量,Java在设计的时候专门提供的了一个“常量池”来优化。 “池”技术,是你们现在第一次接触,但以后会大量的出现。所谓池,就是预先在内存当中放置一系列的对象(字符串常量池就是放的字符串常量对象)。当需要使用的时候,不用临时去创建,而是从池当中取一个来用就可以了。
JVM会在加载的时候,把加载到的类代码当中,所有书写的字符串常量对象,预存到一个专门的内容空间---"字符串常量池"。然后开始执行指令语句,当需要用到这个字符串常量对象的时候,就直接到常量池中去取。 演示
String s0 = "hello";
String s1 = "hello";
此时,在加载期,就会在常量池当中产生一个String类型的对象,里面的值是hello。然后运行起来以后,s0和s1都会被赋值为这个对象的引用。所以,用"=="比较的时候,我们能得到true。
String s3 = new String("hello");
由于使用了new的语法,那么会在内存的堆当中产生一个全新的String对象,里面的字符值是hello。
String判断非空,应该判断两个条件。
其他的引用数据类型,只需要判断是否“==”null;但是String有一种特殊性,它可能不为null,但是指向的String对象里面没有存放字符数据,是一个空串。 所以String判断非空要用两个条件
//如果输入为空
if(str == null || str.equals("")){
}
//如果输入不为空
if(str != null && !str.equals("")){
}
String对象的值一旦确定,不能改变。
String的这个特点其实是和String的源代码设计有关系。我们可以把String看成是一个封装的char[]。
public final class String{
private final char[] value;
/*
还有其他属性和一大堆的方法。
*/
}
在这个设计当中,我们可以看到字符串中的数据值是被作为属性存在的,而且该属性是私有的,所以外部不能直接操作,要利用String提供的方法来操作;同时该属性是final的,所以它的值不能被修改。
到了JDK8之后,这个char[]被优化成了byte[]。因为不是所有的字符都需要2个字节的空间,很多只需要1个字节空间就可以了。
这种内容不可更改的特性又会照成一个新的问题,当我们大量的在程序中做字符串拼接或需要修改字符串内容的动作时,就会产生很多字符串对象。 所以,Java又设计了新的字符串类型专门解决这个问题。
StringBuilder 是在JDK5当中,提出来的一个辅助String的字符串类型。它最大的特点是:内容可变。 注意:StringBuilder不是String类型,是一种新的类型,所以如下代码都是错的:
StringBuilder sb = "hello";
System.out.println(sb + "world");
由于StringBuilder是为了弥补String在内容不可变上的缺点,所以它提供的方法几乎都是对内容的修改方法。
1.append()方法 它的作用是在字符串的尾部添加内容。为了能够将多种数据类型都方便的添加到尾部,提供了大量的重载方法。
2.delete()方法 它的作用是在字符串中删掉指定从开始下标到结束下标的内容。
3.insert()方法 它的作用是在字符串中指定位置插入新的内容。它的第一个参数就是插入位置的下标。
4、replace()方法 它的作用是把字符串中指定位置的内容替换为新的内容。StringBuffer也是一个可变的字符串序列,它和StringBuilder的构造、提供的行为完全一样。唯一的区别就是:StringBuffer是线程安全的。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习