目录
3.2.2使用equals方法判断两个字符串对象是否内容相同
3.3.1char charAt(int index): 返回字符串上指定索引位置的字符,注意索引的合法性
3.3.2boolean contains(String regex):查找当前字符串中是否包含指定格式的字符串(子串)
一.Object类
1.1Object是最高参数统一化
Object类是java中所有类的默认父类,所有类默认继承自Object类
我们可以使用Object接收所有类的对象 Object 0bj = new class();
JDK赋予了Object可以接收所有引用数据类型的权利,也可以接收数组和接口对象
由于基本数据类型Object无法处理,因此产生了包装类(将基本数据类型的数值封装到一个类中),至此,Object类就可以接收一切。
//包装类的自动装箱
Object obj1 = 10;
1.2 "=="操作符
1.21对于基本数据类型来说
"=="操作符比的是两个变量的数值是否相等
int a = 10;
int b = 10;
//输出为true,比较的是两个变量的数值是否相等
System.out.println(a==b);
1.22 对于引用数据类型来说
"=="操作符比较的是引用类型保存的地址是否相等
Person p1 = new Person("22",45);
Person p2 = new Person("22",45);
//输出为false,这里的==比较的是p1和p2变量保存的地址
System.out.println(p1 == p2);
若要比较对象内部属性值是否相等,使用equals方法(object提供的方法)
//返回值依旧为false,所以需要覆写
System.out.println(p1.equals(p2));
Object默认的equals方法的效果是,当前对象和传入对象的地址是否相同,和上面的p1 == p2没有任何区别
因此在自定义的类中,要先实现当前类的对象属性比较,必须要在Person类中先覆写equals方法
1.3 Q:JAVA中 "=="和equals的区别
a. == 在java中进行的是两个变量数值的比较,对于基本类型来说,比较的是具体的数值是否相等;对于引用类型来说,==比较的是两个引用是否指向同一个对象,比较的是地址
b.equals方法进行的是两个类对象的属性值比较,若类的对象要具体比较属性值是否相等,需要覆写object类提供的equals方法
二.包装类
将基本数据类型的数值封装到一个类中
2.1 JDK的包装类分为以下两种:
1. Number的直接子类:
整型:byte(Byte),short(Short),int(Integer),long(Long)
浮点型:float(Float),double(Double)
2.Object的直接子类:
char-Charcter
boolean-Boolean
2.2 包装类和基本类型的相互转换
-->基本类型转换为包装类对象这个过程称为装箱
通过相应的包装类构造方法或valueOf方法(推荐)
-->包装类对象1还原为基本类型这个过程称为拆箱
调用相应包装类的xxx value方法实现拆箱
int a = 10;
//装箱
Integer i1= Integer.valueOf(a);
//拆箱
int b = i1.intValue();
JDK在编译阶段引入了自动拆装箱,用包装类和使用基本类型一模一样,语法定义上没有任何区别
//自动装箱,编译器自动实现了Integer.valueOf(a)和intValue();
Integer a = 10;
Integer b = a + 1;
System.out.println(b);
2.3 什么时候用包装类,什么时候用基本类型?
有了自动拆装箱后,使用包装类和基本类型没啥区别,那到底什么时候用什么呢?
阿里编码规约:对于基本的POJO(自定义类),成员变量统一使用包装类,方法中局部变量可以使用基本类型。
默认值
基本类型和包装类型本质上是两个不同的类型
包装类是类,默认值为null,而基本数据类型的默认值是各个数据类型的默认值。
在一些特定场景中,这基本数据类型的默认值会使结果发生偏差
默认值的不同决定了用法,因此在类中定义的成员变量,统一使用包装类
2.4 包装类的缓存问题
包装类仍旧是类,要比较属性值是否相等,用equals方法!!!
Integer a = 10;
Integer b = 10;
System.out.println(a.equals(b));//ture
System.out.println(a == b);//ture
Integer c = 130;
Integer d = 130;
System.out.println(c.equals(d));//ture
System.out.println(c == d);//false
数值型包装类都会在内部有缓存池,以integer为例,默认缓存-128 到127,的数值(这个数值可以修改),当第一次装箱时,该数值在缓存池中没有新对象,产生该对象置入缓存池,若下一次有了该数值装箱,不会产生新的包装类对象,直接返回上一个缓存对象,这也是为什么 a == b 返回true而 c == d 返回false.
因此,牵扯到对象的属性值比较是否相等统一使用equals方法!!!
三. String类
3.1字符串的常用方法:方法1和4是我们最常用的方法
//1.最常用的,直接赋值---String类独有的
//“ ” 字符串常量,每个字符串常量都是一个字符串对象
String ret = "abc";
//2.通过字符串的构造方法直接newString对象
String ret2 = new String("abcd");
//3.任何一门高级语言,字符串内部其实都是字符数组
char[] data = {'a','b','c','d','e','f'};
String ret3 = new String(data);
//4.调用字符串的静态方法valueOf
String ret4 = String.valueOf("ab");
任何一门高级语言,Java,C++等,将字符数组封装在类中提供的字符串类型
字符串String本身并没有储存数据,数据都在内部的字符数组中储存,String类只是将字符数组套了一个类,并向外部提供了很多方便好用的方法。
3.2 String对象的比较
3.2.1对于引用数据类型来说,"=="操作符比较的是引用类型保存的地址是否相等
3.2.2使用equals方法判断两个字符串对象是否内容相同
按照unicode编码一个个字符进行比较,当两个字符串的字符数组对应的内容完全相同,才返回true---(对大小写敏感,取分大小写)
equalsIgnoreCase ------就不区分大小写
String s1 = new String("abc");
String s2 = new String("abcd");
String s3 = new String("abc");
System.out.println(s1.equals(s2)); //false
System.out.println(s1.equals(s3)); //true
3.2.3用compareTo方法进行两个字符串的大小比较
a.先按照两个字符串的字符进行编码比较,若碰到第一个不相等的字符,就直接返回差值,不会累积计算
b.如果前N个字符完全相等,(k是两个字符串中的最小值),返回值为两个字符串的长度差!
compareToequalsIgnoreCase ---------不区分大小写的比较
String s1 = new String("abc");
String s2 = new String("abcd");
String s3 = new String("abC");
System.out.println(s1.compareTo(s2)); //-1
System.out.println(s1.compareTo(s3)); //32
3.3字符串查找: 本质就是在内部的字符数组上进行遍历寻找
3.3.1char charAt(int index): 返回字符串上指定索引位置的字符,注意索引的合法性
String ret = "abcdef";
//查找字符串ret第四个位置的元素
char c = ret.charAt(3);
System.out.println(c); //d
3.3.2boolean contains(String regex):查找当前字符串中是否包含指定格式的字符串(子串)
String str = "abcdef";
String str1 = "ab";
System.out.println(str.contains("abc")); //true
System.out.println(str.contains(str1)); //true
System.out.println(str.contains("abd")); //false
其他:indexOf 和 lastIndexOf用法
3.4字符串与其他类型的转换
3.4.1字符串与数值相互转换
任意类型转字符串
//任意类型转字符串->推荐使用字符串的valueOf方法
String s1 = String.valueOf(1234); //int->str
String s2 = String.valueOf(12.31);//double->str
String s3 = String.valueOf(false);//boolean->str
//自定义类转字符串,默认toString方法,想要输出对象的具体属性值,需要在类中覆写toString方法
String s4 = String.valueOf(new Student(22,"学生甲"));
System.out.println(s4);
字符串转任意类型
使用各个类包装的paraseXXX方法来进行转换,这个转换有可能会报错,个字符串要能转换成相应的类型才能去转换,例如将字符串“123a4”转换成int类型就会报错, 但是转换为布尔值有些不同,只有“true”才能转换成布尔值true,其他不合法的字符串统一转为false处理。
String s1 = "1234";
String s2 = "12.34";
String s3 = "false";
int a = Integer.parseInt(s1);
double b = Double.parseDouble(s2);
boolean c = Boolean.parseBoolean(s3);
System.out.println(a);
System.out.println(b);
System.out.println(c);
3.4.2大小写转换
仅限于英文字母,其因为其他文字比如中文没有大小写
s1.toUpperCase()--转大写
s2.toLowerCase()--转小写
3.4.3字符串转数组
字符串转字符数组
toCharArray:char[ ]
String s1 = "hello";
char [] ch = s1.toCharArray();
字符串转字节数组
当进行网络编程或文件IO操作,需要将字符串序列化为一个个字节
str.getBytes(); ---->按照当前操作系统默认编码转为字节数组
//将s2转为字节数组,无参方法以当前系统编码转为字节数组
String s2 = "hello";
byte[] bytes = s2.getBytes();
//有参的话按照相应的编码转换
String s3 = "萌新";
byte[] bytes1 = s3.getBytes(StandardCharsets.UTF_8);
编码是什么:将任意字符按照指定的规则转为数字就称为编码
ASCII:专门针对英文字母的编码,不管哪种编码格式,针对英文字母的转换都会采用ASCll的转换规则
GBK:专门针对中文的编码 ,包含繁体中文 一个中文字符转为2个字节
GB2312:只包含简体中文
UTF-8:世界上所以语言都可以通过UTF-8转换 一个中文字符转为3个字节
在web开发中碰到乱码,99%都是因为编码和解码的规则不同
例如编码使用UTF-8.解码使用GBK,一定会出现乱码
3.4.4字符串格式化
String s = String.format("%d-%d-%02d", 2019, 9,04);
3.5字符串替换操作
使用一个指定的新的字符串替换掉已有的字符串数据和替换首个内容
使用场景:某些平台屏蔽脏话,用的就是字符串替换操作
3.6字符串的截取操作
String substring(int beginIndex) //从指定索引截取到结尾
String substring(int beginIndex, int endIndex) //截取部分内容,左闭右开区间
String str = "hello"; //将任意单词首字母转为大写
System.out.println( str.substring(0,1).toUpperCase() + str.substring(1));//输出Hello
3.7字符串的拆分
String[] split(String regex) //按照指定格式regex将原字符串拆分为若干个子字符串
String[] split(String regex, int limit) //按照指定格式拆分,限制拆分后字符串数组的长度
String str = "hello my friend";
//按照空格拆分成三个字符串
String[] ret = str.split(" ");
//按照空格拆分,但是限制数组长度为2,拆分到指定长度时,停止拆分
String[] ret1 = str.split(" ",2);
在拆分字符串时,遇到特殊的拆分格式,需要特殊处理
例如:拆分一个ip地址的时候,192.168.1.1
如果只是单纯的按照 String[] ret = str.split("."); 来拆分,则返回不出任何结果
因为 . 操作符在Java中属于特殊字符-引用操作符,碰到类似字符(& | + - /等)拆分都需要进行转义处理 \\
String str = "192.168.1.1"; String[] ret = str.split("\\.");//加上\\后,就能拆分出想要的结果了
3.8其他操作方法
String trim() //去掉字符串中的左右空格,保留中间空格
String str = " hello world ";
//去掉字符串中的左右空格,保留中间空格
String str1 = str.trim();
System.out.println(str1);
//去掉全部的空格,用之前学到的替换操作即可
String str2 = str.replaceAll(" ", "");
System.out.println(str2);