String类
java.lang.String类代表字符串。Java程序中所有的字符串文字都可以被看作是实现类的实例(对象),也就是说凡是用双引号引起来的内容,都是一个字符串String类的对象。
特点:
- 字符串是一个不可变的类,也就是字符串的值在创建后不能修改。
- 不可变是指值本身不能改变,如果重新给字符串对象赋值,字符串对象会指向一个新的值
- 字符串池的原理:字符串池是一个专门用来存储字符串值得空间,所有创建的字符串对象在赋值时,都需要和字符串池中已有的内容进行对比,如果内容已经存在,直接引用已存在的值得内存地址;如果不存在,才会把新的内容放到字符串池中。
String的构造方法
- 默认创建一个字符串对象时,可以直接把内容使用双引号引起来即可。
- 例如: String name=”张三”;
- 可以使用String的构造方法来创建对象。
- 例如: String name=new String(“李四”);但是,该方式会创建两个对象,原始对象是构造方法中的字符串参数,name其实就是一个对象副本
public class Test7 {
public static void main(String[] args) {
char[] chars = {'a','b','c'};
//可以传一个字符数组
String str = new String(chars);
byte[] bytes = {1,2,3};
//可以传一个byte数组
String str1 = new String(bytes);
//会创建两个对象一个“abc”和一个str2
String str2 = new String("abc");
}
}
*String类中比较常用的方法
整理出来加强记忆,在平时使用时会经常用到,只是举出几个常用的方法 ,如果不够全面可以参考API文档中的方法。
String 长度
public ubt length(); 返回字符串的长度
String类中的比较相关方法
返回值类型 | 方法 | 说明 |
---|---|---|
boolean | equals(Object obj) | 将字符串与指定对象进行比较 |
boolean | equalsIgnoreCase(String value) | 此方法比较两个字符串,忽略大小写形式 |
int | compareTo(String value) | 按字典顺序比较两个字符串。相等返回0;如果字符串在参数值之前返回值小于0;字符串在参数值之后,返回值大于0 |
int | compareToIgnoreCase(String value) | 按字典顺序比较两个字符串,不考虑大小写 |
boolean | startsWith(String value) | 检查一个字符串是否以参数字符串开始 |
boolean | endWith(String value) | 检查一个字符串是否以参数字符串结束 |
注:(compareTo()方法比较两个字符串,首先比较两个字符串的首字母是否一致,如果不一致就直接使用它们的ASCII码值相减作为最终的结果;如果相同,则比较第二个字符,以此类推。如果有一方已经比较完毕,这种情况下,直接把两个字符串的长度相减作为最终的结果)
String类中的搜索相关方法
返回值类型 | 方法 | 说明 |
---|---|---|
int | public int indexOf(int ch) | 返回指定字符ch在此字符串中第一次出现处的索引值,如果未出现该字符,则返回-1 |
int | public int indexOf(String str) | 返回第一次出现的指定字符串str在此字符串中的索引值,如果未出现该字符串,则返回-1 |
int | public int lastIndexOf(int ch) | 返回最后一次出现的指定字符在此字符串中的索引值,如果未出现该字符,则返回-1 |
int | public int lastIndexOf(String str) | 返回最后一次出现的指定字符串str在此字符串中的索引值,如果未出现该字符,则返回-1 |
char | public int charAt(int index) | 从指定索引index处提取单个字符,索引中的值必须为非负 |
###String类中的修改相关方法
返回值类型 | 方法 | 说明 |
---|---|---|
String | public String substring(int index) | 提取从位置索引index开始直到此字符串末尾的这部分子字符串 |
String | publicString substring(int beginIndex,int endIndex) | 提取从beginIndex开始直到endIndex(不包括此位置)之间的这部分字符串 |
String | public String concat(String str) | 将指定字符str串联接到此字符串的结尾称为一个新的字符串返回 |
String | public String replace(char oldChar,char newChar) | 返回一个新的字符串,它是通过用newChar替换此字符串中出现的所用oldChar而生成的 |
String | public String trim() | 返回字符串的副本,忽略前导空白和尾部空白 |
String | public String toUpperCass() | 将此字符串中的所有字符都转换为大写 |
String | public String toLowerCase() | 将此字符串中的所有字符都转换为小写 |
字符串转换和分割相关的方法
返回值类型 | 方法 | 说明 |
---|---|---|
char[] | public char[] toCharArray(); | 将字符串转换为一个新的字符数组 |
String[] | public String[] split(String regex) | 将字符串按照给定的regex进行分割,返回一个字符串数组 |
StringBuilder和StringBuffer
由于String类的对象内容是不可改变的,所以每当进行字符串操作后,总会在内存中创建一个新的对象,即耗时又浪费内存空间,为解决这一问题,java中提供了java.lang.StringBuilder和java.lang.StringBuffer类。这两个类又称为可变字符序列,他是一个类似于String的字符串缓冲区,通过某些方法调用可以改变该对象的长度和内容。
StringBuilder、StringBuffer
可变字符串。
-
内部维护了一个字符串缓冲区,可以实现在现有字符串基础上做修改
-
Java中提供了两种可变字符串类型,他们的api完全兼容
-
构造方法:
public class Test2 { public static void main(String[] args) { //构造一个没有字符的字符串缓冲区,初始容量为16 StringBuilder builder = new StringBuilder(); //构造一个初始化为指定字符串内容的字符串缓冲区 StringBuilder builder1 = new StringBuilder("aaa"); //构造一个没有字符的字符串缓冲区,容量为参数值 StringBuilder builder2 = new StringBuilder(34); //用法都一样,同上 StringBuffer buffer = new StringBuffer(); } }
-
这两个类中,有很多对字符串操作的方法,可以看API文档
区别:
- StringBuffer在JDK1中就有 线程安全、执行效率低、适用于多线程环境
- StringBuilder是JDK5新增类 线程不安全、执行效率高、适用于单线程环境
- 在频繁的字符串操作时,如果不考虑线程问题,那么StringBuilder的效率是最高的,String永远是效率最低的