java 读取txt里所有的key值_Java基础3(B站总结)

异常处理:

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);

c591845844a352739fbf2b5d3e65e45b.png

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相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值