Java常用类之String类
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(); //你爱我