构造方法
1.直接等号赋值
2.new一个对象
3.数组转化
代码如下:在main函数里面:
String str1="Hello";
String str2=new String("World");
char[] ch={'a','b','c'};
String str3=new String(ch);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
运行结果:
比较两个字符串
1.判断是否相等:两种方式:对象1==对象2
对象1.equals(对象2)
其区别是:== 比较的是对象存储的地址值是否相同
equals 比较的是对象存储的内容是否相同
1.1 先理解==判等:看一段代码:
String str1="Hello";
String str2="world";
String str3=str1;
System.out.println(str1==str3);
System.out.println(str1==str2);
System.out.println(str3==str2);
其运行结果是:
要理解这个结果,我们就要了解Java中字符串的存储情况:
1.2 equals 判等
String str1="Hello";
String str2="World";
String str3=str1;
System.out.println(str1.equals(str3));
System.out.println(str1.equals(str2));
System.out.println(str3.equals(str2));
运行结果 :
---------------------------------------------------------------------------------------------------------------------------------
2. 大小比较:基本原则是 根据字符的ASCII值比较,若ASCII值相同,再比较长度。
比较方式:int ret=对象1.compareTo(对象2)
注意:比较时的前后顺序:返回的是对象1-对象2.若前者大返回正值,相等返回0,前者小于后者返回负值。
String s1="abcd";
String s2="efgh";
String s3="abcdefg";
int ret1=s1.compareTo(s2);
int ret2=s2.compareTo(s1);
int ret3=s1.compareTo(s3);
System.out.println(ret1);//1与2比
System.out.println(ret2);//2与1比
System.out.println(ret3);//ASCII值同 比长度
运行结果:
字符串查找
下面的str都指的是字符串
1.按下标查找,返回对应字符:char ch=str.charAt(i)
String str="ababcabcd";
// 下标 012345678
char ch=str.charAt(4);//下标为4的字符是c
System.out.println(ch);
运行结果:
引申出遍历:
String str="ababcabcd";
for(int i=0;i<str.length();i++){
System.out.print(str.charAt(i)+" ");
}
运行结果:
2.按字符查找,返回对应下标:int ret=str.indexOf('字符')
重载的几个用法:从下标为4的位置开始查找:int ret=str.indexOf('字符',4)
查找字符串,返回第一次出现的下标:int ret=str.indexOf("字符串")
String str="ababcabcd";
//下标 012345678
int ret1=str.indexOf('b');
int ret2=str.indexOf('b',2);
int ret3=str.indexOf("abc");
System.out.println(ret1);//返回第一次出现b的下标
System.out.println(ret2);//从下标为2的地方开始找第一次出现b的下标
System.out.println(ret3);//返回第一次出现abc的下标
运行结果:
字符串与其他类转换
1.字符串转成整型/双精度浮点:
int x=Integer.parseInt(str)
double y=Double.parseDouble(str)
2.整型/双精度浮点型转成字符串:
String s=String.valueOf(其他类型数据)
String str="1234";
int x=Integer.parseInt(str);
System.out.println(x);
String s=String.valueOf(12.34);
System.out.println(s);//此时12.34这个doublde型的 数据 已经转化成 String类的数据
运行结果:
大小写转换
1.小写转成大写:String s1=str.toUpperCase()
2.大写转成小写:String s2=str.toLowerCase()
String str="ABCDefgh";
String s1=str.toLowerCase();
String s2=str.toUpperCase();
System.out.println(s1);
System.out.println(s2);
运行结果:
格式化输出
格式范例:String str=String.format("%d-%d-%d",2005,1,14);
String str=String.format("%d-%d-%d",2005,1,14);
String str1=String.format("%d %d %d",2005,1,14);
String str2=String.format("%d,%d,%d",2005,1,14);
String str3=String.format("%d%02d%02d",2005,1,14);//从月份开始的数据不到两位的用0补齐
System.out.println(str);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
运行结果:
拆分
格式:String[] ss=str.split("拆分根据")
解释:拆分根据:取决于亲想根据什么符号来拆分,如str="name=Anna&age=19",我想用"&"来拆分这个字符串,得到两个子字符串:name=Anna和age=19,这时母字符串被分成两组,所以需要字符串类的数组来接收。
若拆分根据是两个呢?如:“&” "="
两种方式:1.两个循环嵌套
2.String[] sss=str.split(" 根据1 | 根据2 ")
String str="name=张三&age=19";
String[] ss=str.split("&");
for (String x:ss) {
System.out.print(x+" ");
}
System.out.println();
String[] sss=str.split("&|=");
for (String y:sss) {
System.out.print(y+" ");
}
System.out.println();
String[] s1=str.split("&");
for(int i=0;i<s1.length;i++){
String[] s2=s1[i].split("=");
for(int j=0;j<s2.length;j++){
System.out.print(s2[j]+" ");
}
运行结果:
截取
格式:从下标为i的位置开始截取,直到字符串结束:String s=str.substring(i)
重载方法--截取区间,左闭右开:String s=str.substring(2,4)
String str="abcdefg";
//下标 0123456
String s1=str.substring(2);
System.out.println(s1);
String s2=str.substring(2,4);
System.out.println(s2);
运行结果:
字符或数字判断
现有字符ch
格式:是否是数字:boolean ret=Character.isDigit(ch)
是否是字符字符:boolean ret=Character.isLetter(ch)
是否是字符或数字:boolean ret=Character.isLetterOrDigit(ch)
String str="abc123ef4g5";
for(int i=0;i<str.length();i++){
char ch=str.charAt(i);
System.out.print(ch+"是否是数字:"+Character.isDigit(ch)+"/ ");
System.out.print(ch+"是否是字母:"+Character.isLetter(ch)+"/ ");
System.out.print(ch+"是否是字母或数字:"+Character.isLetterOrDigit(ch)+"/ ");
System.out.println();
}
运行结果:
小结String:String不是在原有对象基础上直接修改,而是先找个替身,再让修改替身。
而接下来介绍的两个SB就是在原有基础上直接修改--优点是:拼接时效率更高
拼接:String类的:String s1="abc";
String s2="def";
String s3=s1+s2;
StringBuilder的:String s1="abc";
String s2="def";
s1.append(s2);
StringBuffer的:String s1="abc";
String s2="def";
s1.append(s2);
**了解:StringBuilder 与 StringBuffer:
现在已有 StringBuilder sb="abcdefg" 和 StringBuffer sb="abcdefg"
因为他俩有相同的方法,为了简便,以下用SB代替二者:
它们俩能实现直接修改的原因是 底层return this---返回本身
他们俩共有的方法:1.逆置:SB.reverse();
2.插入 :SB.insert(i,"haha");--在下标为i的位置插入"haha"
3.转化成String:String s=sb.toString();
那么两个SB的区别是什么呢?
当我们查看底层时,发现StringBuffer的底层用synchronized修饰--意思是 在多线程中用于保证安全,相当于门锁。而StringBuilder则没有。
那是不是都用StringBuffer更好呢?其实不是,如果是单线程,相当于在自己家上厕所,频繁上锁开锁会造成资源浪费。此时用StringBuilder更好捏。