Java常用类之String类

一、String类

1.==与equals的区别

== 比较的是引用类型,是地址值是否相同,是否是同一个对象
equals 比较的是引用类型,默认是比较地址值,而String类重写了equals方法,比较的是内容是否相同

public class App {
    public static void main(String[] args) throws Exception {
        String str1 = "abc";
        String str3 = new String("abc");
        System.out.println(str1 == str3);
        System.out.println(str1.equals(str3));
    }
}

在这里插入图片描述
因为str1和str3不是同一个对象,所以str1==str2是false
但是他们二者内容相同,所以str1.equals(str2)是true

2.定义一个字符串

String str1 = "string1";
String str2 = new String("string2");

以上两种定义方式的区别:
str1 会先在常量池里查找有没有内容是“string1”的常量,有的话那么str1就指向这个常量;如果没有,则会在常量池中new一个string1为内容的对象。
str2会直接先创建一个对象(常量池中已存在,则只需在堆中创建)或者两个对象(常量池中没有,所以堆和常量池中都要创建)。
实例分析

public class App {
    public static void main(String[] args) throws Exception {
        String str1 = "abc";
        String str2 = "abc";
        String str3 = new String("abc");
        String str4 = new String("abc");
        System.out.println(str1 == str2);
        System.out.println(str3 == str4);
        System.out.println(str1 == str3);
        System.out.println(str1.equals(str3));
    }
}

在这里插入图片描述
因为创建str1和str2时,会先查看常量池里是否存在“abc”的常量,再将str1和str2指向该常量,所以str1和str2指向的是同一个对象,所以str1==str2为true。
而str3和str4分别创建了对象,他们指向的是不同的对象,所以str3==str4是false。
同理str1和str3也不可能是同一个对象,所以str1==str3
是false。
然后这四个内容都是“abc”,所以不管是哪个都是使用equals方法都是true。

3.String好像可以修改它的值

这种想法是错误的

public class App {
    public static void main(String[] args) throws Exception {
        String str1 = "abc";
        str1 = "change";
        System.out.println(str1);
    }
}

在这里插入图片描述
看上去就是str1被重新赋值了。其实只是str1从原来指向常量池里的“abc”对象,转而指向常量池里的“change”对象了。而不是str1的对象原本值为“abc”,被修改为“change”。

4.字符串相加

public class App {
    public static void main(String[] args)  {
        String str1 = "abc" + "d";
        String str2 = "abc";
        String str3 = "d";
        String str4 = str2 + str3;
        System.out.println(str1 == str4);
    }
}

在这里插入图片描述
str1在编译时,计算机会直接将“abc”和“d”连接起来,获得“abcd”,然后查看常量池里是否有“abcd”;而str4在编译时,他并不知道str2和str3里是什么,所以他会直接在常量池里创建一个对象。所以str1和str4指向的并不是同一个对象。

5.String类的方法——查找功能

5.1查找某一个子串在字符串中的索引

从前往后找第一次出现的索引 indexOf(“字符/字符串”)
从某个序列开始,子串第一次出现的索引 indexOf(“字符/字符串”,(int)从这里开始)

public class App {
    public static void main(String[] args)  {
        String str1 = "abcdc abc";
        System.out.println(str1.indexOf("c"));
        System.out.println(str1.indexOf("bc"));
        System.out.println(str1.indexOf("c",5));
        System.out.println(str1.indexOf("bc", 5));
    }
}

在这里插入图片描述

5.2从后往前查找某一子串在字符串中首次出现的索引

lastIndexOf(“字符/字符串”)
lastIndexOf(“字符/字符串”,(int)从这里开始从后往前找)

public class App {
    public static void main(String[] args)  {
        String str1 = "abcdc abc";
        System.out.println(str1.lastIndexOf("c"));
        System.out.println(str1.lastIndexOf("bc"));
        System.out.println(str1.lastIndexOf("c",5));
        System.out.println(str1.lastIndexOf("bc", 5));
    }
}

在这里插入图片描述

5.3返回字符串中索引位置处的字符

charAt((int)索引值)

public class App {
    public static void main(String[] args)  {
        String str1 = "abcdc abc";
        System.out.println(str1.charAt(7)); //b(最后一个b)
    }
}

5.4判断字符串中是否以某一子串开头

startsWIth(“字符/字符串”)
==startsWIth(“字符/字符串”,n)==从索引为n处开始,查看字符串是否以某一子串开头。

public class App {
    public static void main(String[] args)  {
        String str1 = "abcdc abc";
        System.out.println(str1.startsWith("a"));
        System.out.println(str1.startsWith("a",6));
        System.out.println(str1.startsWith("a",5));
    }
}

在这里插入图片描述

5.5判断字符串中是否以某一子串结尾

endsWIth(“字符/字符串”)

public class App {
    public static void main(String[] args)  {
        String str1 = "abcdc abc";
        System.out.println(str1.endsWith("c")); //true
    }
}

5.6判断字符串中是否包含某一子串

contains(“字符/字符串”)

public class App {
    public static void main(String[] args)  {
        String str1 = "abcdc abc";
        System.out.println(str1.contains("c")); //true
    }
}

6.String类的方法——比较功能

6.1判断字符串内容是否为空

str.isEmpty();

6.2判断字符串的内容是否相等

String str1 = "Abc";
String str2 = "abc";
String str3 = "Abc";
str1.equals(str2);	//false
str1.equals(str3);	//true

6.3不考虑大小写,判断字符串的内容是否相等

String str1 = "Abc";
String str2 = "abc";
str1.equals(str2);	//true

6.4字符串的升序比较结果

str1.compareTo(str2)
str1 == str2,输出0
str1 < str2,输出负数
str1 > str2,输出整数
其实就是str1-str2的结果,设计ASCII码的计算

public class App {
    public static void main(String[] args)  {
        String str1 ="a";
        String str2 = "c";
        System.out.println(str1.compareTo(str2)); //-2
        System.out.println(str2.compareTo(str1));   //2
    }
}

7.创建并返回一个新的String对象

7.1、连接两个字符串

str1.concat(str2);

7.2、替换字符串中的某一部分,一样的全给换了

public class App {
    public static void main(String[] args)  {
        String str1 ="我很衰,你很衰,他也很衰";
        System.out.println(str1.replace("衰","帅")); 
    }
}

在这里插入图片描述

7.3、字符串的截取

截取索引[a,b)的字符串

public class App {
    public static void main(String[] args)  {
        String str1 ="aabcd";
        System.out.println(str1.substring(0,3));//aab
    }
}

7.4、忽略字符串前后的空格,中间的不忽略

public class App {
    public static void main(String[] args)  {
        String str1 ="   hello java   ";
        System.out.println(str1.trim());//hello java
    }
}

7.5、大小写转换

public class App {
    public static void main(String[] args)  {
        String str1 ="hello JAVA";
        System.out.println(str1.toUpperCase());//HELLO JAVA
        System.out.println(str1.toLowerCase());//hello java
    }
}

7.6、按一定规则分割字符串并返回一个字符串数组

. 、 $、 | 和 * 等转义字符,必须得加 \
多个分隔符,可以用 | 作为连字符

public class App {
    public static void main(String[] args)  {
        String str1 ="hello-java-I-love-java";
        for ( String str: str1.split("-")) {
            System.out.println(str);
        }   
    }
}

在这里插入图片描述

7.7、将字符串转换成字符数组(char)

public class App {
    public static void main(String[] args)  {
        String str1 ="hello-java-I-love-java";
        System.out.println(str1.toCharArray());//hello-java-I-love-java
    }
}

7.8、将字符串转换成byte数组

public class App {
    public static void main(String[] args)  {
        String str1 ="hello-java-I-love-java";      
        System.out.println(str1.getBytes());
    }
}

二、StringBuilder类和StringBuffer

StringBuilder:可变字符序列、线程不安全,效率较高
StringBuffer可变字符序列、线程安全、做线程同步检查,效率较低
StringBuilder和StringBuffer的方法基本一致

1、和String类似的方法

str1.length();
str1.indexOf("n");
str1.lastIndexOf("n");
str1.charAt(i);
str1.substring(a,b);

2、常用的方法

str1.append(xxx);

往对象后面追加,不会生成新的对象

3、需要知道的方法

//在索引位置插入字符
StringBuffer str1 = new StringBuffer("蜜雪冰城");
str1.insert(0,"爱");		//爱蜜雪冰城
//删去字符串[a,b)
str1.delete(0.2);			//雪冰城
//删除字符串指定位置上的字符
StringBuffer str2 = new StringBuffer("我不爱你");
str2.deleteCharAt(1);	//我爱你
//将字符串逆序
str2.reverse();			//你爱我


版权声明:本文为a__xuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>