String类
1.字符串的创建
1.1常见的构造方法创建字符串
1.1.1 String str = “hello”;
这种方式是直接引用堆中字符串常量池里的hello,这个hello中有一份且可以通用使用,属于常量,不可被改变。
1.1.2 String str = new String("hello");
这种方式是创建一个对象,这个对象引用的是字符串常量池中hello的引用
1.1.3
char[] chars = {'a','b','c'};
String str = new String(chars);
2.字符串比较相等
2.1 通过(==)比较
2.1.1 如果两个字符串都直接引用字符串常量池中的对象,那么结果为相等,相当于是两个常量的比较嗷
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
// 执行结果
true
2.1.2 如果有一个不是直接引用常量池中的对象时,结果为不相等,相当于是引用的比较,不同对象的引用肯定不一样
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果
false
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果
false
2.1 通过(equals)比较
这种方式比较的是字符串内容是否相同
不管是哪种定义方式
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
//执行结果
true
只比较最终指向的对象是否相同
注意:
在比较字符串和对象时,有两种写法
1.
String str1 = new String("Hello");
System.out.println(str1.equals(“hello”));`
String str1 = new String("Hello");
System.out.println("hello".equals(str));`
这两种方式最好选择第二种,因为他不太容易发生空指针异常
3.字符、字节与字符串
3.1 字符与字符串
字符串内部包含一个字符数组,String可以和char[]相互转换
3.1.1构造方法
①将字符数组中的内容转换为字符串
public String(char[] ch);
char[] ch = {'h','e','l','l','o'};
String str = new String(ch);
System.out.println(str);
//输出内容
hello
②将数组中部分内容变为字符串
public String(char[] ch,起止位置,转换几个字符)
char[] ch = {'h','e','l','l','o'};
String str1 = new String(ch,1,2);
System.out.println(str1);
//输出内容
el
3.1.2方法
①去指定索引位置的字符,索引从0开始
public char charAt(int index)
String str = "helloWorld";
System.out.println(str.charAt(7));
//输出内容
r
②将字符串以字符数组返回
public char[] toCharArray()
String str = "helloWorld";
char[] chars = str.toCharArray();
for (char aChar : chars) {
System.out.print(aChar+ " ");
}
//输出内容
h e l l o W o r l d
3.2 字节与字符串
字节常用于数据传输以及编码转换的处理之中,String 也能方便的和 byte[] 相互转换
3.2.1构造方法
①将字节数组变为字符串
public String (byte[] byt)
byte[] byt = {1,2,5,6,7};
String str1 = new String(byt);
②将字节数组中部分字节变为字符串
public String (byte[] byt,起始位置,长度)
byte[] byt = {1,2,5,6,7};
String str = new String(byt,0,3);
3.2.2 方法
①将字符串以字节数组形式返回
public byte[] getBytes()
String string = "abcde";
byte[] bytes = string.getBytes();
for (byte aByte : bytes) {
System.out.print(aByte + " ");
}
//输出
97 98 99 100 101
②编码转换处理
public bytes[] getBytes(String charSetName)throws UnsupportedEncodingException
3.3 小节
纯文本文档情况下建议使用字符,影音视频建议使用字节
byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合
针对二进制数据来操作.
char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.
4.字符串常用操作
4.1 比较字符串
①比较两个字符串是否相等
public boolean eauals(Object o)
String str1 = new String("hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
//输出 false
②比较两个字符串不区分大小写
public boolean equalsIgnoreCase(String str)
String str1 = new String("hello");
String str2 = new String("Hello");
System.out.println(str1.equalsIgnoreCase(str2));
//输出 true
③ 比较大小关系 compareTo()
比较时,大于就返回正数,小于就返回负数,相等就返回0
String str1 = new String("hello");
String str2 = new String("Hello");
System.out.println(str1.compareTo(str2));
4.2 查找字符串
①判断一个字符串是否存在
public boolean contains (CharSequence s)
String str1 = "helloWorld";
System.out.println(str1.contains("llo"));
//输出 true
②从头开始查找指定字符串第一次出现的位置,查到返回该字符串的起始索引,查不到返回-1
public int indexOf (String str)
String str1 = "helloWorld";
System.out.println(str1.indexOf("World"));
//输出 5
③从指定位置开始查找指定字符串第一次出现的位置,查到返回该字符串的起始索引,查不到返回-1
public int indexOf (String str,intindex)
String str1 = "helloWorld";
System.out.println(str1.indexOf("l",3));
//从索引为3开始找“l”,输出3
④从后向前开始查找指定字符串第一次出现的位置,查到返回该字符串的起始索引,查不到返回-1
public int lastIndexOf (String str)
String str1 = "helloWorld";
System.out.println(str1.lastIndexOf("l"));
//输出 8
⑤从指定索引位置开始查找指定字符串第一次出现的位置,查到返回该字符串的起始索引,查不到返回-1
public int lastIndexOf (String str)
String str1 = "helloWorld";
System.out.println(str1.lastIndexOf("o", 5));
//输出 4
⑥判断字符串是否以指定字符串开头
public boolean startsWith(String prefix)
String str1 = "helloWorld";
System.out.println(str1.startsWith("he"));
//输出 true
⑦判断字符串指定位置是否以指定字符串开头
public boolean startsWith(String prefix, int toffset)
String str1 = "helloWorld";
System.out.println(str1.startsWith("Wo",5));
//输出 true
⑧判断字符串是否以指定字符结尾
public boolean endsWith(String prefix)
String str1 = "helloWorld";
System.out.println(str1.endsWith("ld"));
//输出 true
4.3 字符串替换
①替换指定内容字符
public String replaceAll(String regex , String replacement)
String str1 = "helloWorld";
System.out.println(str1.replaceAll("o","m"));
//输出hellmWmrld
②替换首个指定内容
public String replaceFirst(String regex , String replacement)
String str1 = "helloWorld";
System.out.println(str1.replaceFirst("o", "m"));
//输出 hellmworld
注意:
- 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串*
4.4 字符串拆分
①将字符串全部拆分
public String[] split(String regex)
通过指定字符#和空格,将字符串分割
String str= "ab#cde fgh#ijk";
String[] s = str.split("#| ");
for (String s1 : s) {
System.out.println(s1);
}
//输出
ab
cde
fgh
ijk
②将字符串拆分为几个 limit为个数
public String[] split(String regex,int limit)
String str= "ab#cde fgh#ijk";
String[] split = str.split("#", 2);
for (String s1 : split) {
System.out.println(s1);
}
//输出结果为
ab
cde fgh#ijk
注意:
拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义.
代码示例: 拆分IP地址
String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;
for(String s: result) {
System.out.println(s);
}
注意事项:
1. 字符"|","","+“都得加上转义字符,前面加上”".
2. 而如果是"",那么就得写成"\".
3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符*
4.5 截取字符串
①从指定索引截取到结尾
public String subString(int beginIndex)
String str = "hellotaotao";
String substring = str.substring(3);
System.out.println(substring);
lotaotao
②从指定索引截取到指定索引前一个
String str = "hellotaotao";
String substring1 = str.substring(3, 5);
System.out.println(substring1);
//输出
lo
4.6 字符串其他方法
① 去除字符串前后的空格,保存中间空格
public String trim();
②将字符串转为大写
public String toUpperCase();
③ 将字符串转为小写
public String toLowerCase();
④返回字符串长度
public int length();
⑤将字符串放入常量池
public native String intern ();
⑥连接字符串,不入池
public String concat();
⑦判断字符串是否为空,但不是null ,而是长度为0
public boolean isEmpty();
5. StringBuffer 和 StringBuilder
String和StringBuffer最大的区别在于:String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。
注意:
String和StringBuffer类不能直接转换。如果要想互相转换,可以采
用如下原则:
String变为StringBuffer:利用StringBuffer的构造方法或append()方法
StringBuffer变为String:调用toString()方法
面试题:请解释String、StringBuffer、StringBuilder的区别:
String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
StringBuffer与StringBuilder大部分功能是相似的
StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作