1.创建字符串
// 方式一
String str = "Hello World";
// 方式二
String str2 = new String("Hello World");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 =new String(array);
2.字符串的比较
Java 中要想比较字符串的内容, 必须采用String类提供的equals方法.
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1));
// 执行结果
true
如果输入的字符串与特定字符串比较:
// 方式一
System.out.println(str.equals("Hello"));
// 方式二
System.out.println("Hello".equals(str));
用方式二更好一些:一旦 str 是 null, 方式一的代码会抛出异常,而方式二不会
3.字符串常量池
采用直接赋值方式对对象进行实例化,例如(String str = “Hello”;),会自动将匿名对象“hello”自动放入对象池,如果下次继续使用直接赋值的方式声明String类对象,对象池之中若有指定内容,将直接引用。
所以,直接赋值的String对象,如果利用相同的“Hello”,则String对象==返回true;
如果采用构造方法实例化对象,就有两个缺点:
- 如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间(字符串常量 “hello” 也是一个匿名对象, 用了一次之后就不再使用了, 就成为垃圾空间, 会被 JVM 自动回收掉)
- 字符串共享问题. 同一个字符串可能会被存储多次,浪费空间
只能采用intern()方法手动把String对象加入到字符串常量池中
// 该字符串常量并没有保存在对象池之中
String str1 = new String("hello") ;
String str2 = "hello" ;
System.out.println(str1 == str2);
// 执行结果
false
String str1 = new String("hello").intern() ;
String str2 = "hello" ;
System.out.println(str1 == str2);
// 执行结果
true
总结:两种实例化方式的区别:
1)直接赋值(String str = “hello”):只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。
2)构造方法(String str= new String(“hello”);):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,而且不能够自动入池,需要通过public String intern();方法进行手工入池。
在开发的过程中不会采用构造方法进行字符串的实例化。
4.String常用方法
4.1字符与字符串转换
方法名 | 描述 |
---|---|
public String(char value[]) | 将字符数组中所有内容变为字符串 |
public String(char value[],int offset,int count) | 将部分字符数组变为字符串 |
public char charAt(int index) | 取得指定索引位置的字符,索引从0开始 |
public char[] toCharArray() | 将字符串变为字符数组返回 |
String toLowerCase() | 把字符串转换为小写字符串 |
String toUpperCase() | 把字符串转换为大写字符串 |
4.2字符串比较
方法名 | 描述 |
---|---|
public boolean equals(Object another) | 区分大小写比较 |
public boolean equalsIgnoreCase(Object another) | 不区分大小写比较 |
public int compareTo(String another) | 比较两个字符串大小关系 |
compareTo() 方法返回int
相等返回0;小于返回小于0;大于返回大于0;
System.out.println("A".compareTo("a")); // -32
System.out.println("a".compareTo("A")); // 32
System.out.println("A".compareTo("A")); // 0
System.out.println("AB".compareTo("AC")); // -1
4.3字符串获取
方法名 | 描述 |
---|---|
public int length() | 获取字符串长度 |
public char charAt(int index) | 获取指定索引处的字符 |
public int indexOf(String str) | 获取str在字符串对象中第一次出现的索引 |
public String substring(int start) | 从start开始截取字符串 |
String substring(int start,int end) | 从start开始,到end结束截取字符串。[start,end) |
4.4字符串判断
方法名 | 描述 |
---|---|
boolean startsWith(String str) | 判断字符串对象是否以指定的str开头 |
boolean endsWith(String str) | 判断字符串对象是否以指定的str结尾 |
boolean isEmpty(String str) | 判空,长度为0返回true |
boolean contains(子字符串序列) | 判断字符串是否包含指定序列 |
字符串替换和拆分
方法名 | 描述 |
---|---|
public String replaceAll(String regex,String replacement) | 替换所有指定内容 |
public String replaceFirst(String regex,String replacement | 替换首个内容 |
public Stirng[] split(String regex) | 将字符串按regex全部拆分 |
String类不可变的好处
可以实现多个变量引用堆内存中的同一个字符串实例,避免创建的开销。
我们的程序中大量使用了String字符串,有可能是出于安全性考虑。
大家都知道HashMap中key为String类型,如果可变将变的多么可怕。
StringBuffer和StringBuilder
任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已;因此为了方便字符串的修改,提供StringBuffer和StringBuilder类;
注意:String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
- String变为StringBuffer:利用StringBuffer的构造方法或append()方法
- StringBuffer变为String:调用toString()方法
代码示例:
append()
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world");
System.out.println(sb);//helloworld
字符串反转
public synchronized StringBuffer reverse()
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.reverse());
删除指定范围的数据
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10));
String、StringBuffer、StringBuilder的区别:
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作