1.String类的基本概念

1.String表示字符串类型,属于引用数据类型,不属于基本数据类型。
2.在java中随便使用双引号括起来 的都是String对象。
例如:“abc”,“def”,“hello world!”,这是3个String对象。
3.java中规定,双引号括起来的字符串是不可变的。
4.在JDK当中双引号括起来的字符串,例如:“abc” "bbb"都是直接存储在“字符串常量池”当中的。
5、为什么SUN公司把字符串存储在一个“字符串常量池”当中呢?
因为字符串在实际的开发中使用太频繁。为了执行效率,所以把字符串放到了方法区的字符串常量池当中。

String类创建对象

public class StringDemo1 {
    public static void main(String[] args) {
        //1.使用直接赋值的方式获取一个字符串对象
        String s1 = "aaa";
        System.out.println(s1);

        //2.使用new的方式获取一个字符串对象
        //空参构造,可以获取一个空白的字符串对象
        String s2 = new String();
        System.out.println("@"+s2+"!");//@!,s2="";

        //传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
        String s3 = new String("bbb");
        System.out.println(s3);

        //传递一个字符串数组,根据字符数组的内容再创建一个新的字符串对象
        char[] chs ={'a','b','c','d','e','f'};
        String s4 = new String(chs);
        System.out.println(chs);//abcdef
        System.out.println(s4);//abcdef
        //System.out.println(s4==chs);//Operator '==' cannot be applied to "java.lang.String", 'char门]'
                                      // 运算符‘==’不能应用于“java.lang.String”,‘char门]’
        System.out.println(s4.equals(chs));//false,String的equals比较的是:
                                            //先判断地址是否相等,再判断是否是String类型,是的话进行字符比较,都一样则返回true,否则false
        //对象或变量名.getclass().toString(),打印该对象或变量的数据类型
        System.out.println(s4.getClass().toString());//class java.lang.String
        System.out.println(chs.getClass().toString());//class [C
        //System.identityHashCode(对象变量),直接打印出该对象的真实地址
        System.out.println(System.identityHashCode(s4));//1163157884
        System.out.println(System.identityHashCode(chs));//1956725890

        //传递一个字接数组,根据字节数组的内容再创建一个新的字符串对象
        //应用场景:网络当中传输的数据都是字节信息,通过ASCII码转换成字符:48->0,65->A,97->a
        byte[] bytes = {97,98,99,100};
        String s5 = new String(bytes);
        System.out.println(s5);//abcd

    }
}

2.Java的内存模型

java 双引号怎么转义字符串 java string 双引号_字符串

当使用双引号" "直接赋值时,系统会检查该字符串在串池中是否存在。如果存在则会直接复用,否则就会创建一个新的字符串。

java 双引号怎么转义字符串 java string 双引号_java_02


只要是new出来的对象,都会在堆内存的串池中开辟一块新的内存空间来存放字符串

3.字符串比较

java 双引号怎么转义字符串 java string 双引号_java_03


java 双引号怎么转义字符串 java string 双引号_java 双引号怎么转义字符串_04

public class StringDemo2 {
    public static void main(String[] args) {
        //字符串的比较
        //1.==号比较:
        // 基本数据类型:比的是数据值
        // 引用数据类型:比的是地址值
        String s1 = new String("abc");
        String s2 = "abc";
        System.out.println(s1 == s2);//false
        //比较字符串对象中的内容是否相等:equals()
        System.out.println(s1.equals(s2));//true
        //比较字符串对象中的内容是否相等,忽略大小写:equalsIgnoreCase()
        String s3 = "ABC";
        System.out.println(s2.equalsIgnoreCase(s3));//true

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串abc:");
        String s4 = sc.next();//abc new出来的
        String s5 = "abc";
        System.out.println(s4==s5);//false
        System.out.println(s4.equals(s5));//true
        //结论:只要是比较字符串的内容,就必须要用String里面的方法
    }
}

字符串拼接的底层原理:
1.如果没有变量参与,都是字符串相加,编译之后就是拼接之后的结果,会复用堆内存串池中的字符串。
2.如果有变量参与,则会创建新的字符串,浪费内存。

4.StringBuilder类的使用

StringBuilder是一个可变的操作字符串的容器,创建之后里面的内容是可变的,可以提高字符串的操作效率,常用于字符串的拼接和反转。所有要拼接的内容全部放进StringBuilder容器中,不会创建很多无用的空间,浪费内存。

public class StringBuilderDemo1 {
    public static void main(String[] args) {
        //1.空参构造
        StringBuilder sb = new StringBuilder();
        System.out.println(sb);//应为StringBuilder是Java已经写好的类,在底层做了特殊处理,打印对象不是地址值而是属性值
        StringBuilder sb1 = new StringBuilder("555");
        System.out.println(sb1);//555
        sb.append(2.2);//添加元素
        sb.append('A');
        sb.append("ABC");
        sb.append(555);
        sb.append(123);
        sb.append(true);
        System.out.println(sb);//2.2AABC555123true
        System.out.println(sb.getClass().toString());//数据类型:class java.lang.StringBuilder
        System.out.println(System.identityHashCode(sb));//地址值:1163157884
        System.out.println(sb.reverse());//字符串反转
        System.out.println(sb.length());//获取字符串长度
        System.out.println(sb.toString());//变回字符串
        System.out.println(sb.substring(5));//字符串截取:从第五位开始后面的全部截取
        System.out.println(sb.substring(0,3));//字符串截取:从第0位开始到第3位中间全部截取包括第0位不包括第3位
    }
}

运行结果

java 双引号怎么转义字符串 java string 双引号_字符串_05

StringBuilder练习1

用户输入一个字符串判断是否为对称字符串,例如:123321对称,12345不对称。

public class StringBuilderTest1 {
    public static void main(String[] args) {
        //1.输入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();
        //2.反转输入的字符串
        String reslut = new StringBuilder(str).reverse().toString();
        //3.比较
        if (str.equals(reslut)){
            System.out.println(str+"是对称字符串");
        }else {
            System.out.println(str+"不是对称字符串");
        }
    }
}

运行结果

java 双引号怎么转义字符串 java string 双引号_java_06


java 双引号怎么转义字符串 java string 双引号_字符串_07

StringBuilder练习2

把int数组按指定格式拼接成字符串——int[] arr = {1,2,3}->[1,2,3]

public class StringBuilderTest2 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        int[] arr = {1,2,3,4,5,6,7,8,9};
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            sb.append(arr[i]);
            if(i<arr.length-1){
                sb.append(",");
            }
        }
        sb.append("]");
        System.out.println(sb.toString());
    }
}

运行结果

java 双引号怎么转义字符串 java string 双引号_java_08

StringBuilder底层原理

默认创建一个长度为16的字节数组,如果添加的内容长度小于16则直接存,如果添加的内容长度大于16则会扩容(扩大位原来容量的*2+2),如果扩容之后的容量还不够则以实际长度为准。

5.StringJoiner的使用

StringJoiner构造JDK8新增的一个可变的操作字符串的容器,可以高效方便的拼接字符串

StringJoiner练习1

把int数组按指定格式拼接成字符串——int[] arr = {1,2,3}->[1,2,3]

public class StringJoinerDemo1 {
    public static void main(String[] args) {
        //1.创建一个对象,指定中间的间隔符号delimiter,开始的标记prefix,结束的标记suffix
        StringJoiner sj = new StringJoiner(",","[","]");
        //2.添加元素
        sj.add("aaa").add("bbb").add("ccc");
        //3.打印结果
        System.out.println(sj);//[aaa,bbb,ccc]
        System.out.println(sj.length());//13
        System.out.println(sj.toString());//[aaa,bbb,ccc]
    }
}

运行结果

java 双引号怎么转义字符串 java string 双引号_java_09