导图社区 IO开发编程知识点笔记
,格式化标准IO编程 //输入与输出可以控制格式,printf(屏幕默认打开),scanf(键盘输入) 2,非格式化标准IO编程 //输入与输出没有格式化,以字节流写 标准IO经过 文件IO没有。 一,标准I..
编辑于2022-11-14 10:24:27 广东集合IO开发编程知识点笔记
集合
步骤
创建集合对象
创建元素对象
添加元素对象到集合
遍历集合
Collection集合
添加功能
(掌握)boolean add(Object e): 把给定的对象添加到集合中
boolean addAll(Collection c) : 把给定的集合 添加到该集合中
删除功能
(掌握)void clear() : 把集合中的元素清空
(掌握)boolean remove(Object o): 在该集合中 删除给定的对象
boolean removeAll(Collection c): 在该集合中 删除给定的集合
判断功能
(掌握)boolean contains(Object o): 判断该集合中是否包含给定的对象
boolean containsAll(Collection c): 判断该集合中 是否包含给定的集合
(掌握)boolean isEmpty(): 判断集合是否为空
获取功能
(掌握)Iterator<E> iterator(): 迭代器-- 遍历功能
交集功能
boolean retainAll(Collection c): 比较两个集合中是否有相同的元素
长度功能
(掌握)int size(): 获取集合的元素的个数
面试题
请问数组中有length()? 请问字符串中有length()? 请问集合中有length()?
转换功能
(掌握)Object[] toArray(): 把集合 转换成 数组
案例
通过集合 存储自定义对象, 并遍历 toArray() 先转换成数组,再遍历数组
通过集合 存储自定义对象, 使用迭代器遍历集合
List集合
特点
可以有重复元素
有序的(数据的存取顺序一致)
添加功能
void add(int index, Object element) : 把给定的元素添加到集合中的指定位置
删除功能
Object remove(int index): 把指定位置的元素删除
获取功能
Object get(int index): 获取该集合中给定位置的元素
int indexOf(Object o): 获取给定的对象在集合中第一次出现的位置
遍历功能 迭代器
ListIterator<E> listIterator()
替换功能
Object set(int index, Object element): 用给定的元素,替换指定位置上的元素
截取功能
List subList(int fromIndex,int toIndex) : 从指定位置开始,到指定位置结束,截取该集合
案例
通过List集合 get(index) 获取集合中元素,进行集合的遍历
通过List集合 存储自定义对象, 使用ListIterator迭代器遍历集合
通过List集合 存储 4个 (Person [name, age])自定义对象
ArrayList
特点
线程不同步的,速度快
底层实现 数组
案例
ArrayList存储字符串并遍历
ArrayList集合 存储字符串对象,并遍历 (使用泛型)
ArrayList集合存储自定义对象, 并遍历 (泛型、 增强for)
ArrayList存储 多个自定义对象, 去掉重复的元素对象(新集合)
ArrayList存储 多个字符串, 去掉重复的字符串元素对象(新集合)
Vector
特点
线程同步的, 速度慢
底层实现 数组
添加功能
public void addElement(Object obj)
获取功能
public Object elementAt(int index)
public Enumeration elements()
boolean hasMoreElements()
Object nextElement()
LinkedList
线程不同步的,速度快
底层实现 链表
添加功能
public void addFirst(Object e)
public void addLast(Object e)
获取功能
public Object getFirst()
public Object getLast()
删除功能
public object removeFirst()
public Object removeLast()
案例
(选作)使用LinkedList 模拟 Stack, 创建对象,加入元素,取出元素
Set集合
特点
元素唯一
无序(存入与取出顺序不一致)
HashSet
特点
底层实现是 哈希表
如何保证元素唯一性: 重写hashCode() 与 equals()方法
LinkedHashSet
特点
底层实现是 哈希表 + 链表
案例
LinkedHashSet存储字符串并遍历
案例
HashSet存储多个字符串并遍历
HashSet存储自定义对象并遍历
TreeSet
特点
底层实现是 二叉树结构
保证数据的唯一和排序
实现自然排序接口(Comparable[ compareTo(p) ] ) 或者 实现比较器接口(Comparator [ compare(p1,p2) ] )
排序: 由自己来定义规则
案例
TreeSet集合存储字符串并遍历
TreeSet集合存储自定义对象并遍历(自然排序)
TreeSet集合存储自定义对象并遍历(比较器)
案例
Set存储多个字符串并遍历
Map集合
特点
Map集合中的键 是唯一的
Map集合中的值 是可以重复的
添加功能
V put(K key,V value)
如果指定的键,在集合中不存在,添加方法
如果指定的键,在集合中存在,修改方法
删除功能
void clear(): 清空集合
V remove(Object key): 根据指定的键, 删除集合中的元素
判断功能
boolean containsKey(Object key): 判断集合中是否包含指定的键
boolean containsValue(Object value): 判断集合中是否包含指定的值
boolean isEmpty(): 判断集合是否为空
获取功能
Set<Map.Entry<K,V>> entrySet() : 获取集合中键值对对象, 返回Set集合
V get(Object key): 根据指定的键 获取对应值
Set<K> keySet(): 获取集合中所有的键
Collection<V> values(): 获取集合中所有的值
长度功能:
int size():
HashMap
特点
底层是哈希表结构
如何保证HashMap集合中的key唯一: 重写hashCode() 和 equals()
案例
HashMap集合存储自定义对象并遍历(键是String,值是Student)
HashMap集合存储自定义对象并遍历(键是Student,值是String)
HashMap集合的遍历操作(结婚证方式) (理解)
TreeMap
特点
底层是二叉树结构
排序
按照自然顺序 或者 比较器排序
如何保证TreeMap集合中的key唯一
实现自然排序接口 或者 实现比较器接口
案例
TreeMap集合存储字符串对象并遍历
TreeMap集合存储自定义对象并遍历((键是Student,值是String)
TreeMap练习(获取字符串中,每一个字母出现次数)
Hashtable
面试题
HashMap与Hashtable的区别
HashMap
线程是不安全的,效率高
允许使用 null 值和 null 键
Hashtable:
线程是安全的,效率低
不允许使用 null 值和 null 键
案例
Map集合中的遍历操作(键找值)(掌握)
Map集合的嵌套练习(czbk学生信息)
Map集合的嵌套练习(czbk中的学生使用自定义对象来封装)
数据结构
线性表、链表、栈、队列、树、图、哈希表
Stack堆栈
特点: 先进后出
public boolean empty() : 测试堆栈是否为空
public Object pop() : 移除堆栈顶部的对象,并作为此函数的值返回该对象
public E push(E item): 把项压入堆栈顶部
泛型
泛型的使用
查看API,发现类或者接口有<>, 如果有泛型,那么一般情形下建议使用
可以避免 操作隐患ClassCastException
<>里面 用来指定元素的数据类型,不能是基本数据类型
通配符:?
泛型上边界: ? extends T
?代表T的类型,或者T类型的子类
泛型下边界: ? super T
?代表T的类型,或者T类型的父类
编译器的约束,生产.class文件后,class文件中没有泛型
增强for循环
格式
用来替代 迭代器 jdk5出现的
什么时候使用迭代器 增强for, 什么时候使用普通for?
需要操作索引的时候 使用普通for,其他的时候使用(迭代器 增强for)
Collections集合工具类
面试题
Collections与 Collection 区别?
Collection: 单列集合的顶层接口
Map: 双列集合的顶层接口
Collections: 集合的工具类
方法
public static <T> List<T> synchronizedList(List<T> list)
作用:把线程不安全集合,包装成线程安全的集合
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
IO
异常
方式1:try..catch
try{ 可能出现错误的代码 } catch (异常类型 变量名) { 对错误做出处理 } finally { 必须要执行的操作 通过用来进行资源的释放 }
方式2:抛出异常
方法的小括号后面 throws 异常类型
面试题
final、finally、finalize 请说明他们是什么?
final: 修饰符
修饰变量,相当于是一个常量 修饰方法,不能被子类重写 修饰类, 不能被继承
finally: 异常处理代码中一部分
finally里面的代码肯定会执行
特殊情况: 如果在执行到finally之前,JVM就结束了,这时,finally不会执行
System.exit(0)
finalize
是Object类中的一个方法finalize(): 垃圾回收
File
构造函数
public File(String pathname) : 根据路径名称创建一个File对象
public File(String parent, String child) : 根据给定的父路径 与 给定的子路径或者文件, 创建一个File对象
public File(File parent, String child) 根据给定的父File对象 与 给定的子路径或者文件, 创建一个File对象
创建功能
创建文件
public boolean createNewFile() 如果返回值为true,原先文件不存在,创建文件 如果返回值为false,原先文件存在, 不创建文件
创建文件夹
public boolean mkdir() public boolean mkdirs()
删除功能
public boolean delete() : 可以删除文件 或 删除空文件夹
通过java程序删除的文件 不经过回收站
判断功能
判断指定的File是否存在 public boolean exists()
判断File是否是文件 public boolean isFile()
判断File是否是文件夹 public boolean isDirectory()
判断File是否可读 public boolean canRead()
判断File是否可写 public boolean canWrite()
判断File是否隐藏 public boolean isHidden()
重命名功能
public boolean renameTo(File dest)
如果两个File在同一文件夹下, 重命名功能 如果两个File不再同一个文件夹下, 剪切功能并且重命名
获取功能
获取文件的绝对目录: public String getAbsolutePath()
获取文件的目录: public String getPath()
获取文件的名字: public String getName()
获取文件的大小: public long length()
获取文件的最后修改时间: public long lastModified()
返回指定目录下的文件与文件夹
public String[] list() 结果不带盘符, 返回的数据是String类型 public File[] listFiles() 结果带盘符, 返回的数据是File类型
列出当前电脑上所有盘符
public static File[] listRoots()
递归
方法内部调用本方法(理解)
练习
输出指定目录下的所有.java文件的名称 输出指定目录下的所有.java文件的名称(文件名称过滤器) 将指定目录下所有文件的名称 改名 (掌握)递归(输出N的阶乘) (掌握)小兔子问题(斐波那契数列) (练习)获取指定目录下的 所有java文件的绝对路径(包含子文件夹中的java文件) (练习)删除指定目录下的所有文件
IO流
分类: 流向分类: 输入流 输出流 数据类型: 字节流 字节输入流 InputStream 字节输出流 OutputStream 字符流 字符输入流 Reader 字符输出流 Writer
字符输出流:FileWriter
操作步骤: a: 创建字符输出流对象 FileWrtier fw = new FileWriter("fw.txt"); b: 写入数据 fw.write("马上下课了"); c: 释放资源 fw.close();
面试题:
1、close() 与 flush() 的区别? 2、请说出下面的语句做了哪些操作 FileWriter fw = new FileWriter("fw.txt", true);
字符输入流:FileReader
操作步骤: a: 创建字符输入流对象 FileReader fr = new FileReader("fw.txt"); b: 读取数据 char[] buffer = new char[1024]; int len = 0; while ((len = fr.read(buffer)) != -1 ) { System.out.print( String.valueOf(buffer) ); } c: 释放资源 fr.close();
练习
(练习)将文本文件中的内容 获取出来, 在控制台打印(读取一个字符) (练习)将文本文件中的内容 获取出来, 在控制台打印,(使用字符数组) (掌握)把一个文件中的内容 写入到另外一个文件中
IO流分类 字符流 字符输入流 -- Reader 字符输出流 -- Writer 字节流 字节输入流 -- InputStream 字节输出流 -- OutputStream
字节输出流 -- OutputStream
写入数据: public abstract void write(int b) : 写入一个字节 public void write(byte[] b) : 写入一个字节数组 public void write(byte[] b,int off, int len) 写入一个字节数组的一部分
使用字节输出流的步骤: a: 创建字节输出流对象 b: 写入数据 c: 释放资源
字节输入流 -- InputStream
字节输入流的操作步骤: a: 创建字节输入流对象 b: 获取数据 c: 释放资源
字节流案例
使用字节流复制文本文件 使用字节流 复制照片 使用字节流 复制MP3 字符流不能操作非文本文件(图片、音视频)
数据类型分类: 字节流: 字节输入流: InputStream (高效)字节缓冲输入流:BufferedInputStream 字节输出流: OutputStream (高效)字节缓冲输出流: BufferedOutputStream 字符流: 字符输入流: Reader (高效)字符缓冲输入流: BufferedReader 字符输出流: Writer (高效)字符缓冲输出流: BufferedWriter
(高效)字节缓冲输出流操作步骤: BufferedOutputStream a: 创建 (高效)字节缓冲输出流对象 b: 写入数据 c: 释放资源
(高效)字节缓冲输入流操作步骤:BufferedInputStream a:创建 (高效)字节缓冲输入流 对象 b:读取数据 c:释放资源
字节缓冲流的练习: 使用缓冲流 复制文本文件 使用缓冲流 复制图片 使用缓冲流 复制视频(4种方式)
(高效) 字符缓冲输出流的步骤:BufferedWriter a: 创建字符缓冲输出流对象 b: 写入数据 c: 释放资源 BufferedWriter写入数据的三部曲: write(); newLine(); flush(); public void newLine() : 换行符
(高效) 字符缓冲输入流的操作步骤:BufferedReader a: 创建字符缓冲输入流对象 b: 读取数据 c: 释放资源 public String readLine() : 读取一行文本内容,但是不包含换行符
InputStreamReader 是字节流通向字符流的桥梁 需求: 通过键盘输入数据, 写入到 abc.txt 文本文件中 (使用转换流) 数据源: 键盘输入 -- System.in -- InputStream -- //字节流 <-- InputStreamReader --> // 把字节流 转换成 字符流 -- BufferedReader --readLine() //字符流 目的地: abc.txt 文本文件
OutputStreamWriter 是字符流通向字节流的桥梁
把 abc.txt 内容 读取出来, 在控制台输出(使用转换流)
数据源
FileInputStreamDemo.java -- 输入流 -- BufferedReader br.readLine();
目的地:
字符流 <-- 把字节流转换成字符流 <-- 字节流 <-- 控制台输出打印
BufferedWriter <-- OutputStreamWriter <-- OutputStream <-- System.out
bw.write(line); bw.newLine(); bw.flush();
使用上 与 理解上的区别?
理解上: 字符流 --> 字节流 使用上: 字符流 <-- 字节流
打印流:
print(): 可以打印各种数据类型的内容 println(): 可以打印各种数据类型的内容,同时实现换行,如果开启了自动刷新,会自动将数据写入到指定的目标 printf(): 根据指定的规则,进行数据的输出打印 自动刷新:通过构造函数来完成 PrintWriter(Writer out, boolean autoFlush)
Properties
通常用来作为配置文件使用
它是一个Map下Hashtable的子类,所以它是一个Map集合 它是一个可以与流在一起操作的集合对象
添加功能
public Object setProperty(String key, String value) 调用 Hashtable 的方法 put
获取功能
public String getProperty(String key) : 返回给定的key 对应的值 public String getProperty(String key, String defaultValue) 返回给定的key 对应的值, 如果该键不存在,返回 defaultValue public Set<String> stringPropertyNames() 返回键的集合
把集合写入到文件
public void list(PrintStream out) : 把集合数据 写入到指定的文件中 public void list(PrintWriter out) : 把集合数据 写入到指定的文件中
读取文件内容到集合
public void load(InputStream inStream) public void load(Reader reader)
把集合写入到文件(可以添加描述信息)
public void store(OutputStream out, String comments) public void store(Writer writer, String comments)
序列化流ObjectOutputStream
public final void writeObject(Object obj): 将指定的对象写入 ObjectOutputStream
反序列化流ObjectInputStream
public final Object readObject()
注意事项: 需要把自定义对象实现序列化接口(public interface Serializable) 这个时候 这个自定义对象 就可以在流中使用了 为了保证程序使用没有问题, 需要在自定义类中 添加 UID码,之后再操作P自定义类的读取、写入就不会有问题了 private static final long serialVersionUID = -8345153069362641443L;
常见编码表:
ASCII码表:
ISO-8859-1: 西欧使用
GB2312: 国标码
GBK:
GB18030:
BIG5: 繁体中文
Unicode: 统一码
utf-8: 根据不同的地区所使用对应的编码 1-4位字节来组成
可变参数
格式: 修饰符 返回的数据类型 方法名(数据类型... 变量){ }
注意的事项: 变量:其实它是当前数据类型的一个数组 如果在参数列表中使用了可变参数,那么,可变参数必须放在最后面使用
Arrays数组工具类
asList(): 把给定的数组 转换成List集合