Java复习笔记+经验总结-05 集合框架 IO流

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/yanglong_blog_/article/details/78105970

集合:java.util包下提供了一些集合, ListSetMap. 集合又称为容器,长度可变。

注意:数组用来存放基本数据类型,集合用来存放类对象的引用

List,Set,Map,Collection接口特征如下:

1.CollectionListSet的父接口

2.List实现了Collection接口,允许存放重复的对象,按照对象插入的顺序排序

3.Set接口实现了Collection接口,不允许存放重复的对象,按照自身的内部规则排序

4.Map接口以键值对(key-value)的形式存放对象, 其中key不可重复,value值可以重复,按照自身内部规则排序

Collection接口中的方法:

1.add(E obj) 将指定的对象添加的集合中

2.addAll(Collection<? extends E col> 将指定集合中的 所有对象添加到集合中

3.remove(Object o) 将指定的对象从该集合中移除,返 回值为布尔类型

4.retainAll(Collection<E col>) 仅保留指定集合,返回布 尔类型

5.contains(Object o) 查看集合中是否包含指定对象,返 回布尔类型

6.isEmpty() 查看集合是否为空,返回布尔型

7.size() 返回集合中存放对象的个数

8.clear() 清空集合

9.toArray() 包含所有对象的Object型数组

10.toArray(T[] t) 包含指定类型的数组

注意:removeAll(Collection c) 只要集合c中有相同元素就移除,不是指两个集合完全相对时移除。retainAll(Collection c)方法相当于求两个集合的交集.

 

List集合:List实现了Collection接口,所以有Collection接口的所有方法,也有自己的方法

set(int index, Object o) 指定index位置的对象修改为o

get(int index) 获得index位置的对象

indexOf(Object o) 返回第一个出现该对象的下标, 存在时返回-1

lastIndexOf(Object o) 返回最后一个对象出现的小标,不 存在时返回-1

subList(int fromIndex, int toIndex) 截取集合,重新生成 新集合

List<Object> list = new ArrayList<Object>();

List接口的实现类有ArrayList,LinkedList

使用ArrayList:ArrayList采用数组结构保存对象,优点在于对集合进行随机访问,在向ArrayList中插入或删除元素时,会造成元素的移动。

LinkedList:实现了Collection接口,Collection的所有方法,也有自己的方法.

addFirst(E obj) 将指定对象添加到头结点

addLast(E obj) 将指定对象添加到尾结点

getFirst() 获得头结点

getLast() 获得尾结点

removeFirst() 删除头结点

removeLast() 删除尾结点

LinkedList<Object> list = new LinkedList<Object>();

 

LinkedList:LikedList采用双向链表结构保存对象, 优点在于对集合插入或删除时,只用修改指针,如果经常的删除或插入元素,使用LinkedList,缺点是对随机访问速度较慢.

 

Set集合:Set集合中不能存放重复的对象,经常使用的是HashSetTreeSet.

HashSet:HashSet实现了Set集合接口,优点是能够快速的定位集合中的元素,集合中的元素必须唯一。所有HashSet实现的集合需要重写equals()方法和hashCode()方法

注意:HashSet底层是哈希表,哈希表存储原则就是要求元素不重复,且分布均匀防止冲突.

TreeSet:TreeSet不仅实现了Set接口,还实现了SortedSet接口.在存放由TreeSet实现的Set集合的对象时,必须实现Comparable接口,即可以通过比较器对TreeSet中的集合对象排序.

注意:TreeSet底层为红黑树,即特殊的平衡二叉树,所以不允许对象为null,也不允许为重复的值.

 

Map集合:Map为映射关系,映射中存储Key-Value,要求键(Key)必须是唯一的,按照散列码的方式自身内部排序.通过散列技术得到的散列码应该是均匀分布的整数值,且每个键对象都有唯一的散列码(哈希码),常用实现类有HashMap TreeMap

 

HashMap:HashMap通过哈希码在其内部具有映射关系,所以需要对元素定位、添加或者删除时候使用效率高.

注意:使用HashMap用对象作为Key值时,需要重写hashCode()方法,HashMap运行Key的值为null

 

TreeMap:TreeMap具有一定的顺序(当对象实现比较器),当需要对元素遍历操作的时候使用TreeMap.TreeMap不允许Key值为空

注意:因为List/Set/Map的方法多,最重要的无非就是集合的增删改查,List实现类的add方法,Map实现类的put方法等,在使用时可通过编译器的提示,知道他们对应的方法即可.



File: File类对象可以获取文件及其文件所在的目录、文件的长度等信息.

File常用构造函数:

1. new File(pathName)
pathName:文件路径字符串, 包括文件名称。

2. new File(path, fileName)

path:父路径字符串。

3. new File(file, fileName)

file:父路径对象, 子路径字符串

File类常用方法:

1. getName() 获取文件的名字

2. getPraent() 获取文件的父路径字符串

3. getAbsolutePath() 获取文件的绝对路径

4. exists() 判断文件或文件夹是否存在

5. isFile() 判断文件是否是一个正常文件, 而不是目录

6. isDirectory() 判断是不是文件夹

7. mkdir() 创建文件夹, 成功返回true

8. createNewFile() 创建一个新文件
注意: 创建一个File对象时, 如果文件不存在, 系统不会自动创建, 不许要调用createNewFile()方法来创建.

if( !file.exists() ){

file.createNeewFile();

}

: 流是一组有序的数据序列。根据操作类型, 可分为输入输出流.输入输出流一般分为字节输入/输出(InputStream/OutputStream)流和字符输入输出(Reader/Writer).

注意: InputStream是所有字节输入流的父类, 是一个抽象类

OutputStream是所有字节输出流的父类, 是一个抽象类

Reader, Writer分别是所有字符输入流, 输出流的父类, 他们都是抽象类.

字节流: 以字节为单位, 它不会对数据进行任何转换, 因此用来处理二进制数据.

InputStream(字节输入流)抽象类提供常用方法:

1. int available() 返回当前可以读取的有效字节数量

2. int read(byte[] bytes) 读取字节存入bytes数组

3. int read(byre[] bytes, int off, int len) 最多读取len个字节存入byte数组

4. void close() 关闭当前输入流, 释放系统资源

5. void mark() 在此输入流中标记当前的位置。

注意: read()无参方法被定义为Abstract方法, 目的是为了让继承InputStream类的子类针对不同的外部设备实现不同read方法.

OutputStream(字节输出流)抽象类提供常用方法:

1. write(byte[] bytes) bytes数组写入当前输出流

2. write(byte[] bytes, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

3. void flush() 刷新此输出流并强制写出所有缓冲的输出字节。

4. void close() 关闭当前输出流

注意: write(int b)方法被定义为Abstract方法, 目的是为了让继承OutputStream类的子类针对不同的外部设备实现不同write方法.

FileInputStreamFileOutputStream:

1. FileInputStream: 文件字节输入流, 实现了文件的读取, 适合于比较简单的文件读取, 其所有方法都是从InputStream继承并重写的.

常用构造方法:

1) new FileInputStream(String filePath)

filePath: 文件的绝对路径或相对路径.

2) new FileInputStream(File file)

file: 文件类型的实例对象.

2. FileOutputStream: 实现了文件都写入, 能够以字节形式写入文件, 该类的所有的方法都是从OutputStream类继承并重写。
常用构造方法:

1) new FileOutput(String filePath)

2) new FileOutputStream(file, boolean append)

注意: 如果省略append,将会覆盖文件.如果appendtrue则会对原有内容追加。

字符流: 用于处理字符数据的读取和写入, 以字符为单位。

Reader(字符输入流): 所有字符输入流的父类。

常用方法:

1. int read() 读入一个字符, 若读到流结尾返回 -1

2. int read(char[] buf) 读到buf, 读到末尾返回-1

3. long skip(long n) 跳过字符, 返回跳过字符的数量

4. void close() 关闭字符输入流
Writer(字符输出流): 所有字符输出流的父类

常用方法:

1. void write(int c) 将字符c写入输入流

2. void write(char[] buf) 将字符数组buf写入输入流

3. void write(String str) 写入字符串

4. void flush() 刷新当前输入流

5. void close() 关闭当前字符输出流

InputStreamReaderOutputStreamWriter:

1. InputStreamReader: 字节流通向字符流的桥梁。它可以根据指定的编码方式, 将字节输入流转换为字符输入流。

常用的构造方法:

1) new InputStreamReader(InputStream in)

2) new InputStreamReader(InputStream in, String cname);

该构造方法使用已命名的字符编码格式创建字符输入流, 其中cname表示编码方式。

常用方法:

1). void close()  关闭流

2). int read() 读取单个字符

3). int read(char[] cb, int off, int len) 将字 符读入数组中的某一部分

4)String gerEncoding() 返回流使用的字符编码名称

5)boolean ready() 报告此流是否已准备读
2. OutputStreamWriter:字节流转为字符输出流的桥梁

常用构造方法:

1). OutputStreamWriter(OutputStream out)

2). OutputStreamWriter(OutputStream out, String cname)

cname:字符编码格式, 常用的字符编码有GBK, GB2312,UTF-8等编码格式。

常用方法:

1). void flush() 刷新流的缓冲

2). void close()  关闭流, 关闭之前先刷新

3). void write(int char) 写入单个字符

4). void write(String s, int off, int len) 写入 字符串某一部分

5)void write(char[] cb, int off, int len) 写入 字符数组中的某一部分

FileReaderFileWriter

1. FileReader:实现了从文件中读取字符数据, 文件字符输入流, 该类的所有方法继承自Reader

常用构造方法:
1). FileReader(String filePath)
filePath: 文件的绝对路径或相对路径.

2). FileReader(File file)
file: File文件类型的实例对象.

2. FileWriter:Writer类的子类, 实现了将字符数据写入文件, 该类所有的方法都是继承于Writer
常用构造方法:

1). FileWriter(String filePath)

2). FileWriter(File file)

BufferedReaderBufferedWriter:

1. BufferedReader: 该类以行为单位读取数据。

主要构造方法:

1). BufferedReader(Reader in)

2). BuffferedReader(Reader in , int size)

size为指定缓冲区大小
2. BufferedWriter: 以行为单位写入数据。
主要构造函数:

1). BufferedWriter(Writer out)

2). BufferedWriter(Writer out int size)
注意: BufferedReader提供了readerLine()方法, 该方法能够读取文本行.

PrintStreamPrintWriter:

1. PrintStream: 打印输出流,可以直接输出各种数据类型的数据
常用构造方法:
1). PrintStream(OutputStream out)

2). PrintStream(File file)

常用方法:
1). print(String str) 打印字符串

2). print(Object obj) 打印对象

3). println(char[] ch) 打印字符数组并换行

...

2. PrintWriter: 打印输出流, java的数据类型以字符形式传送到相应的输出流中, 可用文本的形式查看。
常用构造方法:
1). PrintWriter(Writer out)

2). PrintWriter(OutputStream out)
常用方法:
1). print(String str)

2). print(int i)

3). ptintln() 将换行符写到输出流

注意: System.in可用于获取用户输入, System类被final修饰, 不能被继承。in是静态变量, 类型是InputStream
RandomAccessFile:
可以读取任意位置数据的文件, 既不是输入流的子类, 也不是输出流的父类, 继承Object
常用构造方法:
1). RandomAccessFile(String name, String mode)
name: 和系统相关的文件名

mode: 文件的访问权限, 可以是r/rw/rws/rwd(r代表只读, rw代表可读写, rws代表同步写入, rwd代表更新同步写入)

2). RandomAccessFile(File file, String mode)
常用方法:
1). long getFilePointer()返回此文件中的当前偏移量

2). void seek(long pos) 设置文件指针位置

3). String readLine() 读取一行文本

4). write(byte[] bytes) 写入字符数组

...

对象序列化(Object Serialization): 使用对象输入输出实现对象序列化, 可以直接存取对象。将对象存为一个流被称为序列化, 从一个流将对象读出称为反序列化。

ObjectInputObjectOutput: 它们分别实现了DataInputDataOutput接口, 提供了对象序列化的方法.使用WriteObject(obj)实现对象的序列化, 使用readObject()实现反序列化。

注意: 被序列化的对象必须实现java.io.Serialization接口, 否则不能实现序列化.
ObjectInputStreamObjectOutputStream:
它们分别是对象输入流和对象输出流, InputStreamOutputStream的子类, 继承了它们所有的方法, ObjectInputStreamreadObject(), ObjectOutputStreamwriteObject(obj)方法。

注意: 如果在用完流之后不关闭, 可能会造成内存泄漏, 不建议这样做, 用完流之后要将其关闭.

猜你喜欢

转载自blog.csdn.net/yanglong_blog_/article/details/78105970