- 集合框架
- Collection方法
- Collections工具类
- List接口
- ArrayList
- LinkedList
- Vector
- List方法
- set接口
- HashSet
- LinkedHashSet
- TreeSet
- Map接口
- HashMap
- LinkedHasMap
- TreeMap(SortedMap的实现类)
- Hashtable
- Properties
- Map方法
关于数组:
①初始化时长度就确定,不可修改
②定义时就确定了数据类型
③提供的方法有限,操作不便,效率低
④存储的数据:有序、可重复 集合框架
(集合中的数据所在的自定义类都需要重写equals()方法)
equals(Object obj):
add(E e) : 添加元素
size() : 获取元素的个数
addAll(Collection coll):将col集合中的元素添加到当前集合
isEmpty():元素个数是否为0
clear() :清空元素
contains(Object obj):判断集合中是否包含obj【调用equals,自定义类需要重写】
containsAll(Collection coll):判断coll中的所有元素是否都在该集合中
remove(Object obj):返回boolean,移除指定元素
removeAll(Collection coll):从当前集合中移除coll中的所有元素(共有)
tetainAll(Collection coll) :修改当前集合为两集合的交集
hashCode():返回哈希值
集合—>数组:toArray():
数组—>集合:调用Arrays.asList(arr)
iterator():返回迭代器接口的实例,用遍历集合元素【调一次返回一个新实例】
Iteratoriterator = set1.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); }
Iteratoriterator = set1.iterator();//再次操作需要重新生成 while(iterator.hasNext()){ Object objiterator.next(); if("TOM".equals(obj)){ iterator.remove(); } }
【next():指针后移并返回对象】
foreach :用于遍历集合、数组
for(集合数组元素的类型 局部变量 : 集合数组对象){}
【原理:利用迭代器,赋值给新的obj】
for(Object obj : coll){
System.out.println(obj);
}
Collections工具类
Collection和Collections的区别?
Collection: 接口,单列集合,存储对象
Collections: 提供操作List、Set、Map等集合静态方法的工具类
同步控制:
Collections.synchronizedXxx(xxx):返回线程安全的集合
reverse(List):反转
shuffle(List):随机排序
sort(List):自然排序
sort(List , Comparator):定制排序
swap(List , int , int):交换
Object max(Collection):按自然排序返回最大的数据
Object max(Collection , Comparator):
Object min(Collection):
Object min(Collection , Comparator):
int frequency(Collection , Object):返回指定数据出现的次数
boolean replaceAll(List , Object oldVal , Object newVal): 替换
void copy(List dest , List src):将src中的内容复制到dest中
注意:dest.size()要不小于src.size()【是元素个数,不是数组长度】
可以考虑:List dest = Arrays.asList( new Object [ list.size() ] );
三个类都实现了List接口,存储的数据是有序的,可重复的
添加的数据所在的自定义类需要重写equals()方法
作为List接口的主要实现类;线程不安全的,效率高;底层仍是使用数组Object[] elementData存储
源码分析:
①jdk7之前,使用空参构造器,new一个长度为10的Object[],扩容默认情况是1.5倍,新造数组需要先复制原有数组的元素再添加;考虑使用带参构造器(int capacity)
②jdk8之后,ArrayList list = new ArrayList()时数组初始化为{},第一次添加时才创建长度为10 的数组,后续同上【懒汉】
对于频繁的插入、删除操作,此类效率更高;底层使用双向链表存储
源码分析:LinkedList list = new LinkedList();内部声明Node类型的first和last属性,默认值为null;添加时封装到Node中,创建Node对象
private static class NodeVector{ E item; Node next; Node prev; Node(Node prev, E element, Node next) { this.item = element; this.next = next; this.prev = prev; } }
List接口的古老实现类(jdk1.0);线程安全的,效率低;底层仍是使用数组Object[] elementData存储
源码: 创建时都new了数组,扩容为2倍,方法是synchronized的
void add(int index , Object ele) :在指定索引处添加ele元素
boolean addAll(int index , Collection eles) :在指定索引处添加eles中的所有元素
Object get(int index) :获取指定索引上的元素
int indexOf(Object obj) :返回obj在集合中首次出现的位置
int lastIndexOf(Object obj) :返回obj在集合中末次出现的位置
Object remove(int index) :移除指定索引的元素,并返回此元素
Object set(int index , Object ele) :把指定索引的元素改为ele
List subList(int fromIndex , int toIndex) : 返回左闭右开的子集合
常用方法:
增:add(E e)
删:remove(Object obj) 、Object remove(int index)
改:Object set(int index , Object ele)
查:Object get(int index)
插:void add(int index , Object ele)
长度:size()
遍历:①Iterator ②foreach ③for
没有额外定义方法,只能使用Collection中的方法;存储无序的、不可重复的数据【过滤去重】
要求:向set中添加的数据,所在类必须要重写hashCode()和equals()方法
(尽量保持相同的对象有相同的哈希值)
无序性:不等于遍历时是随机的;数据存储在底层数组中并非按索引顺序添加,而是按照数据的哈希值
不可重复性:哈希值不同;且添加的元素按照equals判断时,不能返回true;
作为Set接口的主要实现类;线程不安全的;可以存储null值
底层存储数组+链表
底层:是HashMap, 元素是key,value是PRESENT = new Object();
作为HashSet的子类;遍历时可以按照添加的顺序
在添加数据的同时,每个数据加入了一对引用,指向前后一个数据;
频繁的遍历对于HashSet,效率更高
底层红黑树
添加的数据,要求是相同类的对象
可以通过添加对象的指定属性进行排序
自然排序(Comparable):比较两个对象是否相同的标准是 compareTo()返回零,不是equals()
定制排序(Comparator):TreeSet set = new TreeSet(Comparator com); 比较两个对象是否相同的标准是 compare()返回零,不是equals()
存储双列(key - value)数据
key-value:
key是无序的、不可重复的(Set)
value是无序的、可重复的 (Collection)
key-value构成一个Entry/Node对象(无序的、不可重复的)
作为Map的主要实现类(jdk1.2);线程不安全的,效率高;存储null的key和value
HashMap的子类;遍历时可以按照添加的顺序
在添加数据的同时,每个数据加入了一对引用,指向前后一个数据;
频繁的遍历对于HashSet,效率更高
底层:重写了HashMap中的newNode()
可以对添加的key-value进行排序,使用key排序【要求key是同一个类的实例】
底层是红黑树
自然排序
定制排序
作为古老的实现类(1.0);线程安全的,效率低;不能存储null
PropertiesHashtable的子类,常用来处理配置文件,key-value都是String类型
常用setProperty(String key , String value)和getProperty(String key)
Object put(Object key , Object value):添加【①②③返回null,④返回oldValue】
void putAll(Map m):添加m中的所有数据
Object remove(Object key):按照指定key移除,返回value【不存在返回null】
void clear():清空【不同于map = null】
Object get(Object key):获取指定key的value
boolean containsKey(Object key):是否包含指定key
boolean containsValue(Object value):是否包含指定value
int size():获取键值对的个数
boolean isEmpty():是否为空
boolean equals(Object obj):当前map与obj是否相等
元视图操作的方法:
Set keySet():返回所有key构成的Set集合
Collection values():返回所有value构成的Collection集合
Set entrySet():返回所有键值对构成的Set集合
【entry.getKey() + entry.getSet()…keySet() + get(Object key)】
常用方法:
增 Object put(Object key , Object value)
删 Object remove(Object key)
改 Object put(Object key , Object value)
查 Object get(Object key)
长度 int size()
遍历 keySet()、values()、entrySet()



