学习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要常练习,方法互相之间没有任何关系,用哪个,查哪个
常见问题