Java集合知识点整理

在做项目的时候经常用到ArrayList、HashMap,但很少系统地去看过Java集合的知识,今天把《疯狂Java讲义》上 的相关内容看了一遍,做如下整理,以便记忆。发现有找工作的压力在,能静下心来看好多以前看不进去的东西。

集合里只能保存对象,确切说是保存对象的引用变量。

一、记住两个集合框架的根接口:Collection和Map。各接口下需要掌握的子接口或类如下:

Collection:Set(HashSet)、List(ArrayList、Vector)、Queue(ArrayDeque、LinkedList)

Map:HashMap、HashTable


二、Collection接口部分方法

boolean add(Object o)

boolean addAll(Collection c)

   void clear()

boolean contains(Object o)

    boolean isEmpty()

Interator interator()

    boolean remove(Object o)    //调用对象的equals()方法比较,返回true则删

int size()

    Object[] toArray()


三、遍历Collection(在遍历时不能改变集合元素,否则会引发ConcurrentModificationException异常)

1、Lambda表达式    1.8

2、Iterator接口    1.2

3、foreach     1.5


四、Set

1、HashSet

  • 元素排列顺序可能和添加顺序不同
  • 线程不安全
  • 集合元素值可以为null
  • 判断元素相等的标准是equals()方法比较相等,hashCode()方法返回值相等。如果需要重写equals()、hashCode()方法的规则:如果equals()返回true,hashCode值也应该相同。

五、List
1、相比Collection增加的方法
void add(int index, Object o)       //插入,原位置的元素后移
Object get(int index)
int indexOf(Object o)     //判断两个对象相等的标准是equals()相等
    Object remove(int index)
Object set(int index,Object o)

2、ArrayList  (总体上性能比LinkedList好,推荐使用)
  • 封装了动态的Object[]数组
  • 线程不安全 
  • 底层数组长度为10
  • 长度增加 *1.5
3、Vector
  • 封装了动态的Object[]数组
  • 线程安全
  • 底层数组长度为10
  • 长度增加 *2
  • 可以设置增加的步长
  • 子类Stack用于模拟数据结构“栈”(性能较差,可以选择用ArrayDeque实现栈)
Object peek(): 返回栈的第一个元素,但不pop出
Object pop():返回栈的第一个元素,并pop出
void push(Object item):将一个元素push进栈


六、Queue
1、接口中定义的方法
void add(Object e):将指定元素加入此队列的末尾
Object element():获取队列的头元素,但不删除该元素
boolean offer(Object e);将指定元素加入此队列的末尾,比add()好
Object peek():获取队列头部元素,但不删除该元素
Object poll():获取队列头部元素,并删除该元素。如果队列为空,返回null
Object remove():获取队列头部元素,并删除该元素。

2、ArrayDeque   双端队列

  • 底层数组长度为16
  • 作为栈时的实现代码
ArrayDeque stack = new ArrayDeque();

stack.push(e1);

stack.push(e2);

stack.push(e3);

System.out.println(stack.peek());

System.out.println(stack.pop());

  • 作为队列时的实现代码

ArrayDeque queue= new ArrayDeque();

queue.offer(e1);

queue.offer(e2);

queue.offer(e3);

System.out.println(queue.peek());

System.out.println(queue.poll());

  • ArrayDeque同时作为栈、队列使用时,对头对应栈顶。(其实就是把push当成offerFirst)

3、LinkedList

  • 同时实现了List接口和Deque接口,所以既能根据索引随机访问集合中的元素,也能当成双端队列使用(栈、队列)
  • 内部以链表实现,所以插入、删除性能比较好
  • 遍历使用迭代器Iterator

七、Map(key集实际就是set集合)

1、基本方法

  • void clear()
  • Object get(Object key)
  • boolean isEmpty()
  • Set keySet()
  • Object put(Object key, Object value)
  • void putAll(Map m)
  • Object remove(Object key)
  • int size()

2、HashMap

  • 线程不安全
  • 允许使用null作为key、value
  • key相等的标准:equals()返回true,hashCode相等
  • value相等的标准:equals()返回true

3、Hashtable

  • 线程安全
  • 不允许使用null作为key、value,不然会引发空指针异常
  • key相等的标准:equals()返回true,hashCode相等
  • value相等的标准:equals()返回true
尽量不要使用可变对象作为HashMap、Hashtable的key


八、操作集合的工具类Collections

1、将指定集合包装成线程同步的集合

Collections.synchronizedXXX()

2、主要对List集合进行排序、查找、替换




附:

由于泛型主要应用在集合中,所以在这里一起记下了:

  1. 泛型的设计原则:在编译时没有提出“未经检查的转换”警告,则程序在运行时不会引发ClassCastException
  2. 自定义泛型类Apple<T>,此时构造器名还是Apple。可以把泛型类看做逻辑上的子类,物理上并不存在
  3. 类型通配符  List<?>,一般在做方法的形参但不知道具体传入参数的类型时使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值