Java集合知识点整理
2016-07-19 18:51
295 查看
在做项目的时候经常用到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集合进行排序、查找、替换
附:
由于泛型主要应用在集合中,所以在这里一起记下了:
泛型的设计原则:在编译时没有提出“未经检查的转换”警告,则程序在运行时不会引发ClassCastException
自定义泛型类Apple<T>,此时构造器名还是Apple。可以把泛型类看做逻辑上的子类,物理上并不存在
类型通配符 List<?>,一般在做方法的形参但不知道具体传入参数的类型时使用
集合里只能保存对象,确切说是保存对象的引用变量。
一、记住两个集合框架的根接口: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集合进行排序、查找、替换
附:
由于泛型主要应用在集合中,所以在这里一起记下了:
泛型的设计原则:在编译时没有提出“未经检查的转换”警告,则程序在运行时不会引发ClassCastException
自定义泛型类Apple<T>,此时构造器名还是Apple。可以把泛型类看做逻辑上的子类,物理上并不存在
类型通配符 List<?>,一般在做方法的形参但不知道具体传入参数的类型时使用
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树