Java | 字符串的使用 & 分析
字符串
字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,在程序中所有的双引号字符串,都是String类的对象。
字符串的特点
1、字符串的内容永不可变。
2、正在是因为字符串的不可变,所以字符串是可心共享使用的。
3、字符串效果上相当于是char[]字符数组,但是底层其实是byte[]字节数组。
创建字符串
创建字符串一共有两种比较常用的方法,两种常用的方法。
第一种常用的方法
直接在等号后面加上一字符串的常量。
String str = "Hello World!";
System.out.println("第一种常用的创建方法:" + str);
//输出的结果:第一种常用的创建方法:Hello World!
第二种常用的方法
用String类的无参构造方法。
String str = new String();
System.out.println("第二种常用的的创建方法:" + str);
//输出的结果:第二种常用的创建方法:(后面是空,没有值的)
第一种不常用的方法
用String类的有参构造方法。【public String(char[])】
char[] arrch = {'老', '酒','馆','的','锅'};
String str = new String(arrch);
System.out.println("第一种不常用的创建方法:" + str);
//输出的结果:第一种不常用的创建方法:老酒馆的锅
第二种不常用的方法
用String类的有参构造方法。【public String(byte[])】
byte[] arrbyte = {97, 98, 99}; //里面的数字,是对照ASCII表的
String str = new String(arrbyte);
System.out.println("第二种不常用的创建方法:" + str);
//输出的结果:第二种不常用的创建方法:abc
上面的所有加上引号的字符串,都是一个String对象,都在在常量池里面的
字符串的常量池
在上面说到,所有的加引号的字符串都在常量池中间,但是常量池是什么东西呢?
常量池其实就是在创建类的时候,所类中的所有的常量写到常量池当中。
例:
String str1 = "abc";
String str2 = "abc";
char[] arrch = {'a', 'b', 'c'};
String str3 = new String(arrch);
//比较三个Sting的地址 输出的结果:
System.out.println(str1 == str2); //true
System.out.println(str1 == str3); //false
System.out.println(str2 == str3); //false
要据上面的图可以得知,常量池中其实存的也是一个地址,在常量如果相等的情况下,会指向常量池中的同一个地址。常量池中的地址,指向的是一个字节数组,所有的数组最后存的都是字节数组。
而字符数组在在jvm中存储的是按照一个数组来存储的,当String的构造方法调用这个数组的时候,这个数组会转成字符数组的形式,然后再给String类的构造方法。
而用构造方法构造的String类,他是一个对象了,所以不在常量池中在着了,是在堆中随机存储着,所以说,str1 == str2 地址相同,但是str1 == str3、str2 == str3地址不相同。
对于引用类型来说,==进行的是地址值的比较。
字符串的操作和使用
比较方法
在我们日常用的时候,如果我们只想比较字符串里面的值,不关心地址,就可用比较方法,所以说java专门写了两个比较的方法。
public boolean equals(Object obj) 和 public boolean equalsIgnoreCase(Sttring str)
上面的两个方法,一个是严格区分大小写的,一个是忽略大小写的。
例:
equals方法的使用:
String str1 = "ABC";
String str2 = "ABC";
char[] arrch = {'A', 'B', 'C'};
String str3 = new String(arrch);
//比较三个Sting的地址 输出的结果:
System.out.println(str1.equals(str2)); //true
System.out.println(str1.equals(str3)); //true
//也可心直接和常量进行比较
String str = null;
System.out.println(str.equals("ABC")); //不推荐使用:会报错 => java.lang.NullPointerException(空指针异常)
System.out.println("ABC".equals(str)); //推荐使用
equalsIgnoreCase方法的使用:
String str4 = "guo";
String str5 = "GUO";
System.out.println(str4.equalsIgnoreCase(str5));
//true 但是只能进行英文的忽略大小写比较
获取字符串长度
在日常使用中获取长度和比较是String类里面用的最多的两个方法了。
public int length()
例:
String str = "dfghjhgfdfg";
System.out.println("字符串的长度是:"+str.length());
//字符串的长度是:11
拼接字符串
拼接字符串,也有自己的方法,但是我们在用的时候,一般是直接用‘+’来直接拼接的,没有使用方法。
在拼接字符串的时候,我们要知道,拼接出来的字符串,是和原来的字符串是一点都不相等的,不管用方法还是用‘+’号。就是因为常量不可改变。
方法:public String concat(String str);
例:
String str1 = "老";
String str2 = "酒馆";
System.out.println(str1.concat(str2));
//老酒馆
System.out.println(str1 + str2);
//老酒馆
获取指定位置的单个字符
也是常用的方法:public char charAt(int index);
例:
String str = "老酒馆的锅";
char c = str.charAt(2);
System.out.println("指定位置出来的字符是:" + c);
//指定位置出来的字符是:馆
查找字符串首次出现的位置索引
在java里面只要是索引就是从0开始的,所以字符串也是。
String里面常用的方法是:public int indexOf(String str);
例:
String str = "老酒馆的锅";
int index = str.indexOf("酒馆");
System.out.println("字符串首次出现的位置索引:"+index);
//字符串首次出现的位置索引:1
截取字符串
String类里面截取字符串只有一种方法,但是这一种方法有一个重载。
public String substring(int begin) 、 public String substring(int begin,int end) 这两种方法。
第一种方法:
String str = "老酒馆的锅";
//从0开始数,在第三个字符串的地方开始往后面截取,包括3
String substring = str.substring(3);
System.out.println(substring); //的锅
第二种方法:
String str = "老酒馆的锅";
//从0开始数,在第一个字符串的地方开始往后面截取,包括1
//但是不包括后面,[1,3);
String substring = str.substring(1, 3);
System.out.println(substring); //酒馆
字符串转换
字符串转换可以在非常多的场景里面用的到,所以String类里面也提供的有技持的方法。
public char[] toCharArray(); 将当前字符串拆分成为字符数组。
public byte[] getBytes(); 获得当前字符串底层的字节数组。
public String replace(CharSequence oldStr,CharSequence newStr); 将所有的老字符串都替换成新的字符串。
toCharArray():
String str = "老酒馆的锅";
//转换成字符数组
char[] chars = str.toCharArray();
System.out.println(chars[0]); //老
getBytes():
String str = "老酒馆的锅";
//转换成字节数组
byte[] chars = str.getBytes();
//这里面对应的是utf-8里面的字符
System.out.println(chars[0]); // -24 => 老
System.out.println(chars[1]); //-128 =>酒
System.out.println(chars[2]); //-127 =>馆
replace(CharSequence oldStr,CharSequence newStr):
String str = "Hello Word !";
//把所有的o替换成&号
String str2 = str.replace("o", "&");
System.out.println(str2); //Hell& W&rd !
字符串分割方法
在日常使用中会对有规律的字符串按照对应的规则分成若干份。
public String[] split(String regex);
String str = "Hello Word !";
//根据空格进行切分
String[] strs = str.split(" ");
for (String s : strs) {
System.out.println(s);
}
/* 分割成三个字符串了
Hello
Word
!
*/
//有一种特殊的情况,就是根据"."进行切割的时候必须在点前面加上\\
String s = "aaa.bbb.ccc";
String[] split = s.split(".");
System.out.println(split.length); //0
String[] split1 = s.split("\\.");
System.out.println(split1.length); //3
//这就说明必须在点的前面加上\\,
//这是因为在split里面是按照正侧表达式进行切割的,"."具有特殊函意,所以要加上转义字符
以上就是字符串的简单的介绍和使用方法了。
关注公众号,随时获取最新资讯
细节决定成败!
个人愚见,如有不对,恳请斧正!