Java进阶之集合框架
Java进阶之集合框架
Collection 单一元素存储
- List 有序(添加顺序)可重复
- 泛型:即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型只能存储引用类型
- 自动装包和自动拆包:在运行期间可以将一个基本数据类型中的数值类型自动转换成为封装类,也可以将一个封装类自动转换成一个基本数据类型中的数值类型
- 元素固定的时候要选择数组数组:减少多余空间浪费
- ArrayList(数组列表)
- ArrayList是List接口的大小可变数组的实现
- 集合的操作行为
- 新增: list.add(内容)
- 删除全部: list.clear()
- 删除: list.remove(下标,下标或内容)
- 插入: list.add(下标,内容)
- 并集操作: list.addAll(list1) 将list1插入到list的后面
- 插入集合: list.addAll(下标,list1)
- 查找: list.contains(内容)
- 获取大小: list.size()
- 获取元素: list.get()
- 遍历: 可以使用常规for或foreach{for(String s : list)}
- 数组到达边界长度后,创建一个新数组,然后将旧元素复制到新数组中
- 算法扩容机制 1.5倍+1 初始为10
- 如果遇见元素是可以变化长度的,优先使用ArrayList,如果元素长度是固定的,优先使用数组
- LinkedList(链表)
- 链表-线性表
- 单向线性列表
- 单向环状列表
- 双向线性列表
- 双向环状列表
- 除某些特殊方法以外,和ArrayList相差不大
- 指向下一个.next
- 指向上一个.previous
- JDK1.6为双向环状链表,JDK1.7以后,是双向线性链表
- pop()模拟弹栈
- push()模拟压栈
- 操作优势和劣势
- 优点:插入(add),删除效率高(remove)
- 缺点:修改(set),查找contains),获取(get),遍历()
public A(){ private next = next; private previous = previous; public void main(String[] args){ A1.next = A2; A2.previous = A1; A2.next = A3; A3.previous = A2; A3.next = A1; A1.previous = A3; } } //双向环状链表
- 如果遇见插入和删除操作比较频繁的时候,适用LinkedList,如果查找,修改操作比较频繁时,适用ArrayList
- Vector(向量)
- 线程安全StringBuilder
- Vector基于数组,遍历速度很快
- Stack(栈结构)
- push()压栈-执行方法,方法进栈
- pop()弹栈-方法执行完毕,方法出栈
- 先进后出,后进先出
- Set 无序(不遵循添加顺序)无重复
- HashSet(hash表)
- add()添加的时候是无序的,不遵循添加顺序
- 集合的交叉并集
- 并集:addAll() 保留所有元素,重复的保留一份
- 交集:retainAll() 保留以A为基础,在B中有相同的元素。
- 差集:removeAll() 保留以A为基础,在B中没有相同的元素
- Collections集合工具类
- Collection.shuffle(list) 洗牌
- max,min......(API)
- HashSet集合存储自定义类,如果希望对象之间互相覆盖,必须重写对象下equals和hashCode
- 重写的依据
- 两个对象调用equals,结果为 比较依据(两个对象name属性值相同则equlas为true)
- 并且调用hashCode得到相同的返回值返程覆盖,如果equals为true,尽量保证hashCode相同,反之尽量不同
- 比较地址、比较类型instanceof、比较值
- Java - Hash表核心算法
static iNt indexFor(int h,int length(数组的长度)){ return h & (length-1); }
- 得到的结果一定不会超过数组的最大索引
- 在某些极端情况下,比如00001000和11110111按位计算会出现00000000情况
- 在HashSet中,加载因子越大,产生哈西冲突可能性越大,加载因子越小,空间浪费就越严重。默认加载因子为0.75
- TreeSet<(树)
- add()
- 返回此集合最小元素或等于给定元素,如果没有返回null:ceiling()
- 拷贝:clone()
- 删除全部:clear()
- HashSet覆盖使用equals和HashCode,TreeSet覆盖使用compareTo
- 获取全部的key:map.keySet() -- 可以遍历输出全部的key
- 获取全部的值:map.values()
Map key-value键值对
- HashMap
- 添加:put()
- 删除:remove()
- 获取大小:size()
- 获取值:get()
- 键相同会覆盖
- HashSet不会出现覆盖效果,后添加的元素不会进入集合,HashMap后添加的元素的值会覆盖前面的值
- HashMap可以存储null值(containsKey),也可以存储null键 -- 允许null的存在,酌情使用
- HashSet的底层用的就是HashMap的key,如果Map的key是自定义的类,那么久等效于HashSet存储了自定义的类,即需要key所表示的类重写equals和hashCode
- TreeMap
- TreeMap如果key是自定义的类,要求该类实现Comparable接口,并且重写compareTo方法
- Hashtable
- Hashtable是线程安全的,不允许null键和null值
JUC 并发编程集合
- JUC 指的是 java.util .concurrent 工具包。这是一个处理线程的工具包,在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统、包括线程池、异步 IO 和轻量级任务框架,还提供了设计用于多线程上下文中的 Collection 实现等
- 并发和并行的区别
- 并发是指CPU一核心,模拟出多条线程,快速交替运行,多条线程操作同一个资源
- 并行是指CPU多核心,多个线程可以在同一时间同时进行,多个人并排一起行走
- 并发编程的本质:充分利用CPU的资源
- 线程的几种状态
- 新生
- 运行
- 阻塞
- 等待
- 超时等待
- 终止
- 具体请转到多线程随笔