什么是String?(了解)
String是Java 1.0 提出的,用来保存字符串的,被保存的字符串由一对双引号""包含。
String 有哪些特性?(熟悉)
- String是一个final类,代表不可变的字符序列。
- 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。线程安全。
- String对象的**字符内容是存储在一个字符数组value[]**中的。
//在String类中,该值用于存储字符串,final修饰,导致字符串不可变
private final char value[];
String的两种创建方式?(掌握)
-
直接赋值:String name = “Gump”;
这种方式它首先会先从常量池查看是否有"Gump" 这个数据空间,如果有就直接指向,如果没有就创建一个"Gump"这个数据空间然后指向它。注意name指向的是常量池的空间地址。 -
调用构造器:String name = new String(“Gump”);
这种方式则是先在堆中创建空间,里面维护了value属性,指向常量池的"Gump"空间。如果常量池中没有’‘Gump’',则重新创建,如果有就直接通过value指向。注意name指向的是堆中的空间地址。
为了更好的掌握两种创建方式的区别,可以先去了解JVM中的堆栈方法区等概念。
如何创建格式化的字符串?(熟悉)
可以format() 方法。
String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象。
String 类的静态方法 format() 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。
示例如下:
float floatVar = 1.688F;
int intVar = 168;
String stringVar = "Gump";
String fs;
fs = String.format("浮点型变量的值为 %f" +
"%n整型变量的值为 %d" +
"%n字符串变量的值为 %s", floatVar, intVar, stringVar);
System.out.println(fs);
输出如下:
浮点型变量的值为 1.688000
整型变量的值为 168
字符串变量的值为 Gump
String.format()的常用转换符说明:
%s | 字符串类型 |
---|---|
%d | 十进制整数 |
%f | 浮点数 |
%% | 百分号 |
%n | 换行 |
String常用的API有哪些?(熟悉)
API(方法) | 方法描述 |
---|---|
int length() | 返回字符串长度 |
boolean equals(Object anObject) | 将此字符串与指定的对象比较。 |
boolean equalsIgnoreCase(String anotherString) | 将此 String 与另一个 String 比较,不考虑大小写。 |
byte[] getBytes() | 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 |
String[] split(String regex) | 根据给定正则表达式的匹配拆分此字符串。 |
String replaceAll(String regex, String replacement) | 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
isEmpty() | 判断字符串是否为空。 |
String substring(int beginIndex) | 返回一个新的字符串,它是此字符串的一个子字符串。 |
String trim() | 返回字符串的副本,忽略前导空白和尾部空白。 |
String的API功能过于强大,就不一一列举了。(你能想到的对字符串的操作,都先去API里面找,实在找不到再自行定义)
什么是StringBuffer和StringBuilder?(了解)
可以简单理解为一个容器,其对象能够被多次的修改(字符长度可变),并且不产生新的未使用对象。
由于String 对象的值无法改变,如果需要对字符串做很多修改,String的效率就不敢恭维了,因此引入 StringBuffer & StringBuilder 类。
它们的很多方法与String相同。
StringBuffer 在JDK1.0的时候就已经存在。
StringBuilder 在JDK1.5的时候发布。
StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:
- StringBuffer():初始容量为16的字符串缓冲区
- StringBuffer(int size):构造指定容量的字符串缓冲区
- StringBuffer(String str):将内容初始化为指定字符串内容
StringBuffer和StringBuilder有什么区别?(掌握)
-
线程是否安全
StringBuilder 和 StringBuffer 拥有相同的方法,但是在 StringBuffer 上每个方法都是使用 synchronized来修饰的,因此 StringBuffer 是线程安全的。 -
性能
既然 StringBuffer 是线程安全的,它的所有公开方法都是同步的,StringBuilder 是没有对方法加锁同步的,所以毫无疑问,StringBuilder的性能要远大于 StringBuffer。
思考小结
三者分别于什么时候提出来?
三者的线程安全情况?
三者的性能情况?
三者分别适用于什么场景?