一、关于String类
String实际上与System类和Scanner类一样,都是Java库中一个预定义的类,String类是final的,不可被继承的。String类不是基本数据类型,而是引用类型。
String类是通过char数组来保存字符串的,所以String一旦创建也是不可改变的。char类型只能表示一个字符。
字符串是一种不可变对象,它的内容不可改变。
String类的内部实现也是基于 char[] 来实现的,但是 String 类并没有提供 set 方法之类的来修改内部的字符数组。
那么如果实在需要修改字符串, 有如下方法:
a) 常见办法:借助原字符串, 创建新的字符串
String str = “Hello”;
str = “h” + str.substring(1);
System.out.println(str);
// 执行结果
hello
b) 特殊办法:使用 “反射” 这样的操作可以破坏封装,访问一个类内部的 private 成员。
String str = “Hello”;
Field valueField = String.class.getDeclaredField(“value”);
// 将这个字段的访问属性设为 true
valueField.setAccessible(true);
// 把 str 中的 value 属性获取到.
char[] value = (char[]) valueField.get(str);
// 修改 value 的值
value[0] = ‘h’;
System.out.println(str);
// 执行结果
hello
二、字节,字符与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换。
1、字符与字符串
//字符串与字符数组的转换
public static void main(String[] args) {
String str = "hello world";
//字符串变为字符数组
char[] data = str.toCharArray();
for (int i = 0;i < data.length;i++){
System.out.println(data[i]+" ");
}
//字符数组转为字符串
System.out.println(new String(data));//全部转换
System.out.println(new String(data,5,5));//部分转换
}
//类型:普通。 取得指定索引位置的字符,索引从0开始。
public static void main1(String[] args) {
String str = "hello world";
System.out.println(str.charAt(0));
}
2、字节与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换。
//实现字符串与字节数组的转换
public static void main3(String[] args) {
String str = "hello world";
//String转byte[]
byte[] data = str.getBytes();
for(int i = 0;i <data.length;i++){
System.out.println(data[i]+" ");
}
//byte[]转String
System.out.println(new String(data));
}
三、关于字符串的常见操作方法
1、字符串的比较
//比较两个字符串大小关系
public static void main(String[] args) {
String str1 = "hello";
String str2 = "Hello";
System.out.println("A".compareTo("a"));//小于
System.out.println("a".compareTo("A"));//大于
System.out.println("A".compareTo("A"));//相等,返回0
}
//关于区不区分大小写的比较
public static void main4(String[] args) {
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.equals(str2));//false 区分大小写的比较
System.out.println(str2.equalsIgnoreCase(str2));//true 不区分大小写的比较
}
2、字符串查找
//判断开头或结尾
public static void main(String[] args) {
String str = "**@@hello world!!";
System.out.println(str.startsWith("**"));//true
System.out.println(str.endsWith("!!"));//true
}
//关于indexOf
public static void main8(String[] args) {
String str = "hello world";
System.out.println(str.indexOf("l"));//2 只能返回查找的第一个位置
System.out.println(str.indexOf("l",5));//从下标为5的地方开始查找
System.out.println(str.lastIndexOf("l"));//8 从后向前查找
}
//从头开始查找指定字符串的位置,查到了返回位置的开始索引,如果查不到返回-1
public static void main7(String[] args) {
String str = "hello world";
System.out.println(str.indexOf("world"));//5
System.out.println(str.indexOf("our"));//-1
if (str.indexOf("hello") != -1){
System.out.println("可以查到指定字符串");
}
}
//判断一个字符串是否存在
public static void main6(String[] args) {
String str = "hello world";
System.out.println(str.contains("hello"));//true
}
3、字符串替换
//字符串的替换处理
public static void main(String[] args) {
String str = "hello world";
System.out.println(str.replaceAll("l","_"));//替换所有
System.out.println(str.replaceFirst("l","_"));//替换首个内容
}
4、字符串拆分
//将字符串部分拆分,该数组长度就是limit极限
public static void main(String[] args) {
String str = "welcome to our shool";
String[] result = str.split(" ",3);
for (String s:result) {
System.out.println(s);
}
}
//将字符串全部拆分
public static void main2(String[] args) {
String str = "welcome to our shool";
String[] result = str.split(" ");//按照空格拆分
for (String s:result) {
System.out.println(s);
}
}
//多次拆分
public static void main(String[] args) {
String str = "name=zhuyilong&age=32";
String[] result = str.split("&");
for (int i = 0;i < result.length;i++){
String[] tmp = result[i].split("=");
System.out.println(tmp[0]+"="+tmp[1]);
}
}
5、字符串截取
//字符串截取:前闭后开区间的写法,substring(0,5)表示包含0号下标的字符,不包含5号下标
public static void main(String[] args) {
String str = "helloworld";
System.out.println(str.substring(5));//从指定索引截取到结尾
System.out.println(str.substring(0,5));//截取部分内容
}
6、其他操作方法
public static void main2(String[] args) {
String str = "hello%##@@world嘿嘿~";
//关于isEmpty()方法
System.out.println("hello".isEmpty());//false
System.out.println(new String().isEmpty());//true
//长度
System.out.println(str.length());
//大小写转换:只转换字母
System.out.println(str.toLowerCase());
System.out.println(str.toUpperCase());
}
//去掉字符串中的左右空格,保留中间空格
public static void main1(String[] args) {
String str = " hello world ";
System.out.println("["+str.trim()+"]");
//trim会去掉字符串开头和结尾的空白字符(空格,换行,制表符等)
}
四、 StringBuffer 和 StringBuilder
String的拼接会优化为StringBuilder append()
String和StringBuilder和StringBuffer的区别:
1、String的拼接会产生大量临时变量。StringBuilder和StringBuffer不会。(append返回的是一个this)
2、String拼接会被优化为StringBuilder的append()
3、String和StringBuilder一般用于单线程情况下,StringBuffer一般用于多线程。
3、后两者当中有一些方法是String不具备的。(如逆置方法等)