Iterator接口并不算严格意义上的集合的"根",它称为迭代器,用于遍历集合元素的一个工具接口。
List接口(有序可重复)
有序集合,元素可以重复,允许保存null,可以通过索引获取对应位置上的元素。
在接口中定义了一些操作元素的方法,如获取元素数量、添加、删除、替换、截取等。
ArrayList实现类(掌握)
采用数组实现的集合
可以通过索引访问元素、可以改变集合大小。如果要在其中插入或删除元素时,会影响其余元素。
该集合查询效率高、增删中间元素效率低。
该集合对象中保存的元素,都是引用类型(对象的内存地址)。即使保存了123,其实不是保存的int
类型的123,而是Integer类型的123.
4、构造方法
ArrayList()
创建一个无参的ArrayList对象。实际是创建了一个空的Object数组。在调用添加
元素方法时,才会初始化该数组大小为10。
ArrayList(int capacity)
创建一个指定容量的ArrayList对象,实际是创建一个指定大小的Object数组,如
果参数为负,会抛出IllegalArgumentException异常
5、常用方法
add(Object obj) :添加obj到集合的末尾 。返回值:boolean。
add(int index,Object obj): 添加obj到index索引上。返回值: void。
get(int index) :得到指定index索引的元素。返回值: Object。
set(int index,Object obj): 使用obj覆盖index索引的元素,返回被覆盖的元素 。返回值:Object。
size() :获取集合中的元素数量。返回值: int
isEmpty() :判断集合是否为空。返回值:boolean。
clear(): 清空集合。返回值: void。
remove(Object obj): 删除指定obj对象。返回值: boolean。
remove(int index): 删除指定Index索引的元素,返回被删除的元素 。返回值:Object。
contains(Object obj): 判断是否存在obj元素 。返回值:boolean。
indexOf(Object obj) :得到元素obj第一次出现的索引。返回值: int。
lastIndexOf(Object obj): 得到元素obj最后一次出现的位置。返回值: int。
subList(int from,int to): 得到[from,to)区间内的元素。返回值: List。
toArray() :将集合转换为数组 。返回值:Object[]。
6、LinkedList实现类
采用双向链表实现的集合
集合中保存的每个元素也称为节点,除首尾节点外,每个节点即保存了自己的数据,也保存了其前
一个和后一个节点的地址
如果在其中进行插入和删除的操作时,不影响其他元素的位置,只需要重新定义新节点的前后节点
位置即可。
如果要查询某个节点的索引,需要从头结点或尾结点开始一步步得到目标节点位置
所以中间进行插入和删除的效率高,随机读取的效率低
构造方法:LinkedList(), 创建一个空链表。
常用方法:由于LinkedList实现了List接口,所有这里省略List接口中常用的方法,如add(Object obj)、Remove(Object obj)等。参考ArrayList中的方法。
addFirst() 添加头结点
addLast() 添加尾结点
getFirst() 得到头结点
getLast() 得到尾结点
remove() 删除头结点
removeFirst() 删除头结点
removeLast() 删除尾结点
push(Object obj) 添加头结点(入栈)
pop() 得到并移除头结点(出栈)
peek() 得到头结点
poll() 删除头结点
offer(Object) 添加尾结点
7、
ArrayList和LinkedList的区别
两者都是List接口的实现类,保存的元素有序可重复,允许保存null,拥有一些公共的方法,如
size(),isEmpty(),subList(int from,int to)等
ArrayList采用数组实现,对于随机读取效率更高,通常用于查询;LinkedList采用双向链表实现,
插入删除不影响其他元素位置,通常用于中间插入删除。
8、
哈希码的特点
如果两个对象的hashCode不同,这两个对象一定不同
如果两个对象的hashCode相同,这两个对象不一定相同
如"通话"和"重地"这两个字符串的hashCode相同,但是两个对象
hashCode相同,对象不同,称为哈希冲突
9、
HashSet实现类
采用哈希表实现
元素不能重复,无序保存,允许保存null
本质是一个HashMap对象,调用add()方法,实际调用的也是HashMap中的put()方法,参数作为
put()方法的键,new Obejct()作为put()方法的值
HashSet添加数据的原理
if(两个对象hashCode相同&&两个对象equals相同){视为同一对象,不能添加}
每次向集合中添加元素时,先判断该元素的hashCode是否存在,
如果不存在,视为不同对象,直接添加
如果存在,再判断equals方法的结果
如果为false,视为不同对象,直接添加
如果为true,视为同一对象,不能添加
可见不能添加的条件是两个对象的hashCode相同并且equals结果为true。
如果每次都只判断equals的话,过程可能会很久,效率不高,
如果每次只判断hashCode的话,有可能会有哈希冲突,
所以先判断hashCode,再判断equals,既能保证效率又能保证添加进去的元素都是不相同的元素。
equals方法和hashCode的关系
如果两个对象的equlas方法比较结果为true,在没有重写equals方法的前提下,hashcode相同
吗?
相同
如果两个对象的hashCode不同,在没有重写equals方法的前提下,equals方法比较结果为?
false
如果两个对象的hashCode相同,equals方法比较结果为?
可能为true也可能是false
构造方法
HashSet() 创建一个默认的集合对象,实际是创建了一个大小为16,加载因子为0.75的HashMap对象
HashSet(int capacity) 创建一个指定容量的集合对象,实际是创建了一个指定大小,加载 因子为0.75的HashMap对象
HashSet(int capacity,float loadFactor) 创建一个指定容量和指定加载因子的集合对象。
常用方法
add(Object obj) 添加元素到集合中
size() 得到元素数量
isEmpty() 判断集合是否为空
remove(Object obj) 根据对象删除元素
contains(Object obj) 判断是否存在某个元素
toArray() 将集合转换为Object数组
clear() 清空集合
10、
TreeSet实现类
特殊的Set实现类,数据可以有序保存,可以重复,不能添加null元素
采用红黑树(自平衡二叉树)实现的集合
二叉树表示某个节点最多有两个子节点
某个节点右侧的节点值都大于左侧节点值
只能添加同一种类型的对象且实现了Comparable接口的对象
实现Comparable接口后必须要重写compareTo方法
每次调用添加时,参数会自动调用该方法
添加的元素可以自动排序
compareTo方法的返回值决定了能否添加新元素和新元素的位置
如果返回0,视为每次添加的是同一个对象,不能重复添加
如果返回正数,将新元素添加到现有元素之后
如果返回负数,将新元素添加到现有元素之前
11、HashMap实现类
JDK1.8之后,HashMap的数据结构采用"数组+链表+红黑树"实现
当没有哈希冲突时,元素保存到数组中
如果哈希冲突,在对应的位置上创建链表,元素保存到链表中
当链表元素数量大于8,转换为红黑树
数据采用"键值对"的形式保存,键称为key,值称为value ,键不能重复,允许null,值没有限
制,键和值都是引用类型
在哈希表中,哈希码就是键,保存的数据就是值,可以通过键得到相应的值。
常用方法
put(Object key,Object Value) 添加一组键值对
get(Object key) 根据键得到值
size() 得到键值对的数量
clear() 清空所有键值对
keyset() 得到所有键的集合
values() 得到所有值的集合
containtsKey(Object key) 判断是否包含某个键
containsValue(Object value) 判断是否包含某个值
remove(Object key) 根据键删除键值对
十四、File文件
Java中可以将本地硬盘中的文件(文件和目录)以对象的形式表示。
就能通过Java代码对本地文件进行读取或操作。
1、构造方法
File(String pathName) 根据文件的完整路径创建对象
File(String parent,String name) 根据文件所在的父目录路径和自身文件名创建对象
File(File parent,String name) 根据文件所在父目录文件对象和自身文件夹创建对象
2、常用方法
exists(): 判断文件是否存在。返回值: boolean。
isFile() :判断是否为文件。返回值: boolean。
isDirectory(): 判断是否为目录。返回值: boolean。
getName(): 得到文件名 。返回值: String。
getPath() :得到文件所在相对路径。返回值: String。
getAbsolutePate() :得到文件所在绝对路径。返回值: String。
getParent() :得到父目录的名称 。返回值: String。
getParentFile(): 得到父目录的对象。返回值: File。
lastModified(): 得到文件最后一次修改时间对应的毫秒数 。返回值: long。
length(): 得到文件的所占字节大小。返回值: long。
isHidden(): 判断文件是否为隐藏 。返回值: boolean。
list() :得到目录下的第一层子文件名的字符串数组 。返回值: String[]。
listFiles() :得到目录下的第一层子文件的文件数组 。返回值: File[]。
delete(): 删除某个文件或空目录 。返回值: boolean。
mkdir() :创建一个空目录 。返回值: boolean。
renameTo(File newFile): 将原文件命名为新文件(新文件可以指定新位置)。返回值: boolean。
十五、I/O流
1、
流的分类
Java中将流定义成了类,以对象的形式保存。流有"四大家族",是所有流的父类。
InputStream字节输入流
FileInputStream ObjectInputStream
OutputStream字节输出流
FileOutputStream ObjectOutputStream
Writer字符输出流
FileWriter BufferedWriter
Reader字符输入流
FileReader BuffedredReader
2、
按方向分类
输入流:InputStream、Reader
作用:将硬盘中的数据读取到内存中
输出流:OutputStream、Wrtiter
作用:将内存中的数据写入到硬盘中
3、
按类型分
字节流:InputStream、OutputStream
作用:适用于非文本类型,如图片、文件等的读写
字符流:Reader、Writer
作用:适用于文本类型,尤值txt格式文件的读写
如要将硬盘中某个txt文件中的字符读取到程序中,使用Reader
如要将硬盘中的某个图片读取到程序中,使用InputStream
4、流的四个父类的特点
以上四个类都在java.io包下,都是抽象类,不能直接创建其对象,要使用其子类
这四个类都有close()方法,用于关闭流对象释放资源
输出流(OutputStream和Write)都有flush()方法,用于将流中的数据到冲刷到硬盘中
在使用输出流对象时,一定要调用flush()或close()方法后,才能真正将数据写到硬盘中
输入流(InputStream和Reader)都有read()方法读取数据到内存中,输出流都有write()方法写入数
据到硬盘中
所有的流类中,以Stream结尾的,都是字节流,以Reader或Writer结尾的都是字符流
读取硬盘中的数据时,使用输入流;将数据写入到硬盘中时,使用输出流
读取或写入文本文件时,使用字符流;读取或写入非文本文件时,使用字节流
5、FileInputStream文件字节输入流
按字节读取本地文件,本地文件必须存在
构造方法
FileInputStream(String pathName) 根据文件名创建文件字节输入流对象
FileInputStream(File file) 根据文件对象创建文件字节输入流对象
常用方法
read() 读取一个字节。返回读取到的字节本身。
read(byte[] b) 按字节数组读取。返回读取到的字节数量。读取到的内容保存在了字节数组中
close() 关闭流对象
6、FileOutputStream文件字节输出流
按字节将数据写入到本地文件中,本地文件可以不存在
构造方法
FileOutputStream(String pathName) 根据文件名创建文件字节输出流对象,写入内容时覆盖原内容。
FileOutputStream(String pathName,boolean append) 根据文件名创建文件字节输出流对象,写入内容时追加在原内容之后。
FileOutputStream(File file) 根据文件对象创建文件字节输出流对象,写入内容时覆盖原内容。
FileOutputStream(File file,boolean append) 根据文件对象创建文件字节输出流对象,写入内容时追加在原内容之后。
常用方法
write(int i) 写入一个字节
write(byte[] bytes) 写入一个字节数组
write(byte[] bytes,int off,int len) 写入字节数组中从off开始的len个字节
flush() 将数据冲刷到本地文件中
close() 关闭流对象
7、使用FileInputStream和FileOutputStream读写时的注意事项
(1)在使用read(byte[] bytes)方法时,每次都会读取指定数组大小的字节,将读取到的字节保存到数组
中,该方法返回读取到的字节数量。如果最后一次读取的字节数不足字节数组大小时,只会用读取
到的内容覆盖最前的几个元素。所以会导致读取到的内容多于实际内容。
(2)在使用write(byte[] bytes)方法时,会将字节数组中的所有内容写入到输出流中,在最后一次写入
时,可能会写入多余的内容。所以在写入时,最好使用write(byte[] bytes,int off,int len)方法,表
示将字节数组中的元素,从off开始,写入len个字节。
8、FileReader文件字符输入流(按字符读取文件)
构造方法
FileReader(String fileName) 根据文件名创建文件字符输入流对象
FileReader(File file) 根据文件对象创建文件字符输入流对象
常用方法
ready() 判断是否还有下一个字符
read() 读取下一个字符,返回读取到的字符
read(char[]
chars) 按字符数组读取字符,返回读取到的字符数量,读取到的字符保存在了字符 数组中
close() 关闭流对象
9、FileWriter文件字符输出流(按字符写入)
常用的构造方法
FileWriter(String fileName) 按文件名创建字符输出流对象
FileWriter(String fileName,boolean append) 按文件名创建字符输出流对象,允许追加写入
FileWriter(File file) 按文件对象创建字符输出流对象
FileWriter(File file,boolean append) 按文件对象创建字符输出流对象,允许追加写入
常用方法
write(String str) :按字符串写入。
write(char[] c): 按字符数组写入。
write(String str,int off,int len): 按字符串写入,从off开始写入len个字符。
write(char[] c,int off,int len) :按字符数组写入,从off开始写入len个字符。
flush() :冲刷流中的数据到硬盘中(必须调用该方法或close方法后,才能真正写入)。
close(): 关闭流对象。
10、BufferedReader字符缓冲输入流
自带字符数组(缓冲区)的字符输入流。默认字符数组大小为8192,每次最多读取8192个字符
在读取纯文本文件(txt或md等)时,首选该类。
构造方法
BufferedReader(Reader reader)
创建一个带有缓冲区(字符数组)的字符输入流对象,默认缓冲区大
小为8192。参数注意是一个Reader类型的对象,但Reader是一个
抽象类,所以要使用其子类,如FileReader,然后在FileReader中
定义要读取的文件信息
BufferedReader(Reader reader,int size)
创建一个指定缓冲区(字符数组)大小的字符输入流对象
常用方法
ready() 判断是否还有字符
readLine() 读取整行字符
close() 关闭流对象
11、BufferedWriter字符缓冲输出流
自带字符数组(缓冲区)的字符输出流。
构造方法
BufferedWriter(Writer writer)
创建一个带有缓冲区(字符数组)的字符输出流对象,参数为一个
Writer对象,但Writer是一个抽象类,所以要使用其子类,如
FileWriter对象,在FileWriter中定义要写入的文件
BufferedWriter(Writer writer,int size)
创建一个指定缓冲区(字符数组)大小的字符输出流对象
常用方法
write(String str) 写入一个字符串
newLine() 换行
flush() 将输出流中的字符冲刷到文件中
close() 关闭流对象
12、ObjectOutputStream对象字节输出流(序列化)
序列化:将对象转换为文件的过程
被序列化的对象,必须要实现Serializable接口。
这个接口是一个特殊的接口,没有定义方法,只是给这个类打上标记,表示该类可以被序列化。
构造方法
ObjectOutputStream(OutputStreamos)
创建一个对象字节输出流对象,参数为一个字节输出
流对象,由于是抽象类,所以要使用其子类,如
FileOutputStream对象,在其中定义要写入的文件。
常用方法
writeObject(Object obj) 将一个对象写入到本地文件中
close() 关闭流对象
13、ObjectInputStream对象字节输入流(反序列化)
反序列化:将文件转换为对象的过程
构造方法
ObjectInputStream(InputStreamis)
创建一个对象字节输入流对象,参数为一个字节输入流对
象,由于是抽象类,所以要使用其子类,如
FileInputStream对象,在其中定义要读取的文件
常用方法
readObject()
读取序列化后的文件,返回对象Object
close()
关闭流对象