目录
4.2、忽略大小写的String对象的比较:equalsIgnoreCase(String s)
4.3、比较String对象的大小:compareTo(String s)
4.4、忽略大小写的String对象比较:compareToIgnoreCase(String s)
4.6.2大小写的转化:toUpperCase(), toLowerCase()
4.71替换所以指定的内容:replace()方法,replceAll()方法
一、何为String?
在学习C语言中,就已经涉及到了字符串的概念,但是在C语言中并没有字符串的类型,只能通过字符数组和字符指针的概念达到字符串的效果。
但是中java里面专门提供了字符串类型:String,在C语言中没有字符串类型这样的说法。String属于引用型数据类型。
二、字符串的构造
String类型的构造方法有很多,常用的有以下三种:
2.1、使用常量串构造
2.2、直接new String对象
2.3、使用字符数组进行构造
public static void main(String[] args) {
String s = "abcdef";
System.out.println(s);
}
public static void main(String[] args) {
String s = new String("abcdef");
System.out.println(s);
}
public static void main(String[] args) {
char[] ch = {'a' , 'b' , 'c' , 'd' , 'e' , 'f'};
String s = new String(ch);
System.out.println(s);
}
三、字符串的本质
String是引用行数据类型,本身并不存储字符串,String类型的引用只用于存储对象的地址,以及调用相应的方法进行对对象的操作。
在String的底层有一个Value数组,用于存储字符串,也就是说虽然Java定义了字符串类型,但本质是还是用数组进行存储字符串的,和C语言构造字符串有些类似,区别在于Java对该数组进行了封装,在字符串类型String的表面并看不出来从而达到了字符串类型的实现。
public static void main(String[] args) { String s1 = "abc"; String s2 = "aaa"; String s3 = s1; System.out.println(s1); System.out.println(s2); System.out.println(s3); }
所以说String本身并不存储字符串,而是存储String对象的地址。
四、String常用的方法
4.1String对象的比较:equals()
1.对于基本数据类型来说:“= =”比较的是变量中的值
2.对于引用型数据类型来说:“= = ”比较的是两个引用中存储的地址, 这个时候我们就需要相应的方法进行比较String对象底层真正存储字符串的数组value,boolean equals(Object object)方法,按照字符大小的顺序进行比较
String类中重写了Object中的equals方法,Object中的equals方法默认安装= =进行比较,但是在引用行数据类型并不适用,String重写equals方法后,按照字符大小的顺序进行一一比较。也就是真正的比较String类底层的value数组,而并非比较引用中的地址。
4.2、忽略大小写的String对象的比较:equalsIgnoreCase(String s)
有人就要问了,主播主播,这个有什么用呀?
有的,兄弟,有的!在我们的生活中经常需要验证码进行登陆某某软件,我们可以发现验证码中输入过程中是忽略大小写的,只要是字母相同,大写小写都可以,String类当中当然也定义了忽略大小写比较的方法。
4.3、比较String对象的大小:compareTo(String s)
与equals方法不同的是,equals返回的是boolean类型,compareTo方法返回的是int型的。具体比较方式:
1、先按照字符大小的顺序进行比较,如果出现不相等字符,直接返回两者之间的差值
2、如果两个字符串之间的长短不同,在比较过程中短的字符串先比较完了并且完全相同,此时返回字符串长度的差值。
4.4、忽略大小写的String对象比较:compareToIgnoreCase(String s)
和compareTo方法的使用方式一样,但是忽略大小写,同时有需要注意调用的顺序,并且该方法只能忽略字符,如果遇到中文会直接跳过。
4.5、字符串查找
public static void main(String[] args) {
String s = "aaabbbcccaaabbbccc";
System.out.println(s.charAt(3)); //'b
System.out.println(s.indexOf('c')); //6
System.out.println(s.indexOf('c',10)); //15
System.out.println(s.indexOf("bbb")); //3
System.out.println(s.indexOf("bbb",10)); //12
System.out.println(s.lastIndexOf('c')); //17
System.out.println(s.lastIndexOf('c',10)); //8
System.out.println(s.lastIndexOf("bbb")); //12
System.out.println(s.lastIndexOf("bbb",10)); //3
}
4.6字符串转化
4.6.1、数值和字符串之间的转化valueOf()
String.valueOf( X ),X可以是对象、int、boolean、double等数据类型,最终会返回对应的字符串
String.valueOf()方法在底层调用了toString方法,在类中重写的toString方法,重写toString方法可以按照自己的想法输出内容,并且仔细观察可以发现,在println()方法中也调用了String.valueOf()方法
4.6.2大小写的转化:toUpperCase(), toLowerCase()
可以直接同过String的引用调用toUpperCase()方法和toLowerCase()方法,需要接收String类的返回值,String的方法都是返回一个new的String对象,不在原字符串上修改
public static void main(String[] args) {
String s = "AbcDef";
String s1 = s.toLowerCase();//输出abcdef
String s2 = s.toUpperCase();//输出ABCDEF
}
4.6.3字符串转数组:toCharArray()
toCharArray()方法可以将字符串挨个转换成数组,需要用char类型的数组进行接收
public static void main(String[] args) {
String s = "AbcDef";
char[] ch = s.toCharArray();
String str = new String(ch);
}
4.7,字符串替换
4.71替换所以指定的内容:replace()方法,replceAll()方法
两个方法基本一致,但是不同的是replace()方法构有重载,可以替换字符或者字符串, 但是replaceAll()方法只能替换字符串
String str = "abcde";
String s1 = str.replace("abc" , "aaa"); //aaade
String s2 = str.replace('a' , 'b'); //bbcde
String s3 = str.replaceAll("abc" , "aaa");//aaade
}
4.72、替换首个内容:replaceFirst()
public static void main(String[] args) {
String str = "abcabcabc";
String s1 = str.replaceFirst("abc","aaa");//aaaabcabc
}
4.8字符串拆分
split()方法可以将完整的字符串按照指定的分隔符拆分才若干个子字符串。
split()方法也构成了重载,一个是不规定分割成多少个子字符串,一个是规定分割成limit个 字符串
public static void main(String[] args) {
String str = "abc abc abc abc";
String[] s1 = str.split(" "); //abc abc abc abc,分割成4个
String[] s2 = str.split(" " , 2); //abc abc abc abc,分割成0个
}
但是比较需要注意的是,有一些特殊字符作为分隔符的时候可能无法正常分割,需要加上转义,比如拆分ip地址和‘.’。
1、字符“|”,“*”,“+”都需要加上转义字符,前面加上“\”
2、如果是“\”字符,那么需要写成“\\”,因为“\”需要加上一个“\”转义才是真正的“\”的意思,那也就是说,在字符串里面需要用“\”的话就写成“\”,那么split()方法里面想要使用“\”作为分隔符,则方法里面想要写成“\\”
3、如果一个字符串中有多个分隔符,可以用“|”作为连字符
4.9字符串截取
substring()方法也构成了重载,当参数列表只有一个时,表示截取该位置到字符串结尾的内容,如果参数列表有两个,表示截取范围内内容。并且是左闭右开,也就是第二个参数只能取到该位置的前一个内容,无法取到该位置上的内容
public static void main(String[] args) {
String str = "abcdef";
String s1 = str.substring(3);//def
String s = str.substring(2 , 5);//cde
}
4.10去掉左右空格,保留中间空格
trim()方法可以去掉字符串开头和结尾的空白字符,比如制表符,空格,换行等
该方法可以用于搜索引擎的快速识别搜索
五,细节分析
String是一种不可变对象,字符串中的内容是不可变的,一旦初始化完成后就无法改变了,虽然可以使用“+=”进行字符串追加,但是并不是真正意义上的追加,“+=”实际上是new了几个新对象进行追加成为一个新的对象最后再返回变成String类型,本质意义上也不是在原字符串的基础上追加
并且String类被final修饰,表示String类型不可以被继承
String类的字符实际是保存在内部维护的value字符数组中,并且该数组也被final修饰,表示value本身的引用对象不可以修改,即不可以引用其他的字符数组,但是value引用的数组内容是可以修改的
所有涉及到字符串内容修改的方法,都是创建一个新对象,改变的是新对象,而并非原对象,最终返回新对象
完结散花!!
祝大家所念有所回,所学有所获得