String类详细解析

String类详细解析

1、String的构造方式:

//方法一

String str="Hello";

//方法二

String str1=new String("Hello");

//方法三

char[] array={'a','b','c','d'};
String str2= new String(array);

2、字符串相等比较

  public static void main3(String[] args) {
        String str1 = "abcdef";//字符串都存在常量池,常量池在堆里。完全相同的字符串在常量池里只存一次。
        String str2 = new String("abcdef");//新的实例化对象
        System.out.println(str1 == str2);//地址不同
        //执行结果false

        String str3 = new String("abcdef");
        System.out.println(str2 == str3);
        //执行结果false

        //如果两个字符串常量直接拼接+ 那么在编译期间就处理为拼接结果。
        String str4 = "ab"+"cdef";//编译期间就变为abcdef
        System.out.println(str1 == str4);
        //执行结果true

        String str5 = "ab" + new String("cdef");
        System.out.println(str1 == str5);
        //执行结果false
        System.out.println(str1.equals(str5));//equals比较的是字符串的内容。写成“str.equals("Hello")”会出现“抛出 java.lang.NullPointerException 异常”。
        //执行结果true

        String str6 = "ab";
        String str7 = "cdef";
        String str8 = str6+str7;
        System.out.println(str1 == str8);
        //执行结果false
        System.out.println(str1.equals(str8));
        //执行结果true

        String str9 = str6+"cdef";
        System.out.println(str1 == str9);
        //执行结果false

        String str10 = "hello" + 10;//"hello10"
        String str11 = "hello10";
        System.out.println(str10 == str11);
        //执行结果true
    }

3、如何使用 String 的 intern 方法来手动把 String 对象加入到字符串常量池中

// 该字符串常量并没有保存在对象池之中
String str1 = new String("hello") ;//实例化对象在堆中。
String str2 = "hello" ;//字符串在常量池
System.out.println(str1 == str2);
// 执行结果false

//intern方法手动写入
String str1 = new String("hello").intern();//手动放入常量池中。
String str2 = "hello" ;
System.out.println(str1 == str2);
// 执行结果
true
/*注意:请解释String类中两种对象实例化的区别?
1. 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
2. 构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用
intern()方法手工入池。*/

4、如何修改字符串

//拼接字符串
String str = "Hello";
str = "h" + str.substring(1);
System.out.println(str);
// 执行结果hello

//反射
使用 "反射" 这样的操作可以破坏封装, 访问一个类内部的 private 成员.
IDEA 中 ctrl + 左键 跳转到 String 类的定义, 可以看到内部包含了一个 char[] , 保存了字符串的内容
String str = "Hello";
// 获取 String 类中的 value 字段. 这个 value 和 String 源码中的 value 是匹配的.
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

5、字符与字符串之间的关系

//字符与字符数组的转换
String str = "abcdef" ;
// 将字符串变为字符数组
char[] data = str.toCharArray() ;
for (int i = 0; i < data.length; i++) {//遍历
System.out.print(data[i]+" ");
}


// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,1,3)); // 部分转换。从1号下标开始往后三个值。

6、查找给定位置字符

String str = "abcdef" ;
System.out.println(str.charAt(0)); // 查找0号下标
// 执行结果
a
System.out.println(str.charAt(10));//字符串下标长度为5,而10超出了下标范围
// 执行结果
产生 StringIndexOutOfBoundsException 异常  //下标越界异常

7、字节与字符串之间的转换

String str = "helloworld" ;
// String 转 byte[]
byte[] data = str.getBytes() ;
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]+" ");
}
// byte[] 转 String
System.out.println(new String(data))

小知识:byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用,更适合针对二进制数据来操作。
char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候。

8、String类中compareTo()方法

在String类中compareTo()方法是一个非常重要的方法,该方法返回一个整型,该数据会根据大小关系返回三类内
容:
1. 相等:返回0.
2. 小于:返回内容小于0.
3. 大于:返回内容大于0.
System.out.println("A".compareTo("a")); // -32
System.out.println("a".compareTo("A")); // 32
System.out.println("A".compareTo("A")); // 0
System.out.println("AB".compareTo("AC")); // -1

9、字符串查找

//contains查找的返回值boolean类型
String str = "helloworld";
System.out.println(str.contains("world")); // true

//indexOf()查找-----使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置
String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w开始的索引
System.out.println(str.indexOf("bit")); // -1,没有查到
if (str.indexOf("hello") != -1) {
System.out.println("可以查到指定字符串!");
}

10、字符串的替换

String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));//替换所有指定内容
System.out.println(str.replaceFirst("l", "_"));//替换首个内容
//注释:由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.

11、字符串拆分

String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}
//按字符串部分拆分
String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;//2是数组长度,按空格拆分
for(String s: result) {
System.out.println(s);
}
//IP地址拆分
String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;//注意“\\”是转义字符
for(String s: result) {
System.out.println(s);
}
/*注意事项:
1. 字符"|","*","+"都得加上转义字符,前面加上"\".
2. 而如果是"",那么就得写成"\\".
3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符*/

12、字符串截取

String str = "helloworld" ;
System.out.println(str.substring(5));//返回值world,从5号下标开始到末尾。
System.out.println(str.substring(0, 5));//返回值hello截取部分字符串,左闭右开。不包含5号下标。

13、StringBuffer 和 StringBuilder

任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer和StringBuilder类。StringBuffer 和 StringBuilder大部分功能是相同的。
在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法。

public synchronized StringBuffer append(各种数据类型 b)//适用于多线程,而且多线程安全。
public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();
    sb.append("Hello").append("World");
    fun(sb);
    System.out.println(sb);
}
public static void fun(StringBuffer temp) {
    temp.append("\n").append("www.bit.com.cn");

String和StringBuffer最大的区别在于:String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页