异常处理:
finally块什么时候执行:1、finally块中的代码在return之前执行;2、finally改变return的基本数据类型无影响,但是引用类型会跟着改变;3、当try之前产生异常和try块中强制退出时不会执行finally中的语句;
异常处理的原理:当程序在运行时出现的非正常情况和错误,JVM会为了这个错误抛出一个异常,,一场在catch语句中捕获,目的是为了提高程序的鲁棒性和安全性;
Java.lang.Throwable:分成Error(不可处理)和Exception(可处理)两个子类;下面又有RuntimelyException等孙子,均可由throw抛出;
IO流:
IO流实现机制:可以看做是一组有序的字节集合,用作数据传输;其中分成两大类,字节流以及字符流;字节流包含两个子类,InputStream和OutputString;字符流分成两个子类,Reader和Writer;都用到了缓存
Java socket:双向链路中一端一个socket套间字,实现不同虚拟机和计算机之间的通信,分成两大类:面型连接(TCP)和面向无连接(UDP),均由IP和端口号唯一确定;
NIO:NIO主要是为了防止出现阻塞的情况,NIO通过Selector、Channel和Buffer实现非阻塞的IO操作;Selector从所有注册的Channe1中轮询访问,一旦从某一个Client中查询到注册信息,便传回Selection-Key来通知开发人员对Channe1中的数据进行读写,Buffer则用来保存数据,保存写入channe中的和从channe读取的数据;相较于Socket,处理并发操作效率较高;
IO和NIO的区别:1、面向流和面向缓冲,IO每次从流中读一个或多个字节,直至读取所有字节,没有缓存至任何位置;如果希望读取流中间的数据,则需要缓存至一个缓冲区。NIO直接将数据读取至缓冲区,需要时可以前后移动,增加了处理数据的灵活性。2、阻塞和非阻塞IO,当NIO的线程从channe中读取和写入数据时,任然可以做其他事情,而IO的线程读取或者写入时,则只能等待完全读取或者完全写入;3、选择器(selector),NIO中选择器允许单个线程监视多个通道,多个通道注册一个选择器,单个选择器选择合适的通道;
Java序列化:将对象按照序列的方式存储到文件中,进行持久化保存,然后也可以反序列化将对象读出;
容器:
Java collections:用于存储对象的容器,长度可变,集合中不可存储基本数据类型;主要有List、Queue、Set、Stack、Map;
迭代器(Iterator):是一个对象,遍历并选择序列中的对象,在不知道底层结构的情况下遍历集合中的对象,ListIterator可以实现正序遍历和反序遍历,Iterator只能正序;
set:元素不可重复,无顺序,需定义equals()判断唯一性;实现类有HashSet和TreeSet(有序);HashSet内部是哈希表,不同步,判断元素相同首先判断HashCode是否相同,然后用equals();TreeSet实现SortedSet接口,元素有序,不同步,内部用二叉树存储,根据比较方法判断元素唯一性,排序方法: 1、实现Comparable接口的comparaTo方法,2、构造函数中传入比较器对象,实现Comparator接口子类对象的方法;
List:动态改变长度的数组,Vector和ArrayList用数组实现,Vector同步线程安全,ArrayList不同步线程不安全,适合查找;LinkedList用链表实现(双端队列),不同步线程不安全,适合插入删除;
Map:键值对保存模式,值可重复,键不可重复,实现子类主要有HashMap、TreeMap、HashTable;HashMap无同步(线程不安全),内部是哈希表,可以空键、空值,适合查找、插入、删除;HashTable有同步(线程安全),内部哈希表,不能空键、空值;TreeMap内部二叉树,不同步,内部可以按键排序;
HashMap原理及内部数据结构:1.8之前是数组加链表,1.8后加入红黑树,实例化HashMap时,首先创建一个容量capacity长度的Entry数组,每个数组元素存储bucket(桶),含有索引,利于快速查找,每个bucket中都有一个Entry对象,每个Entry对象均带一个引用变量指向下一个Entry对象,超过单链阈值8之后转换成红黑树(效率提高从(n)到logn);
HashMap的put过程:对key值计算哈希值,然后计算下标,如果没有哈希碰撞则直接放入槽中,如果碰撞则放入链表后,如果链表长度大于阈值8则将链表转成红黑树,槽满了则扩容(默认值为16,2倍扩容);
哈希函数实现:高16位不变,低16位与高16位做异或得到哈希值;
如何解决哈希冲突:首先哈希冲突是指hash值一样,但是key不一样(否则就是值覆盖了);HashMap使用的是链地址法,将哈希值相同的记录在同一个bucket的链表中;
HashMap并发安全性问题:1、两个线程同时put键值对时,如果key的哈希值一样(哈希碰撞)则会存在插入值覆盖的情况;2、多个线程同时扩容时,只有一个线程扩容生效,其余线程均失效导致put数据丢失;利用ConcurrentHashMap实现线程安全的HashMap;
红黑树特征:1、节点为红色或者黑色;2、根节点为黑色;3、红节点儿子后必为黑节点;4、所有路径上黑节点数目一致;
BRTree和AVL的比较:1、红黑树不追求完全平衡,只要求达到部分平衡,降低对旋转的要求,提升性能;2、节点失衡后,RBTree最多只需要三次旋转就能实现平衡,总体的统计性能高于AVL;3、搜索次数多,选择AVL,插入、删除次数多,选择RBTree;
hashmap扩容机制:1.7扩容会重新计算key的哈希值,存在大量的重复计算,扩容时链表属于头部插入(发生哈希冲突时);1.8中扩容优化:1、不需要重新计算,只需看看原来的Hash值新增的位是0还是1,若为0则位置不变,1则增加oldCap;2、引入红黑树,如果重构链表长度大于阈值8,则转变成红黑树。
与运算中为length-1是为了index的结果等于hashCode的后几位,分布于hashCode相同。