目录
String类
String 字符串
String是一个类
类中可以有哪些结构?
属性,方法,构造器
那String这个类是不是也有属性,方法,构造器?
String s1="abcdefg";
String既然是一个类,s1就应该叫做String类的对象
类如果要创建对象,一定要先new,s1并没有new,为什么s1也可以叫做对象String s2=new String("abcdefg");
s2是通过new创建出来的String类的对象;创建对象是要调用构造器
s1和s2的abcdefg不在同一个区域内。(不在同一块内存空间里)
双等号比较的是虚地址
虚地址:对象在内存中的存储位置
System.out.println(s1==s2);//false String s3=new String("abcdefg");
虽然一个样子,但是只要是new,他就是新建一个地址,双等号还是比较地址的,所以就不相等
System.out.println(s2==s3);//false String s4="abcdefg"; System.out.println(s1==s4);//true
小结:
=赋值,无论怎么比较,都是true;
new赋值,用双等号比较,都是false;
String s1="a";
String s2="a";
System.out.println(s1==s2);
除了这种方式,其余所有字符串都是默认用的new的方式,也就是其他的所有比较都是false
Scanner sc=new Scanner(System.in);
System.out.println("请输入字符串1");
String s3=sc.next();
System.out.println("请输入字符串2");
String s4=sc.next();
System.out.println(s3==s4);
输出结果为:false,那我想让他内容一样的就相等,不是比较地址呢?
String是类,那么这些s1,s2,s3都是对象,这些对象就都可以调用方法
String的方法:
equals方法:
功能:比较字符串
1.需要传参,传String类型的参数
2.有返回值,返回值是boolean类型
3.访问权限:public
s3.equals(s4);//返回布尔型
length方法:
1.不需要传参
2.有返回值,整型int
3.访问权想public
s3.length();
字符串获取长度的方法,和数组获取长度有什么区别?
数组的length是属性,字符串的length()是方法.
String b="abcdefg";
System.out.println(b.length());
取出指定下标位置的字符,需要传入Int类型的下标,返回一个char类型的返回值
System.out.println(c.charAt(0));
键盘输入没有char,那么我就想要char怎么做
Scanner sc1=new Scanner(System.in);
char c1=sc1.next().charAt(0);
indexOf方法:
判断指定字符是否存在
一般听到判断,我们都会想到返回值是布尔型
但是这个返回值是int型,返回值为字符串在d的下标。
如果不存在,返回-1;
indexOf(String,int)代表从int位置开始查找,包括当前位置
System.out.println(d.indexOf("a",0));
System.out.println(d.lastIndexOf("a"));
//从后往前找,但是不是按照从右到左的查,下标还是按照下标数字计算
练习:
统计一个字符串在另一个字符串中出现的次数!!
String sc="abddfsxdzzvvccxfdsfaafa";
String ss="ab";
int index=0;
int sum=0;
while (sc.indexOf(ss,index)!=-1){
index=sc.indexOf(ss,index)+1;
sum++;
}
System.out.println(index);
substring方法:
截取字符串:
String a="abcdefghijklmnopqrstuvwxyz";
String x=a.substring(1);//传一个参数,从指定位置开始截取截到字符串的末尾;
System.out.println(a);//我们截取后a会改变吗,答案是并不会。
System.out.println(x);//包括起始位置的字符,并生成一个新的字符串,不会改变原有的数据
String y=a.substring(1,2);//两个参数,从指定位置到指定位置结束,不包括末尾。(前闭后开)
System.out.println(y);
练习:
键盘输入身份证号,输出年龄,性别,生日。
eg:220 122 1990 09 09 1456,倒数第二位奇数:男,偶数:女
主方法:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入身份证号");
String ss=sc.next();
test03 t=new test03();
System.out.println(t.Id(ss));
}
调用方法:
public String Id(String ss){
if(ss.length()==18) {
String month = ss.substring(10, 12);
String day = ss.substring(12, 14);
String year = ss.substring(6, 10);
int x = 2022 - Integer.parseInt(year);
int sex = ss.charAt(16);
String person = "性别为:女";
if (sex % 2 != 0) {
person = "性别为:男";
}
String a = "生日为:" + month + "月" + day + "日," + person + ",年龄为:" + x;
return a;
}
return "数据错误";
}
转大写:toUpperCase()
转小写:toLowerCase()
判断是不是以XXX开头
.startsWith("a")
.startsWith("a",2));//偏移两位判断是否以a为开头
判断是否以xx结尾
.endsWith("i")
忽略大小写比较内容:
String x="abcd";
String y="ABCd";
System.out.println(x.equalsIgnoreCase(y));
//x与y对比
去掉字符串前后的空格:
String z=" asdad ";
System.out.println(z.trim());
根据指定的字符分割,分割之后,分割条件消失:
String stra="123,asd,456,asd,789";
String []strings=stra.split(",");
System.out.println(Arrays.toString(strings));
字符串的替换
String sa="hello";
System.out.println(sa.replace("e", "s"));//单个字符
System.out.println(sa.replaceAll("ello", "i"));//多个字符
System.out.println(sa.replaceAll("l", "i"));//l都被转换为了i
字符串和其他数据类型的转换
int i=10;
String qa=String.valueOf(i);//int转String
字符串转数组
int []arr=new int[]{1,2,3};
String array="abcdefg";
//转成字符型数组
char[] arrays=array.toCharArray();
for(char c:arrays){
System.out.println(c);
}
//转成字节型数组
//一般情况下,字节型数组在操作文件的时候,常用的IO流
byte[] bytes=array.getBytes();
for(byte b:bytes){
System.out.println(b);
}
包装器:
包装器类型(包装类,封装类)
byte-----Byte
short----Short
int--------Integer
long-----Long
float-----Float
double--Double
char-----Character
boolean-Boolean
基本数据类型可以直接赋值,但是类不是得创建对象吗,那这样写不会比较麻烦吗
自从JDK5以后就可以直接赋值了。这种赋值就叫封箱,拆箱
封箱、拆箱:
int i=10;
Integer id=30;//自动装箱
int i1=id;//自动拆箱
Integer i2=Integer.valueOf(50);//jdk5之前必须这么转
int ii2=i2.intValue();//jdk5之前必须这么转
原理:
装箱:
把int类型包装成了包装器Integer类型
基本数据类型转换成对应的包装器类型
拆箱:
int i1=i2;
把Integer类型转换成int; 包装器类型转换成对应的基本数据类型
异常:
1.数组下标越界
2.空指针
3.字符串下标越界
4.数字格式化
5.内存溢出
JDK5之后的新功能:
1.自动装箱和自动拆箱
2.增强for循环(foreach)
3.枚举
JDK7之后的新功能:
1.switch...case 可以用字符串String
思维导图: