集合:在java.util包下提供了一些集合, 如List、Set、Map. 集合又称为容器,长度可变。
注意:数组用来存放基本数据类型,集合用来存放类对象的引用
List,Set,Map,Collection接口特征如下:
1.Collection是List和Set的父接口
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集合中不能存放重复的对象,经常使用的是HashSet和TreeSet.
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方法.
FileInputStream和FileOutputStream:
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,将会覆盖文件.如果append为true则会对原有内容追加。
字符流: 用于处理字符数据的读取和写入, 以字符为单位。
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() 关闭当前字符输出流
InputStreamReader与OutputStreamWriter:
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) 写入 字符数组中的某一部分
FileReader与FileWriter
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)
BufferedReader与BufferedWriter:
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()方法, 该方法能够读取文本行.
PrintStream与PrintWriter:
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): 使用对象输入输出实现对象序列化, 可以直接存取对象。将对象存为一个流被称为序列化, 从一个流将对象读出称为反序列化。
ObjectInput与ObjectOutput: 它们分别实现了DataInput和DataOutput接口, 提供了对象序列化的方法.使用WriteObject(obj)实现对象的序列化, 使用readObject()实现反序列化。
注意: 被序列化的对象必须实现java.io.Serialization接口, 否则不能实现序列化.
ObjectInputStream和ObjectOutputStream: 它们分别是对象输入流和对象输出流, 是InputStream和OutputStream的子类, 继承了它们所有的方法, ObjectInputStream有readObject(), ObjectOutputStream有writeObject(obj)方法。
注意: 如果在用完流之后不关闭, 可能会造成内存泄漏, 不建议这样做, 用完流之后要将其关闭.