字符串的概述与分类

1.字符串的分类

​ 不可变字符串:String :当前对象创建完毕之后,该对象的内容是不能改变的 ,一旦内容改变就是一个新的对象。

​ 可变的字符串:StringBuilder/StringBuffer:当对象创建之后,该对象的内容可以发生改变,对象保持不变。

2.接口CharSquence

​ 实现子类有:CharBuffer,Segment,String,StringBuilder,StringBuffer

3.字符串的本质是对char数组封装

​ crtl+shift+t看某个类

​ crtl+o看某个方法

深入String类分析

public class Demo06 {
    public static void main(String[] args) {
        String str1 = "2019";
        System.out.println(str1);
        str1 = "2020";
        //str1引用的内存地址发生了改变
        System.out.println(str1);
    }
}

String 对象的创建

String str1 = "ABCD";
//直接赋一个字面量
String str2 = new String("ABCD");
//通过构造器创建

String对象的空值:

//1.表示引用为空
String str1 = null;
//2.内容为空的字符串
String str2 = "";

判断字符串非空:

1.字符串引用非空
2.字符串不能为空字符串

字符串的比较操作:

1.使用"=="号    
    只能比较引用的内存地址是否相同
2.使用equals方法。
    在object类中和"=="相同,建议子类覆盖equals方法比较内容

String面试题分析

面试题一:

问题一:
String str1 = "ABCD"; 和String str2 = new("ABCD");有什么区别
问题二:
下面代码分别创建了几个String对象?
String str1 = "ABCD"; 和String str2 = new("ABCD");

常量池:专门存储常量的地方。
    编译常量池:把字节码加载进Jvm的时候,存储的是字节码的相关信息
    运行常量池:存储常量数据
String str1 = "ABCD";最多只创建一个String对象,最少不创建String对象。如果常量池中,存在"ABCD",那么str1直接引用,此时不创建String对象。否则先在常量池中创建"ABCD"内存空间,再引用。
String str2 = new("ABCD");最多创建两个对象,至少创建一个String对象。new关键字:绝对会在堆空间,创建内存区域,所以至少创建一个String对象。
    

1563803574758

public class Demo07 {
    public static void main(String[] args) {
        String str1 = "ABCD";
        String str2 = new String("ABCD");
        System.out.println(str1==str2);        //false
        System.out.println(str1.equalsIgnoreCase(str2));    //true
    }
}

面试题二:

下列String对象之间是否相等

public class Demo07{
    private static String getx() {
        return "AB";
    }
    public static void main(String[] args) {
        String str1 = "ABCD";
        String str2 = "A"+"B"+"C"+"D";
        String str3 = "AB"+"CD";
        String str4 = new String("ABCD");
        String temp = "AB";
        String str5 = temp+"CD";
        String str6 = getx()+"CD";

        String str7 = (new StringBuilder(String.valueOf(temp))).append("cd").toString();
        /*
         * 实质为
        String str1 = "ABCD";
        String str2 = "ABCD";
        String str3 = "ABCD";
        String str4 = new String("ABCD");
        String temp = "AB";
        String str5 = (new StringBuilder(String.valueOf(temp))).append("cd").toString();;
        String str6 = (new StringBuilder(String.valueOf(getx()))).append("cd").toString();;        
        
        */
        System.out.println(str1==str2);
        System.out.println(str1==str3);
        System.out.println(str1==str4);
        System.out.println(str1==str5);
        System.out.println(str1==str6);
        System.out.println();
    }
}
1、单独使用""创建的字符串都是直接量,编译期就已经确定存储到常量池中。
2、使用new String("")创建的对象会存储在堆内存中,是运行期才创建。
3、使用只包含直接量的字符串连接符如"aa"+"bb"创建的也是直接量,编译期就能确定,已经确定存储到常量池中。
4、使用包含String直接量(无final修饰符)的字符串表达式,创建的对象是运行期才创建的,存储在堆中。
    通过变量,调用方法去连接字符串,都只能在运行期才能确定变量的值和方法的返回值,不存在编译器优化操作。

String类的常用方法

import java.util.Arrays;

public class Demo08 {
    public static void main(String[] args) {
        builderString();
        getStringInFo();
        stringEquals();
        toupper_lower();
    }
    private static void toupper_lower() {
        /*
         * String toUpperCase();
         * String toLowerCase();
         */
        String  str1 = "AhHiGHNhO";
        System.out.println(str1.toUpperCase());
        System.out.println(str1.toLowerCase());
    }
    private static void stringEquals() {
        /*
         * boolean equals(Object anObject); 将字符串与指定的对象比较
         * boolean equalsIngoreCase(String anotherString);将字符串与指定的字符串比较,不考虑大小写
         * boolean contentEquals(CharSquence cs); 将字符串与指定的CharSquence比较
         */
        String str1 = new String("ABCD");
        String str2 = "ABCD";
        String str3 = "abCD";
        System.out.println(str1==str2);
        System.out.println(str1.contentEquals(str2));
        System.out.println(str1.equalsIgnoreCase(str3));
        System.out.println(str1.contentEquals("ABCD"));
    }
    private static void builderString() {
        /*
         * byte[] getBytes()  将字符串转换为byte数组
         * char[] toCharArray()    将字符串转换为字符数组
          * String(byte[] bytes) 将byte数组转化为字符串
         * String(char[] values) 将char数组转换为字符串
         */
        
        
        char[] arr = new char[] {'A','B','C'};
        //将char数组转换成字符串
        String str1 = new String(arr);
        System.out.println(str1);
        //将字符串转换为char数组
        char[] arr1 = str1.toCharArray();
        System.out.println(arr1);

        //byte和字符串相互转换
        System.out.println(Arrays.toString("ABCDE".getBytes()));
     }
    public static void getStringInFo() {
        // int length() 返回字符串长度
        // char cahrAt(int index) 返回指定索引的处的char值
        // int  indexOf(String str) 返回指定字符串在此字符串中第一次出现的位置
        // int LastIndexOf(String str) 返回指定字符串在此字符串最后一次出现的位置
        String str = new String("DABCDBA");
        System.out.println(str.length());
        System.out.println(str.charAt(3));
        System.out.println(str.indexOf("HI"));
        System.out.println(str.indexOf("CD"));
        System.out.println(str.lastIndexOf("DA"));
    }
}
Last modification:November 13th, 2019 at 08:52 pm
如果觉得我的文章对你有用,请随意赞赏