Java字符串
创建一个字符串对象
在Java中用" "(双引号)括起来的都是字符串
用' '(单引号)括起来的都是字符
字符串的内容不能发生改变,创建后不能被更改
如果想对字符串的内容进行更改,需要使用StringBuffer或StringBuilder
//直接创建
String s = "abc";
//使用字符数组创建
char[] c = {'a','b','c'};
String str = new String(c);
字符串常用方法
- 求字符串的长度—— int length()
System.out.println(s.length());
- 查找指定字符的索引—— int indexOf()
索引从0开始,如果有多个相同字符,则返回此字符第一次出现的位置
System.out.println(s.indexOf("a"));
- 查找指定的字符—— char charAt()
可以通过此方法,遍历整个字符串,输出所有字符
String s = "abc";
for(int i = 0;i<s.length();i++) {
System.out.println(s.charAt(i));
}
//换行逐个输出:abc
- 去除字符串首尾的空格——String trim()
String s = " abc ";
System.out.println(s.trim());
//输出结果abc
- 判断是否包含某个字符——Boolean contains()
String s = "abc";
System.out.println(s.contains("a"));
- 判断是否从某个字符开始/结束 ——Boolean startWith() / endsWith()
String s = "abc";
System.out.println(s.startsWith("a"));
System.out.println(s.endsWith("c"));
- 替换字符—— replace(char old,char new)
String s = "abc";
System.out.println(s.replace("c", "d"));
//输出:abd
比较两个字符串是否相等
- 比较两个字符串是否相等——Boolean equals()
这里需要注意一个问题,“==”运算符和 equals()方法的区别
使用“==”运算符做比较:
如果比较的是基本数据类型,就会比较两者的数据值是否相同
如果比较的是引用数据类型,就会比较两者的地址值是否相同
使用equals()方法做比较:
如果比较的是字符串,就会比较两者内容是否相同,因为String重写了equals()方法
如果比较的是对象,就会比较两者的对象的引用是否相同
举几个例子
首先来看一下字符数组的比较
char[] c1 = {'a','b','c'};
char[] c2 = {'a','b','c'};
System.out.println(c1==c2);
System.out.println(c1.equals(c2));
System.out.println(Arrays.equals(c1, c2));
输出:
false
false
true
解释一下为什么会输出这样的结果
第一个false:因为字符数组是一个对象,属于引用数据类型,它们的地址不同
“==”运算符比较的是两者的地址是否相同,所以输出false
第二个false:equals()方法是比较两者是否是同一个对象,显然不是同一个数组对象,输出false
第三个true:Arrays.equals()方法只比较两个数组中的内容是否相同,因此输出true
再来看一下字符串
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
输出:
true
true
这里可能就有疑问了,为什么看起来不是同一个对象,比较的时候还会输出true
因为用到了内存中的常量池,当运行到s1创建对象时,如果常量池中没有,就在常量池中创建一个对象"abc",第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相同
最能体现“==”和equals()方法两者区别的地方来了
char[] c = {'a','b','c'};
String s1 = new String(c);
String s2 = "abc";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
输出:
false
true
第一个false:虽然两个字符串具有相同的值,但它们在内存中的地址不同,因此输出false
第二个true: 由于String重写了equals()方法,只比较字符串的内容,因此输出true
字符串类型转换
int转String:
第一种方法:用空的字符串与int相加
int number = 100;
String str = ""+number;
第二种方法:调用valueOf()方法
int number = 100;
String s = String.valueOf(number);
String转int:
第一种方法:使用Integer的parseInt()方法
String s = "100";
int num = Integer.parseInt(s);
第二种方法:使用Integer的valueOf()方法
String s = "100";
Integer i = Integer.valueOf(s);
int num = i.intValue();
StringBuilder和StringBuffer
这两个类都可以对字符串进行修改
两者的区别在于:
StringBuilder:非线程安全,不同步
StringBuffer:线程安全,同步
线程安全指的是在多线程环境中,在调用 StringBuffer 方法时,会对 StringBuffer 对象进行加锁,只有获得锁的线程才能够执行该方法,其他线程则需要等待直到锁被释放。这确保了在任何时候只有一个线程能够修改 StringBuffer 对象,从而避免了多线程环境下的数据竞争和不一致性问题
创建StringBuilder、StringBuffer字符串
StringBuilder str = new StringBuilder();
StringBuffer stf = new StringBuffer();
方法:大致分为增删改查
1.增
- append():将指定的字符串加入到字符序列中
StringBuilder str = new StringBuilder();
str.append("abc");
str.append("def");
System.out.println(str);
输出:abcdef
也可以采用链式编程的方式添加字符
StringBuilder s2 = new StringBuilder();
s2.append("链").append("式").append("编").append("程");
System.out.println(s2);
输出:
链式编程
2.删
- delete(int start,int end):删除指定区域的字符串
- deleteCharAt():删除指定索引处的字符
StringBuilder s1 = new StringBuilder("abc");
s1.deleteCharAt(0);
System.out.println(s1);
输出:bc
3.改
- reverse():反转字符序列
- toString():将StringBuffer类型的序列转变为String类型的字符串
- insert(int index,任意类型):将任意类型的字符插入到指定索引中
StringBuilder str = new StringBuilder("abc");
str.insert(1,"d");
System.out.println(str);
输出:adbc
4.查
- int length():返回字符序列的长度
- int capacity():返回当前 StringBuilder 对象的容量