1. String,StringBuffer,StringBuilder

1. String类的使用

package com.wz.test01;

import java.util.Arrays;

public class test01 {
    /**
     * 字符串相关类
     * 分类:
     *      String、StringBuffer、StringBuilder
     */
    public static void main(String[] args) {
        String str="123abc";
        System.out.println(str);
        System.out.println("concat(\"def123\") 拼接字符串,并返回新的字符串");
        str=str.concat("def123");//拼接字符串,并返回新的字符串
        System.out.println(str);
        System.out.println("---------------");


        System.out.println(str);
        System.out.println("substring(2) 从开始下标出截取到字符串末尾");
        str=str.substring(2);//从开始下标出截取到字符串末尾
        System.out.println(str);
        System.out.println("---------------");


        String str1="abc123def456";
        System.out.println(str1);
        System.out.println("substring(3,6) 从开始(包含)下标处截取到结束(不包含)下标处,返回新字符串");
        str1=str1.substring(3,6);//从开始(包含)下标处截取到结束(不包含)下标处,返回新字符串
        System.out.println(str1);
        System.out.println("---------------");


        String str2="abc123def";
        System.out.println(str2);
        str2=str2.toUpperCase();//转大写
        System.out.println(str2+"转大写");
        str2=str2.toLowerCase();//转小写
        System.out.println(str2+"转小写");
        System.out.println("---------------");


        String str4="    123    abc    456    def      ";
        System.out.println(str4);
        System.out.println("trim() 去除首尾空格");
        str4=str4.trim();//去除首尾空格
        System.out.println(str4);
        System.out.println("replace('a','A') 替换字符,并返回新的字符串");
        str4=str4.replace('a','A');//替换字符,并返回新的字符串
        System.out.println(str4);
        System.out.println("replaceAll(\"bc\",\"BBCC\") 替换字符串,并返回新的字符串");
        str4=str4.replaceAll("bc","BBCC");//替换字符串,并返回新的字符串
        System.out.println(str4);
        System.out.println("replaceAll(\" \",\"\") 将空格转换为空内容,达到去空格的效果");
        str4=str4.replaceAll(" ","");//将空格转换为空内容,达到去空格的效果
        System.out.println(str4);
        System.out.println("---------------");


        String str5="abc123def456";
        System.out.println(str5);
        System.out.println("str5.equals(\"abc123def456\") 判断两个字符串内容是否相同:(区分大小写)");
        System.out.println("判断两个字符串内容是否相同:(区分大小写)"+str5.equals("abc123def456"));
        System.out.println("str5.equalsIgnoreCase(\"ABC123Def456\") 判断两个字符串内容是否相同:(不区分大小写)");
        System.out.println("判断两个字符串内容是否相同:(不区分大小写)"+str5.equalsIgnoreCase("ABC123Def456"));
        System.out.println("str5.startsWith(\"abc\") 判断字符串是否以某个字符串开头");
        System.out.println("判断字符串是否以某个字符串开头:"+str5.startsWith("abc"));
        System.out.println("str5.endsWith(\"456\") 判断字符串是否以某个字符串结尾");
        System.out.println("判断字符串是否以某个字符串结尾:"+str5.endsWith("456"));
        System.out.println("---------------");

        String str6="abc123def456abc123";
        System.out.println(str6);
        System.out.println("str6.indexOf(\"c\")  判断字符串第一次出现的下标");
        System.out.println("判断字符串第一次出现的下标:"+str6.indexOf("c"));
        System.out.println("str6.lastIndexOf(\"c\") 判断字符串最后一次出现的下标");
        System.out.println("判断字符串最后一次出现的下标:"+str6.lastIndexOf("c"));
        System.out.println("str6.charAt(7) 获取指定下标上的字符");
        System.out.println("获取指定下标上的字符:"+ str6.charAt(7));
        System.out.println("---------------");

        System.out.println("str6.length() 获取字符串长度");
        System.out.println("获取长度:"+str6.length());
        System.out.println("str6.toCharArray()  将字符串转换为字符数组");
        char[] cs=str6.toCharArray();//将字符串转换为字符数组
        System.out.println(Arrays.toString(cs));
        System.out.println("---------------");

        System.out.println("将其他类型转为字符串类型:");
        System.out.println("String.valueOf()");
        System.out.println("将int转为String: "+String.valueOf(100));
        System.out.println("将double转为String: "+String.valueOf(123.123));
        System.out.println("将boolean转为String: "+String.valueOf(true));
        System.out.println("将char转为String: "+String.valueOf('A'));

        System.out.println("将int转为String: "+100+"");
        System.out.println("将double转为String: "+123.123+"");
        System.out.println("将boolean转为String: "+true+"");
        System.out.println("将char转为String: "+'A'+"");
    }
}

2023年5月29日,String,StringBuffer,StringBuilder_System

2. StringBuffer的使用

package com.wz.String_class;

public class test02 {
    /**
     *知识点:StringBuffer的使用
     */
    public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer();
        System.out.println("append(\"123abc\") 在末尾追加字符串");
        stringBuffer.append("123abc");
        stringBuffer.append("456def");
        System.out.println(stringBuffer);
        System.out.println("insert(6,\"XXXYYY\") 在指定下标处插入字符串");
        stringBuffer.insert(6,"XXXYYY");
        System.out.println(stringBuffer);
        System.out.println("replace(6,12,\"xxyy\") 从开始(包含)下标处替换到结束(排他)下标处的字符串");
        stringBuffer.replace(6,12,"xxyy");
        System.out.println(stringBuffer);
        System.out.println("deleteCharAt(4) 删除指定字符串");
        stringBuffer.deleteCharAt(4);
        System.out.println(stringBuffer);
        System.out.println("delete(3,12) 从开始(包含)下标处删除到结束(排他)下标处的字符串");
        stringBuffer.delete(3,12);
        System.out.println(stringBuffer);
        System.out.println("reverse() 反转字符串");
        stringBuffer.reverse();
        System.out.println(stringBuffer);
    }
}

2023年5月29日,String,StringBuffer,StringBuilder_bc_02

3. StringBuilder的使用

package com.wz.String_class;

public class test03 {
    /**
     *知识点:StringBuilder的使用
     */
    public static void main(String[] args) {
        StringBuilder StringBuilder = new StringBuilder();
        System.out.println("append(\"123abc\") 在末尾追加字符串");
        StringBuilder.append("123abc");
        StringBuilder.append("456def");
        System.out.println(StringBuilder);
        System.out.println("insert(6,\"XXXYYY\") 在指定下标处插入字符串");
        StringBuilder.insert(6,"XXXYYY");
        System.out.println(StringBuilder);
        System.out.println("replace(6,12,\"xxyy\") 从开始(包含)下标处替换到结束(排他)下标处的字符串");
        StringBuilder.replace(6,12,"xxyy");
        System.out.println(StringBuilder);
        System.out.println("deleteCharAt(4) 删除指定字符串");
        StringBuilder.deleteCharAt(4);
        System.out.println(StringBuilder);
        System.out.println("delete(3,12) 从开始(包含)下标处删除到结束(排他)下标处的字符串");
        StringBuilder.delete(3,12);
        System.out.println(StringBuilder);
        System.out.println("reverse() 反转字符串");
        StringBuilder.reverse();
        System.out.println(StringBuilder);
    }
}

2023年5月29日,String,StringBuffer,StringBuilder_bc_03

2. 深入字符串

1.深入String之创建对象

package com.wz.String_class;

public class test04 {
    /**
     * 知识点:深入String之创建对象
     *
     */
    public static void main(String[] args) {
        //面试题一:以下代码会创建几个String对象
        //答:1个,"abc"存在常量池中,常量池中的数据是唯一的
//		String str1 = "abc";//0x11
//		String str2 = "abc";//0x11
//		System.out.println(str1 == str2);//true

        //面试题二:以下代码会创建几个String对象
        //答:3个,"abc"放在常量池中+new了2个
        String str1 = new String("abc");
        String str2 = new String("abc");
        System.out.println(str1 == str2);//false
    }
}

2.深入String之拼接字符串问题

package com.wz.String_class;

public class test05 {
    /**
     * 知识点:深入String 之 拼接字符串问题
     */
    public static void main(String[] args) {

        String str1 = "abc";
        String str2 = "abc";
        System.out.println(str1 == str2);//true

        //注意:字面值常量在编译时就直接拼接
        String str3 = "ab" + "c";
        System.out.println(str1 == str3);//true

        //注意:常量在编译时就直接拼接
        final String s1 = "ab";
        final String s2 = "c";
        String str4 = s1 + s2;
        System.out.println(str1 == str4);//true

        String s3 = "ab";
        String s4 = "c";
        String str5 = s3 + s4;//底层实现:new StringBuidler(String.valueOf(s3)).append(s4).toString()
        System.out.println(str1 == str5);//false


    }
}

3. StringBuilder 与 StringBuffer底层

/**
	 * 知识点:StringBuilder和StringBuffer的底层原理
	 * 
	 * 继承关系:
	 * 		StringBuilder extends AbstractStringBuilder
	 * 		StringBuffer extends AbstractStringBuilder
	 * 
	 * 小结:
	 * 		1.StringBuilder和StringBuffer将数据存储在父类AbstractStringBuilder中的char类型的数组中
	 * 		2.缓冲数组的默认大小16
	 * 		3.StringBuilder的功能完全依赖父类AbstractStringBuilder
	 * 		4.StringBuffer的功能完全依赖父类AbstractStringBuilder
	 * 		5.StringBuilder和StringBuffer的使用是一模一样的
	 * 		6.StringBuilder是线程不安全的,单线程下使用
	 * 		7.StringBuffer是线程安全的,多线程下使用 - synchronized
	 */

4. String vs StringBuilder vs StringBuffer

/**
	 * 知识点:String vs StringBuilder vs StringBuffer
	 * 
	 * String的理解:
	 * 		String是不可变类, 即一旦一个String对象被创建, 
	 * 		包含在这个对象中的字符序列是不可改变的, 直至该对象被销毁。 
	 * 		String类是final类,不能有子类。
	 * 		public class String{
	 * 			private final char[] value;
	 * 		}
	 * 
	 * StringBuilder和StringBuffer的理解:
	 * 		StringBuilder和StringBuffer称为字符串缓冲区,
	 * 		它的工作原理是:new对象预先申请一块内存,存放字符序列(字符数组),
	 * 		默认大小为16个长度,如果字符序列满了,会重新改变缓存区的大小(扩容机制:原来长度*2+2),
	 * 		以容纳更多的字符序列。
	 * 		StringBuilder和StringBuffer是可变对象(可扩容),这个是String最大的不同
	 * 		StringBuilder和StringBuffer代表可变的字符序列。
	 */