String类使用
1.创建字符串
常见的构造 String 的方式
// 方式一
String str = "Hello";
// 方式二
String str2 = new String("Hello");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 = new String(array);
Java 中数组, String, 以及自定义的类都是引用类型
String str1 = "Hello";
String str2 = str1;
在string源代码中有value数组和hash两个成员变量,其中value是一个引用类型,指向的也就是一个字符数组,字符串的内容最终也都是被拆分成了一个个的字符保存在这个字符数组里面。
字符串在内存中存储的方式
2.字符串比较相等
2.1 == 比较是否引用同一个对象
// 如果现在有两个int型变量,判断其相等可以使用 == 完成
int x = 10 ;
int y = 10 ;
System.out.println(x == y);
// 执行结果
true
# 代码一
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
// 执行结果
true
# 代码二
String str1 = "Hello";
String str3=new String("Hello");
System.out.println(str1 == str3);
// 执行结果
False
为什么代码一和代码二的运行结果不一样呢? 1.双引号引起来的值存在字符串常量池当中,当再次创建的时候,会去字符串常量池里查看,如果字符串常量池里有,就不会存储,直接返回字符串常量池的对象 2.String new了字符串,直接会新开一块空间,与字符串常量池中的地址不一样,返回false |
2.2 equals方法
equals方法,可以用来比较两个字符串对象里面的字符串内容是否相同
String str1 = "Hello";
String str2 = "Hello";
String str3=new String("Hello");
System.out.println(str1.equals(str3)); # true
String str1 = "Hello";
String str2 = "Hello";
String str3=new String("hello");
System.out.println(str1.equalsIgnoreCase(str3)); //忽略大小写, true
2.3 compareTo()方法
和equals方法一样,compareTo()方法用于比较两个字符串对象的内容是否相同,返回值上是int类型
String str1 = new String("hello");
String str2 = new String("hello");
String str3 = new String("Hello");
System.out.println(str1.compareTo(str2)); //输出0
System.out.println(str1.compareTo(str3)); //输出32
3.字符串操作
下面会演示字符串常见的方法:
3.1 char charAt(int index)
charAt()返回字符串index下标处对应的字符,如果index为负数或者越界都会抛出异常。
String str1 = "Hello";
String str2 = "Hello";
String str3=new String("Hello");
for (int i = 0; i < str1.length(); i++) {
System.out.println(str1.charAt(i));
}
// 输出 H e l l o
3.2 int indexOf(int ch)
返回字符ch第一次出现的位置,没有就返回-1
String str1 = new String("hello");
int ret = str1.indexOf('e');
System.out.println(ret);//输出1
3.3 int indexOf(int ch, int fromIndex)
从fromIndex位置开始找ch第一次出现的位置,没有返回-1。
public class TestDemo220528 {
public static void main(String[] args) {
String str1 = new String("hello");
System.out.println(str1.indexOf('l',3)); // 输出3
}
}
3.4 数值转字符串
String str4 = String.valueOf(12);
String str2 = String.valueOf(11.2);
System.out.println(str4); //12
System.out.println(str2); //11.2
3.5 字符串转数值
int a = Integer.valueOf("100");
int b = Integer.valueOf("200");
System.out.println(a);//输出100
System.out.println(b);//输出200
3.6 大小写转化
String s1 = new String("HELLO");
System.out.println(s1.toLowerCase());//输出hello
String s2 = new String("hello");
System.out.println(s2.toUpperCase());//输出HELLO
3.7 字符串转数组
String s5 = new String("hello");
char[] ch = s5.toCharArray();//字符串转数组的方法
for (char x:ch) {
System.out.println(x); //输出 h e l l o
}
3.8 字符串替换
String s1 = new String("abcdefabdddd");
//替换单个字符
String ret = s1.replace('a','t');//替换生成一个新的对象
System.out.println(ret);//tbcdeftbdddd
//替换字符串
String ret1 = s1.replace("ab","qq");
System.out.println(ret1);//qqcdefqqdddd
//替换字符串中的某一个全部的内容
String ret2 = s1.replaceAll("ab","ss");
System.out.println(ret2);//sscdefssdddd
//替换第一次出现的内容
String ret3 = s1.replaceFirst("ab","hh");
System.out.println(ret3);//hhcdefabdddd
3.9 字符串拆分
String s6 = new String("I am a student");
String[] ret = s6.split(" "); //按空格拆分
for (String s:ret) {
System.out.println(s);
}
public class TestDemo {
public static void main(String[] args) {
String s1 = new String("192.168.11.11");
String[] ret = s1.split(".");
for (String s:ret) {
System.out.println(s);
}
}
}
//正确做法:
public class TestDemo{
public static void main(String[] args) {
String s1 = new String("192.168.11.11");
String[] ret = s1.split("\\."); // 转义
for (String s:ret) {
System.out.println(s);
}
}
}
4. StringBuilder,StringBuffer
public class TestDemo{
public static void main(String[] args) {
StringBuilder stringBuilder1 = new StringBuilder("hello");//"hello"还是在常量池
stringBuilder1.append("world");
System.out.println(stringBuilder1);//追加 相当于String类的 +=
System.out.println(stringBuilder1.length());//求字符串的长度
stringBuilder1.reverse();//将字符串进行逆置
String s1 = stringBuilder1.toString();//用String类型的变量接收
System.out.println(s1);
}
}
//输出结果:
//helloworld
//10
//dlrowolleh
无论是StringBuilder还是StringBuffer,都是在原先的字符串上进行操作,都会return this,如果使用+=就会创建新的对象
4.1 StringBuilder,StringBuffer的区别
可以看到StringBuffer的append()方法是有synchronized修饰的,你可以把它当成是一把锁,在多线程的情况下,当某一个进程在使用这个方法的时候,就会把这个方法锁起来,其余方法无法使用,使用完成后,锁会自动打开。