JAVA基础总结(二)

学习API阶段的前提

1.API是一些别人制定或者写好的应用程序接口/功能
2.学会如何更好的使用这些功能,使用后的后果是什么
3.我们可以把API手册当做一个字典,哪里不会查哪里

1.顶级父类 java.lang.Object

1.Object是Java中所有类的超类,Java中的类都直接或间接的继承自Object
2.如果一个类没有明确的指定父类,那么这个类默认继承Object
3.java.lang包是Java的核心包,无需导包,会自动导入

2.hashCode()

hashCode():返回对象对应的哈希码值
默认实现方式:根据对象的地址值生成对应的哈希码值

3.toString()

toString():返回对象对应的字符串
默认实现方式:返回对象的包名.类名@十六进制的哈希码值

4.equals()

equals():比较当前对象与参数对象是否相等
默认实现方式:==比较两个对象的地址值,地址值不同就返回false

注意:需要牢记Object中的默认实现方式,后续遇到的类,只要与Object中默认的实现方式不同,说明发生了重写,具体重写的效果每个类都是不同的,遇到哪个,积累哪个

5.自定义类Student

添加了重写的方法后,重写的效果
1.hashCode():根据传入的当前对象的属性值生成
2.toString():打印当前对象的类型+属性+属性值
3.equals():比较两个对象的类型+属性+属性值

6.拓展

在这里插入图片描述

7.String类

1.底层的结构是字符数组char[]
2.String的常用方法

8.String API总结

在这里插入图片描述

9.String的创建方式

方式一:

char[] values = {‘a’,‘b’,‘c’};
String s1 = new String(value);
注意:每new一次,创建一个String对象,存在堆中

方式二:

String s = “abc”;
注意:存在堆中的常量池中,有高效的效果,如果是第二次创建,不会新建
注意:== 比较的如果是引用类型,那么是地址值
注意:String重写了Object中的toString(),所以可以直接打印字符串的具体内容
String重写了Object中的equals(),所以比较的也是两个字符串的具体内容
String重写了Object中的hashCode(),根据字符串的具体内容生成

10.正则表达式

作用:拿着我们指定好的规则,去判断数据是否符合这个规则
1.指定规则:String regex= “[0-9]{17}[0-9X]”;
2.拿着数据与规则做比较:input.matches(regex)–>如果匹配,matches方法返回true
注意:单个斜杠表示转义字符,所以在正则中如果想要表示单个斜杠,需要写双斜杠
至于正则表达式的对照关系,详见笔记中正则速查表
在这里插入图片描述

11.包装类

1.java的数据类型只有两大类:8大基本类型和引用类型
2.包装类是引用类型的一种,包装类与基本类型一一对应,也有八种
3.基本类型只能存自己类型的值,没有其他额外的功能
4.包装类型是对基本类型进行了包装,提供了丰富的功能,包装类型是基本类型的拓展
在这里插入图片描述
5.包装类型Integer的创建方式:
1)Integer i1 = new Integer(5); 没有高效的效果,new一次,创建一个包装类对象
2)Integer i2 = Integer.valueOf(5); 有高效的效果,数据在-128~127的范围内,才有高效的效果
3)Integer i3 = 5; 自动装箱:编译器会把int类型5装箱,变成Integer,底层调用的方法:valueOf(5)
6.包装类型Double的创建方式:
1)Double d1 = new Double(3.4); 没有高效的效果,new一次,创建一个包装类对象
2)Double d2 = Double.valueOf(3.4);这个也没有高效的效果,只有Integer有
7.Integer的常用方法:i1.parseInt(“80”);将字符串80转成int类型的80
Double的常用方法:d1.parseDouble(“80”);将字符串80转成double类型的80
8.自动装箱与自动拆箱:
1)Integer i3 = 5; 自动装箱【基本类型 到 包装类型】:
编译器会把int类型的5装箱,变成Integer类型,底层调用的方法:valueOf(5)
2)int n = i3;自动拆箱【包装类型 到 基本类型】:
编译器会把包装类型的i3中的数据取出来,把这个值赋值给基本类型int
底层调用的方法:i3.intVlaue();

12.浮点数运算不精确的解决方案:BigDecimal

1.如果使用一个工具,必须先创建这个类的对象,如果想创建对象,必须先了解它提供了哪些构造方法
2.创建BigDecimal对象的方式:
1)BigDecimal(double val) :将double类型的数据作为参数,交给BigDecimal对象【不用,因为double本身不精确】
2)BigDecimal(String val) :将String类型的数据作为参数,交给BigDecimal对象【用这个】
注意:double->String直接拼接一个空串“”就可以
3.使用对象进行加减乘除操作,注意:除法除不尽时会抛出异常,所以需要指定除不尽时保留几位小数以及舍入的方式

13.File文件类

创建File类的对象:new File(String pathname) :这个参数是一个String类型的路径名,这个路径可能是:
1)文件的路径 “D:\ready\1.txt”
2)文件夹的路径 “D:\ready\a”
3)之前不存在的文件/文件夹的路径:这个路径暂时在windows中还未创建出来
注意:new File类的对象只是在内存中多个一个Java对象,并不会真的帮我们在外部创建一个新的文件/文件夹
在这里插入图片描述

14.流的分类

1.按照方向分类:输入流 输出流
2.按照操作的单位分类:字节流 字符流
3.组合情况:字节输入流 字节输出流 字符输入流 字符输出流

15.字节输入流 InputStream

1.抽象父级:InputStream–不能实例化
2.普通子类:
1)FileInputStream–操作文件的字节输入流
构造方法参数:File file / String pathname
2)BufferedInputStream–高效字节输入流
构造方法参数:InputStream,但无法创建抽象父级对象,所以传的是FileInputStream

16.字节输出流 OutputStream

1.抽象父级:OutputStream–不能实例化
2.普通子类:
1)FileOutputStream–操作文件的字节输出流
构造方法参数:File file / String pathname
注意:默认存在一个参数boolean append,默认值为false,也就是覆盖输出
如果将FileOutputStream构造函数的第2个参数appned设置为true,就会实现追加输出的效果
2)BufferedOutputStream–高效字节输出流
构造方法参数:OutputStream,但无法创建抽象父级对象,所以传的是FileOutputStream

17.字符输入流 Reader

1.抽象父类:Reader
2.普通子类:
1)FileReader–操作文件的字符输入流
构造方法参数:File file /String filename
2)BufferedReader–高效字符输入流
构造方法参数: Reader,但无法创建抽象父级对象,所以传的是FileReader

18.字符输出流 Writer

1.抽象父类:Writer
2.普通子类:
1)FileWriter–操作文件的字符输出流
构造方法参数:File file /String filename
注意:默认存在一个参数boolean append,默认值为false,也就是覆盖输出
如果将FileWriter构造函数的第2个参数appned设置为true,就会实现追加输出的效果
2)BufferedWriter–高效字符输出流
构造方法参数:Writer,但无法创建抽象父级对象,所以传的是FileWriter

19.文件复制案例

在这里插入图片描述
在这里插入图片描述

20.序列化

1.将程序中对象的各项信息,序列化输出到文件中保存
2.方向是Out,使用的流是ObjectOutputStream
3.使用的方法是out.writeObject(目标对象);
4.注意:如果一个类的对象想要被序列化,那么这个类必须实现Serializable接口

21.反序列化

1.将之前输出到文件中数据,读取回程序中,并把读取到的数据重新恢复成对象
2.方向是in,使用的流是ObjectInputStream
3.使用的方法是in.readObject();
4.注意:反序列化指定的文件路径,必须与序列化输出的文件路径一样
5.注意:自定义类需要重写toString()才能查看对象的属性与属性值,否则打印地址值
6.注意:一次序列化操作对应一次反序列化操作,或者UID必须保持一致,如果不一致,会报错
在这里插入图片描述

22.反序列化如何成功?

核心:Student类中的UID,与反序列化流中的UID保持一致
1)一次序列化对应一次反序列化[推荐]
2)一次序列化后不修改Student中的内容,然后反序列化
3)将Student中的UID写成固定值
注意:反序列化流持有的UID与Student类中的UID不一致时,反序列化会失败
比如:使用自动生成的UID,先序列化,然后修改Student,再来反序列化,这样就会失败

23.泛型

1.泛型:不是指一种具体的类型,而是说,这里有个类型需要设置,那么后续具体需要设置成什么类型,得看具体的业务
2.**泛型通常与集合一起使用,**用来限制集合中存入的元素类型,泛型具体设置成什么类型,那么这个集合只能存这个类型的元素
3.泛型可以把报错的时机提前,用于在编译期检查集合的元素类型,只要不是泛型设置的类型,就报错,通不过编译
4.泛型只在编译时生效,编译通过以后,说明符合语法规范,泛型就会被抛弃,编译生成的字节码文件中没有泛型
5.泛型的类型必须使用引用类型,比如:Student String Integer
6.泛型方法:如果想要在方法上使用泛型,必须两处同时出现
1)一个是方法的参数列表中的参数类型
2)方法返回值类型前的泛型类型,表示这是一个泛型方法

24.Collection

1.Collection是集合层次中的根接口
2.集合的继承关系
在这里插入图片描述
3.是集合层次的根接口,学习抽象父级的公共方法
在这里插入图片描述

25.List接口

1.List接口的特点

1)List集合是有下标的
2)List集合是有顺序的
3)List集合可以存放重复的数据

2.List集合方法总结

在这里插入图片描述

3.ArrayList的特点

1.List接口的实现类
2.底层的数据结构是数组,内存空间是连续的
3.元素有下标,有序,允许存放重复的元素
4.通常可以根据下标进行操作
5.增删操作比较慢,查询操作比较快[数据量比较大时]

4.LinkedList的特点

1.List接口的实现类
2.底层的数据结构是链表,内存空间是不连续的
3.元素有下标,有序,允许存放重复的元素
4.通常进行首尾节点的操作比较多
5.增删操作比较快,查询操作比较慢[数据量比较大时]
注意:LinkedList的查询操作也不是都慢,首尾操作还是很快的
在这里插入图片描述

26.Map接口

Map接口的特点

1.map集合的结构是:键值对、KEY与VALUE、Map.Entry<K,V>的映射关系
2.map中key值不允许重复,如果重复,对应的value会被覆盖
3.map中的映射关系是无序的
4.map没有自己的迭代器,所以迭代时通常需要转成set集合来迭代
在这里插入图片描述

HashMap的存储过程

1.HashMap的结构是数组+链表 或者 数组+红黑树 的形式
2.HashMap底层的Entry[ ]数组,初始容量为16,加载因子是0.75f,扩容按约为2倍扩容
3.当存放数据时,会根据hash(key)%n算法来计算数据的存放位置,n就是数组的长度,其实也就是集合的容量
4.当计算到的位置之前没有存过数据的时候,会直接存放数据
5.当计算的位置,有数据时,会发生hash冲突/hash碰撞
解决的办法就是采用链表的结构,在数组中指定位置处以后元素之后插入新的元素
也就是说数组中的元素都是最早加入的节点
6.如果链表的长度>8并且数组长度>64时,链表会转为红黑树,当链表的长度<6时,会重新恢复成链表
在这里插入图片描述

27.Set接口

Set接口的特点

1.set集合没有重复的元素
2.set集合的元素是无序的
3.set集合可以存null值,并且null最多有一个
4.我们自定义对象如果想去重,需要在自定义类中添加重写的equals()与hashCode()

集合学习的方法

学习父级的公共方法,学习子类的创建方式,学习各种集合的特点

关于List大多都是与下标有关的操作
关于Set通常都是去重的操作
关于map通常都是映射关系,也就是键值对

API要常练习,方法互相之间没有任何关系,用哪个,查哪个

常见问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值