字符串本质是char[]类型的数组。

分类

  1. 不可变字符串String:定义好之后不能再修改,要修改只能创建新的内存地址
  2. 可变字符串:定义好之后还可以进行修改,改变时不会创建新的地址。
    可变字符串有StringBuilder和StringBuffer。String、StringBuilder和StringBuffer都实现了CharSequence接口。

String创建

  1. 直接赋值 String str = "lala"; 要么创建一个对象,要么不创建;
    会先到常量池中看一下有没有存在该字符串常量,如果已经有了,就直接使用,不会创建新的地址;如果常量池中没有,就会在常量池中创建一个对象。
  2. 通过构造器来创建 String str2 = new String("lala"); 至少要创建一个对象,因为使用了new必然要在堆中创建一个对象。
    创建时在常量池中查找有没有传入的字符串常量,如果没有,创建一个字符串常量放到常量池中。

字符串对象值为空

  1. 表示引用为空, String str = null; 还没有初始化,没有被分配内存空间。
  2. 表示空字符串, String str = ""; 已经创建了对象,已经分配了内存,内容为空。

字符串的比较

比较两个字符串相不相等

  1. == 比较两个字符串地址是否相等
  2. 使用equals(),它的逻辑是先比较两个字符串地址是否相等,若相等则字符串相等;若不相等,则判断该变量是否为字符串类型变量,若是再逐个字符比较。
    (建议子类根据自己的需求去覆盖equals方法)

字符串编译优化

凡是单独使用""引用起来的,都是直接量,在编译时期就已经确定好了。

String str = "ABCD";
String str = "A"+"B"+"C"+"D";
String str = "AB"+"CD";

编译之后都是String str = "ABCD";

字符串常用方法

  1. char数组转换成字符串
char[] cs = new char[]{'A','B','C'};
        String str = new String(cs);
  1. 字符串转换成char类型数组
char[] cs2 = str.toCharArray();
  1. 获取字符串中的信息
String str2 = "ialxh";
        //返回字符串长度
        System.out.println(str2.length());
        //获取字符串当中的某一个字符
        System.out.println(str2.charAt(2));
        
        //返回一个子字符串在字符串第一次出现中的位置
        String str3 = "ABCDEFCDG";
        String str4 = "CD";
        System.out.println(str3.indexOf(str4));

        //返回一个子字符串在字符串最后一次出现中的位置
        System.out.println(str3.lastIndexOf(str4));
  1. 大小写转换
//小写字母转换成大写
        str.toUpperCase();
        //大写字母转换成小写
        str.toLowerCase();
  1. 忽略大小写判等
str4.equalsIgnoreCase(str5);
  1. 字符串截取
//字符串分割
        String fileNames = "abc.java;hello.myxq;hello.txt.java;hello.class";
        String[] res = fileNames.split(";");
        System.out.println(Arrays.toString(res));
        //判断每一个元素是否以hello开头
        //遍历数组
        for(String name : res){
            //System.out.println(name);
            //是否以hello开头
            //判断字符串是否以指定字符串开头
            if(name.startsWith("hello")){
                //从最后一个点. 获取最后一个点的位置
                int index = name.lastIndexOf(".");
                //截取字符串
                String newName = name.substring(index);
                System.out.println(name);
            }
        }
  1. 把一个单词的首字母变成大写
String name = "mashroom";
        //1.获取第一个字母
        String res = name.substring(0,1);
        //2.把获取的第一个字母变成大写
        res = res.toUpperCase();
        //3.获取除第一个字母的后面所有内容
        String lastString = name.substring(1);
        //4.把大写字母与其拼接
        System.out.println(res+lastString);
  1. 去掉字符串中的空格
//去空格
        //1.去掉首尾的空格
        String s = " mash room ";
        s = s.trim();//去掉首尾的空格
        //2.去掉所有的空格
        s = s.replace(" ","");//用一个新字符去代替老字符

        String str1 = "";
        String str2 = null;
        String str3 = " ";

        if(str3 != null && !"".equals(str3)){
            System.out.println("不为空");
        }else{
            System.out.println("为空");
        }

字符串拼接耗时

String > StringBuffer > StringBuilder
StringBuilder : 没有synchronized,效率更高
StringBuffer : 方法前面多了synchronized,加锁,更安全,效率相对低一些