简单认识Java中的String类
一、认识String类的重要性
在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提
供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字
符串应用又非常广泛,因此Java语言专门提供了String类。
所以在这里,博主提一下,Java中的String是一种引用数据类型,并不是像int、char、float等这种基础数据类型。!!!
(1)字符串""这个事物,Java中也是一个对象,对象的描述类,java.lang.String,提供很多方法操作字符串。
(2) 使用频率非常高:身高,年龄,学历,工作经历,婚姻状况,人生目标。
(3)学会学好String类,提供操作方法,方法必须要熟练。
二、字符串的构造
第一种:
String str1 = "hello";
这种是最简洁的表达方式,注意str1中存放的是该字符串的地址.
第二种:
String str2 = new String(“world”);
第三种:
char[] chars = {'j','a','v','a'};
String str3 = new String(chars);
总结:(1)这三种方式创建字符串都是一样的,在对象中存储字符串的地址.
(2)java中的字符串不像C语言中末尾还有‘/0’存在
字符串在内存中存储的样子(这里先不管常量池的问题):
三、关于字符串中常用的操作
1、String对象的比较
Demo:
String str1 = new String("hello");
String str2 = new String("world");
System.out.println(str1.equals(str2));
//代码运行的结果为:false
这是因为,new的对象的地址不一样,而equals没有重写之前是根据对象的地址去判断是否一样,所以这里输出为false.
System.out.println(str1.equalsIngnoreCase(str2));
此语句是忽略字符串的大小去比较.
2、比较两字符串的大小
Demo:
String s1 = new String("hello");
String s2 = new String("world");
int ret = s1.compareTo(s2);
if(ret>0) {
System.out.println("s1>s2");
}else if(ret<0) {
System.out.println("s1<s2");
}else {
System.out.println("s1=s2");
}
//运行结果为:s1<s2
关于compareTo函数,这个函数是用来比较两个字符串的大小,从第一个字符开始,根据ascll码值比较,返回一个整数compareToIngnoreCase函数是忽略大小写进行比较.
3、字符串查找
(1)根据下标来找元素
Demo:
String str = "abcdef";
for(int i = 0;i<str.length();i++) {
char ch = str.charAt(i);//chatAt函数是返回下标为i的字符
System.out.print(ch );
}
//这里输出的结果为a b c d e f
(2)找某个字符在字符串中的下标
String str = "abcdef";
System.out.print(str.indexOf('c') );
//2
此函数是找到目标字符,并返回目标字符的下标。但是如果目标字符有多个相同的字符,就会返回第一个字符的下标.
String str = "abcdefcc";
System.out.print(str.indexOf('c',3) );
//6
从下标为3的位置开始找
(3)在字符串中找字符串
Demo:
String str = "abcdefcc";
System.out.print(str.indexOf("abc"));
//0
返回最先找到的那串字符串的第一个字符的下标.
String str = "abcdefabc";
System.out.print(str.indexOf("abc",3));
//6
从下标位置为3的字符开始找字符串.
(4)从后往前找字符
Demo:
String str = "abcdef";
System.out.print(str.lastIndexOf('c'));
//2
此函数作用为从后往前找目标字符,返回下标.
String str = "abcdcefc";
System.out.print(str.lastIndexOf('c',5));
//4
从下标为5的位置从后往前开始找,找到返回下标.
(5)从后往前找字符串
Demo:
String str = "abcdcefabcfsdfabc";
System.out.print(str.lastIndexOf("abc"));
//14
从后往前开始找字符串,找到返回此字符串的首字符下标.
String str = "abcdcefabcfsdfabc";
System.out.print(str.lastIndexOf("abc",12));
//7
从下标为12的位置开始找字符串,找到返回此字符串的首字符下标.
4、类型之间的转化
(1)数值和字符串转化
该情况使用valueOf函数,后面可以跟任何数据类型,比如int、char、boolean、甚至是一个类等等都是可以的.
String str = String.valueOf(1234);
String str = String.valueOf(new Integer(1234));
(2)字符串转成其他数据类型
这种情况使用各种数据类型的包装类中的方法,如parseInt()、parseDouble()等
double num2 = Double.parseDouble("3.14");
int num1 = Integer.parseInt("1234");
(3)大小写之间的转化
Demo:
//小写-->大写
String str1 = "hello";
String ret1 = str1.toUpperCase();
System.out.println(ret1);
//大写-->小写
String str2 = "HELLO";
String ret2 = str2.toLowerCase();
System.out.println(ret2);
/*
HELLO
hello
*/
(4)字符串转数组
Demo:
String str = "abcdefg";
char[] chars = str.toCharArray();
System.out.println(Arrays.toString(chars));
//[a, b, c, d, e, f, g]
toCharArray()函数是将字符串变成数组类型,Arrays.toString()函数就是以数组的形式输出.
(5)字符串替换
此函数并不是在原函数上替换,而是返回新的字符串Demo:
String str = "ababcbacabcdef";
String ret = str.replace('a','q');//将字符串里面的所有'a'换成'q'
System.out.println(ret);
String ret2 = str.replace("ab","wz");//将字符串中的"ab"换成"wz"
System.out.println(ret2);
String ret3 = str.replaceAll("abc","mnpl");//将字符串中所有的"abc"换成"mnpl"
System.out.println(ret3);
String ret4 = str.replaceFirst("abc","uuuu");//将字符串中第一个"abc"换成"uuuu"
System.out.println(ret4)
/*
qbqbcbqcqbcdef
wzwzcbacwzcdef
abmnplbacmnpldef
abuuuubacabcdef
*/
(6)字符串拆分
Demo:
String str = "zhangsan&wangwu";
String[] ret = str.split("&");
System.out.println(Arrays.toString(ret));
//[zhangsan, wangwu]
split函数是通过括号里面的字符将字符串进行拆分,返回的也是一个字符串数组.
String[] ret = str.split("&",2);
可以进行组数的限制,这样就是分为两组
特殊的拆分:
Demo:
String str = "127.00.0.1";
String[] ret = str.split("\\.");
for(String x:ret) {
System.out.println(x);
}
两个“\\”相当于一个“\”,然后“\”和“.”才是一个真正的“.”号.
注:
- 字符“\”,”*”,”+”都得加上一个转义字符,前面加上“\\”
- 如果要按照“\”分的话,就写成”\\\\“
- 如果一个字符串中有多个分隔符,可用“|”作为连接符
str.split("= | &");
(7)字符串的拆分
Demo:
String str = "helloworld!";
String ret1 = str.substring(1);//从下标为1的位置开始截取
System.out.println(ret1);
String ret2 = str.substring(1,4);//从下标为1的位置开始,取到下标为4的位置,左闭右开
System.out.println(ret2);
/*
elloworld!
ell
*/
(8)字符串中的trim函数
Demo:
String str = " hello hello ";
String ret = str.trim();
System.out.println(ret);
//hello hello
trim函数是去除字符串左右两边的空格,中间的空格不会被去除
四、StringBuffer和StringBuilder
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类,这两个也是类,也可以表示字符串.
1、String、StringBuffer、StringBuilder的区别
- String类的对象创建了之后,内容就不可以修改,而StringBuffer和StringBuilder的对象创建了之后内容可以修改
- StringBuffer和StringBuilder大部分的功能相似
- StringBuffer采用同步处理,是线程安全的
- StringBuilder未采用同步处理,不是线程安全的
2、关于String对象创建了之后,内容不能改变的原因
这是因为源码中String类中有一个byte[]数组,这个数组被final修饰,所以数组一旦创建就不可以被修改,并且被final修饰的引用一旦指向某个对象之后,不可再指向其他对象.
注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
- String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
- StringBuilder变为String: 调用toString()方法。
3、常用方法
方法 | 说明 |
---|---|
StringBuff append(String str) | 在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量 |
char charAt(int index) | 获取index位置的字符 |
int length() | 获取字符串的长度 |
int capacity() | 获取底层保存字符串空间总的大小 |
void ensureCapacity(int mininmumCapacity) | 扩容 |
void setCharAt(int index,char ch) | 将index位置的字符设置为ch |
int indexOf(String str) | 返回str第一次出现的位置 |
int indexOf(String str, int fromIndex) | 从fromIndex位置开始查找str第一次出现的位置 |
int lastIndexOf(String str) | 返回最后一次出现str的位置 |
int lastIndexOf(String str,int fromIndex) | 从fromIndex位置开始找str最后一次出现的位置 |
StringBuff insert(int offset, String str) | 在offset位置插入:八种基类类型 & String类型 & Object类型数据 |
StringBuffer deleteCharAt(int index) | 删除index位置字符 |
StringBuffer delete(int start, int end) | 删除[start, end)区间内的字符 |
StringBuffer replace(int start, int end, String str) | 将[start, end)位置的字符替换为str |
String substring(int start) | 从start开始一直到末尾的字符以String的方式返回 |
String substring(int start,int end) | 将[start, end)范围内的字符以String的方式返回 |
StringBuffer reverse() | 反转字符串 |
String toString() | 将所有字符按照String的方式返回 |
由于这些方法较多,博主就不在这里一一演示了,大家可以自己下去敲敲哦。
好啦,本期的博客带各位小伙伴们简单认识了String类,如果各位小伙伴还有不懂的问题或者文章有错误的地方,请后台私信告诉博主!!!
路再远也会有终点,夜再长也会有尽头,雨再大也会有停的时候。