JAVA基础篇(二)——异常、集合

异常

异常处理
Exception和Error都继承自Thowable
Error表系统级错误,是内部环境或者硬件的问题,只能中断程序
Exception表程序需要捕捉,处理的异常,是编程中的问题
异常类型(受检异常和非受检异常)
受检异常一般在IO流中,如文件不存在,一般向上抛出或捕获
非收检异常一般是运行时异常,如空指针、数组越界,是代码本身导致
异常相关关键字
try⽤来指定⼀块预防所有异常的程序;
catch⽤来想要捕获的异常的类型;
finally为确保⼀段代码不管发⽣什么异常状况都要被执⾏;
throw ⽤来抛出⼀个异常;
throws⽤来声明⼀个⽅法可能抛出的各种异常
一个方法里有finally和return的话,不论前后顺序,还是会先执行finally代码块

异常链
进行一个异常处理时,抛出了另一个异常
一般用于将受检异常封装成非受检异常

集合

集合类
collection 是一个集合接口,提供了对集合操作的通用接口方法,是set、list的父接口
collections是一个包装类,封装了关于集合操作的基本方法,就像一个工具类

list:元素有序存放且可重复
set:无序且不可重复
set在有些场景下可以用来去重

arrayList是一个可以改变大小的动态数组,存储的元素可以通过get、set方法访问。
LinkList是一个双链表,还实现了Queue接口,比list提供了更多的方法,在增删方面会比arrayList性能更强,但是get、set不及arrayList。
Vector和ArrayList 相似,但属于强同步类,在添加元素时会请求更大的空间。
都实现了list接口

arrayList和Vector
arrayList实现了存储优化,使其在单线程中更高效,但对数据是非同步处理的
Vector同步处理,没有优化储存,他在存储过程中会把null值拷贝保存,所以相对更占资源

SynchronizedList 和 Vector 的区别
SynchronizedList是Collections中的一个静态类,Vector是java.util的类,在多线程中都可使用这两个类来实现线程安全。
SynchronizedList有很好的扩展和兼容性,可将所有的list转成线程安全的类,进行遍历的时候要手动处理,还能指定锁定的对象。

TreeSet、HashSet
TreeSet底层是二叉树实现且自动有序排列,不能存入null,且不可重复
TreeSet的底层是TreeMap,基于红黑树实现,是一种平衡的二叉查找树,按照key排序,TreeSet主要是通过compareTo()来查重
HashSet是哈希表实现,数据无序,可放入一个null,也不可重复
底层是HashMap实现存储的,当插入数据时,会先计算元素的hashcode值,在与HashMap中的值通过equse()做对比,若相同则不添加,不同会找一个空位添加。

HashMap、HashTable
HashTable是线程安全的,HashMap不是,因为HashTable的的方法是同步的,在多线程并发的情况下能直接使用
HashTable的储存不允许为null,HashMap可以有一个键为null,但可以有一个或者多个键对应null值
HashTable能直接使用对象的hashcode值,HashMap需要先计算再使用
继承关系、默认初始容量和遍历方式不也相同,HashMap—>abstracthMap,HashTable—>Dictionary


collection接口下的集合接口图

HashMap 和 ConcurrentHashMap 的区别
都是用桶数组实现,但是后者用桶数组进行了分段,且添加了分段锁机制,使线程安全

HashMap的容量、扩容
size表K-V对的个数,capacity表当前容量,默认16,loadFactor是装载因子,个数超过loadFactor* capacity 的值时,扩容触发

HashMap中hash方法的原理
Hash,译为散列,就是把任意长度的输入,通过散列算法,变换成固定长度输出散列值

HashMap的数据结构(数组+链表+红黑树)
数组通过指针来对应一个链表,再从中找出正确的元素
HashMap的数据是存储在链表数组里的,在对其做增删时,须根据K-V定位下标来操作

HashTable
对数组采用的时直接取模,相较HashMap的位运算,效率更低,但在jdk1.8中优化了高位运算,提高了一定的速度
HashTable通过SynchronizedList来保证线程的安全

HashMap的初始容量
在开发中,如果没有设置初始大小,HashMap会随着元素的增加而进行多次扩容,是非常影响性能的,可使用 Maps.newHashMapWithExpectedSize()设置初始值

总结
需要根据键值获取元素时,可选Map接口下的集合,需要排序时选择TreeMap,不需要排序可用HashMap,需要线程安全时可用HashTable,当只需要存放时,可实现collection接口,保证元素唯一选择实现set接口集合下的TreeSet或HashSet,没有需求的话就用ArrayList或LinkList。

Stream用法和特点
stream是java8中处理集合的关键抽象概念,可对集合进行操作
特点:
1.不是数据结构,不会储存数据
2.不会修改数据源,而是将操作的数据保存到另一个对象
3.惰性执行,操作不会立即执行,等用户真正需要结果才会执行
流的操作(创建、中间操作、最终操作)
创建:通过已有集合类的Stream或Stream的of方法
中间操作:过滤(filter)、转换(map)、排序(sort)、保留元素(limit/skip)、去重(distinct)
最终操作:collect(转换成集合)、count(计数)、forEach(遍历)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值