学习大数据的第24天——集合一些小细节、异常处理、文件处理(1)
集合总结
Collection 接口 集合顶层接口 –List 元素允许重复,是有序的(存储和取出顺序一致),拥有下标索引的特点 –ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全的,效率高 –Vector 底层数据结构是数组,查询快,增删慢 线程是安全的,效率低 (即使是线程安全的,我们将来不会去使用,因为有更好的去替代) 用Collections中带synchronized方法将不安全的集合转成安全的集合 –LinkedList 底层数据结构是双链表,查询慢,增删快 线程是不安全的,效率高 –Set 元素唯一,无序 –HashSet 底层数据结构是哈希表,哈希表保证元素的唯一性 但是当存储的是自定义对象的时候,要重写hashCode()和equals()方法 –LinkedHashSet 底层数据结构是哈希表和链表,哈希表保证元素的唯一性,链表保证元素的有序(存储和取出顺序一致) –TreeSet 底层数据结构是红黑树,遍历的时候中序遍历 自然排序 元素的数据类型的类要实现Comparable,重写compareTo()方法 比较器排序 自定义一个类实现Comparator接口,重写compare()方法 匿名内部类的形式进行构造方法传参,重写compare()方法
Map 接口 元素是由一个一个键值对组成,键不允许重复,值允许重复 –HashMap 底层数据结构是哈希表,保证了元素的唯一(指的是键的唯一性),元素是无序 当键是自定义类型的时候,要想保证唯一性,就必须重写hashCode()方法和equals()方法 –LinkedHashMap 底层数据结构是哈希表和链表 哈希表保证的是元素的唯一性 链表保证的是元素有序(指的是存储和取出的顺序一致) –TreeMap 底层数据结构是红黑树 排序针对于键来说的 自然排序 比较器排序 自定义一个类实现Comparator接口,重写compare()方法 匿名内部类的形式进行构造方法传参,重写compare()方法
将来开发的时候用谁呢? 1、元素的组成是单个还是成对,如果是单个使用Collection下面的集合,如果是成对出现的,使用Map下面的集合 2、元素允许重复吗? 允许:List 不允许:Set 3、元素需要排序吗? 需要:TreeSet或者TreeMap 不需要:ArrayList等 4、将来查找的功能多吗? 多,用底层是数组的集合 5、将来增删操作多吗? 多,用底层是链表的集合
如果你什么都不知道,用ArrayList。推荐具体情况具体选择。
注意: 增强for循环只能作用于数组和Collection集合,不适用于Map集合
ConcurrentModificationException(并发) 现象:当不允许这样的修改的时候,java就检测到该对象出现了并发修改异常。 原因::在迭代器遍历的时候,不能通过集合去修改元素 解决方案:1、迭代器遍历,迭代器修改 2、集合遍历,集合修改
LinkedList
请用LinkedList模拟栈数据结构的集合,并测试‘
(1)集合和数组的比较
? 数组可以存储同一种基本数据类型和引用数据类型,长度不可变,有下标索引,查询方便。
? 集合存储的只能是引用数据类型,但是引用数据类型可以不同,长度可变。
(2) 简述List、Set、Collection、Map的区别和联系。
? 四者都是接口,都不可以直接实例化
? Collection和Map是并列关系
? List和Set则是Collection的子类
? List允许有重复的元素,且有序
? Set不允许有重复的元素,且无序
?
(3)ArrayList和LinkedList的区别和联系。
? 都是List的子类,且都具备List的特性,有序且允许重复
? ArrayList的底层数据结构为数组,查询快增删慢,线程不安全
? LiskedList的底层数据结构为链表。查询慢,增删快,线程不安全
(4)HashSet采用了哈希表作为存储结构,请说明哈希表的特点和实现原理。
? 提示:结合Object类的hashCode()和equals()说明其原理
? HashSet采用哈希表进行存储,通过hascode()和equals()方法进行判断是否重复,如果想使用,该类得重写hascode()和equals()方法。
(5)Vector和ArrayList的区别和联系。
? 都实现了List接口的方法
? ArrayList底层数据结构是数组,查询快,增删慢,线程不安全,效率高
? Vector底层数据结构是数组,查询快,增删慢,线程安全,效率低
(6)请你简述HashMap和Hashtable的区别?
HashMap:
? 底层数据结构是哈希表,保证了元素的唯一(指的是键的唯一性),元素是无序 ? 当键是自定义类型的时候,要想保证唯一性,就必须重写hashCode()方法和equals()方法
Hashtable:
? 底层数据结构是哈希表、链表,线程安全,效率低,支持同步
异常处理
Java中的异常分为三种:
? (1)严重的问题:Error,我们不处理,这样的问题一般都是很严重的,比如内存溢出(OOM)
? (2)Exception:
? 编译时期的异常:除了RuntimeException都是编译时期异常,必须要处理,如果不处理,程序编译会报错;
? 运行时期异常:RuntimeException以外的异常叫做编译时期异常,编译时期异常,一定要做处理,如果不做处理,编译无法通过,不能运行。
处理异常的方案: 1、try…catch…finally 处理一个异常 处理多个异常(JDK1.7的新特性) 2、throws 在方法上抛出异常的类名,可以一次性抛出多个异常,异常之间用逗号分割,表示一种可能性,可能会发生异常 将异常抛给调用者处理,调用者推荐使用try…catch处理,如果调用者继续抛出,一旦发生错误,后续的代码不会执行。
throw:在方法的内部抛出,表示一定会发生某种异常, throw后面跟的是异常的对象,只能跟一个。一般情况下,throw用在自定义异常中比较多。
final,finally,finalize的区别: final: 最终的意思,可以修饰类,成员变量,成员方法 修饰类:类不能被继承 修饰成员变量:变量变常量 修饰成员方法:方法不能被重写
? finally: 是属于处理异常try…catch…finally的一部分,一般是用于释放资源,正常情况下,都会执行,除非在执行finally之前,程序停止。 ? finalize: 是Object类中一个方法,是用于垃圾回收的,堆内存中的空间没有栈的引用指向它,但是什么时候回收我们不确定。
文件处理以及递归
File:是java对于文件和文件夹抽象表现形式 构造方法: public File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例。 如果给定的字符串是空字符串,则结果是空的抽象路径名。 public File(String parent,String child) 从父路径名字符串和子路径名字符串创建新的File实例。 public File(File parent,String child) 从父抽象路径名和子路径名字符串创建新的File实例。
File的功能: 创建功能: public boolean createNewFile() 创建一个文件 public boolean mkdir() 创建一个文件夹 public boolean mkdirs() 创建多级文件夹
注意:
1、要搞清楚你要创建文件还是文件夹
2、骑白马的不一定王子,还有可能是唐僧,因为后缀名也是文件名字一部分,也可能是一个文件夹
删除功能:
public boolean delete()
注意:
要想删除一个文件夹,这个文件里面必须是空的
重命名功能
public boolean renameTo(File dest)
判断功能
public boolean isDirectory()
public boolean isFile()
public boolean exists()
public boolean canRead()
public boolean canWrite()
public boolean isHidden()
基本获取功能
public String getAbsolutePath()
public String getPath()
public String getName()
public long length()
public long lastModified()
高级获取功能
public String[] list()
public File[] listFiles()
文件名称过滤器的实现思想及代码
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
递归:方法定义中调用方法本身的现象 注意: 1、搞清楚递归和嵌套的区别:递归是方法定义的时候出现,嵌套是方法使用的时候出现的 2、递归要有出口条件(结束条件),如果没有,就成了死递归
IO流:(这里的输入输出,以java程序为参照物) 按照流向分类: 输入流 输出流 按照数据类型分类: 字节流 字节输入流 读取数据 InputStream 字节输出流 写出数据 OutputStream FileOutputStream 字符流 字符输入流 读取数据 Reader 字符输出流 写出数据 Writer 什么情况下,用字节流还是字符流,如果你操作的是记事本打开能看懂的数据,就用字符流,如果看不懂就用字节流 如果你不知道用什么流,就用字节流,字符流是建立在字节流的基础上出现的。
|