文章目录
集合框架概述
集合可分为Collection和Map两种体系
- Collection接口:单列数据,定义了存取一组对象的方法的集合
- List接口:元素有序、可重复的集合
- ArrayList、LinkedList、Vector
- Set接口:元素无需、不可重复的集合
- HashSet、LinkedHashSet、TreeSet
- List接口:元素有序、可重复的集合
- Map接口:双列数据,存储(key-value)对的数据
- HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
Iterator迭代器接口
Iterator对象成为迭代器【设计模式的一种】,用于遍历集合元素
提供一种方法访问一个容器(container)对象中各个元素,而又不暴露该对象的内部细节。
Collection接口继承了java.lang.Iterable接口,有一个iterator()方法,用以返回一个实现了Iterator接口的对象
Iterator仅用于遍历集合,本身不提供承装对象的能力,若要创建Iterator对象,必须有一个被迭代的集合
集合对象每次调用Iterator()都得到一个全新的迭代器对象,默认游标在集合的第一个元素之前。
方法:
while (iterator.hasNext()){
//next():1,指针下移 2.将下移后集合位置上的元素返回
Object o=iterator.next();
System.out.println(o);
}
remove():在遍历期间删除集合中的元素,不同于集合直接调用remove()
foreach
Java5.0提供,不需获取Collection或数组的长度,无需索引访问元素
遍历集合的底层使用Iterator完成操作
for(要遍历的元素类型 遍历后自定义名称【局部变量】 : 要遍历的结构名称){
}
Person[] persons=new Person[5];
persons[0]=new Person("1号",1);
persons[1]=new Person("2号",2);
persons[2]=new Person("3号",3);
persons[3]=new Person("4号",4);
persons[4]=new Person("5号",5);
for (Person person:persons){
System.out.println(person.getName());
}
Collection接口方法
contains(Object o):判断当前集合是否包含obj
判断时调用的是obj所在类的equals方法,将集合内每个元素作为参数填入该对象的equals方法进行比较。
containsAll(Collection coll1):判断coll1中的所有元素是否都存在于当前集合中
remove(Object obj):调用obj所在类的equals方法,找到第一个相同的对象删除。删除成功则返回true
removeAll(Collection coll1):从当前集合中移除coll1中所有的元素
retainAll(Collection coll1):获取当前集合与coll1的交集,返回给当前集合
hashCode():返回当前对象的哈希值
toArray():集合→数组
Array.asList():数组→集合【List】
Collection子接口一:List
ArrayList、LinkedList、Vector是常见的实现类
同:三个类都实现了List接口,存储数据特点相同【有序、可重复】
- ArrayList:主要实现类,线程不安全,效率高,底层用Object[]存储
- 为防止多次扩容,建议使用带参构造器初始化大概容量
- LinkedList:线程不安全,对于频繁插入、删除操作效率比ArrayList高,底层使用双向链表存储
- Vector:古老实现类,线程安全,效率低,底层用Object[]存储
常用方法:
增:add(Object obj)
删:remove(int index)并返回该元素,remove(Object obj)
改:set(int index,Object obj)
查:get(int index)
插:add(int index,Object obj)
遍历:Iterator迭代器,增强for,普通循环
Collection子接口二:Set
无序性:不等于随机性,存储的数据并非按照数组索引顺序添加,而是根据数据哈希值决定的
不可重复性:保证添加的元素按照equals()判断时,不能返回true【相同的元素不能添加进来】
HashSet
-
主要实现类,线程不安全,可以存null
-
Set的典型实现,按照Hash算法存储集合中的元素,因此有很好的存储、查找、删除的功能
-
添加元素的过程
1.向HashSet添加元素a时,先调用a所在类的hashCode()计算其哈希值。此哈希值通过某种算法计算出在HashSet底层数组中存放的位置【索引位置】
2.判断底层数组此位置是否已有元素
若无其他元素,则元素a添加成功【情况1】
若有其他元素b(或已存在以链表形式存在的多个元素),则比较元素a与元素b的哈希值:
若哈希值不相同,则元素a添加成功【情况2】
若哈希值相同,则调用元素a所在类的equals()方法,将哈希值相同的对象与a比较:
若equals()返回false,则元素a添加成功【情况3】
若equals()返回true,则元素a添加失败
对于情况2和情况3而言,元素a与已存在与索引位置上的数据以链表方式存储【七上八下】
jdk7:元素a放到数组中,指向原来的元素
jdk8:原来的元素在数组中,指向元素a
要求:
向Set中添加的数据,所在的类一定要重写hashCode()和equals()
重写的hashCode()和equals()尽可能保证一致性【相等的对象一定要有相等的散列码】
-
LinkedHashSet
HashSet的子类,遍历其内部顺序可根据添加顺序遍历
- 根据元素的hashCode决定元素的存储位置
- 用双向链表维护元素次序,使得元素看上去像是以插入顺序保存的
- 性能略低于HashSet,但是迭代访问Set里的全部元素性能更佳
TreeSet
- SortedSet接口实现类,确保集合元素处于排序状态,有序、查询速度快
- 添加的数据要求是相同类的对象
- 可按照添加对象的指定属性进行排序
- 底层使用红黑树结构存储数据
- 两种排序方法:自然排序(实现Comparable接口)【默认】和定制排序(Comparator)
- 自然排序中,比较两个对象相同的标准是:compareTo()返回0,不再是euqals()
- 定制排序中,比较两个对象相同的标准是:compare()返回0,不再是equals()
Map接口
结构
key:无序、不可重复,使用Set存储所有的key【以hashMap为例:key所在类要重写equals()和hashCode()】
value:无序、可重复,使用Collection存储所有的value【value所在的类要重写equals()】
一对key-value构成了一个Entry对象
entry:无序的、不可重复的,使用Set存储所有的Entry
常用方法
- 添加、删除、修改
- Object put(Object key,Object value):将指定键值对添加/修改到当前map对象中
- void putAll(Map m):将m中所有键值对存放到当前map
- Object remove(Object key):移除指定key的键值对并返回value
- void clear():清空map
- 查询
- Object get(Object key):获取指定key对应的value
- boolean containsKey(Object key):是否包含指定key
- boolean containsValue(Object value):是否包含指定value
- int size():返回map中key-value对的个数
- boolean isEmpty():判断当前map是否为空
- boolean equals(Object obj):判断当前map和参数对象obj是否相等
- 元视图操作
- Set keySet():返回所有key构成的Set集合
- Collection values():返回所有value构成的Collection集合
- Set entrySet():返回所有key-value对构成的Set集合
HashMap
Map主要实现类,线程不安全,效率高,可以存储null的键值
底层:数组+链表(jdk7及之前),数组+链表+红黑树(jdk8)
LinkedHashMap
- 保证遍历map元素时,可以按照添加顺序实现遍历(在原有hash底层基础上添加了一对指针,指向先后元素)
- 对于频繁遍历操作,效率高于HashMap
TreeMap
- 要求key必须是同一个类创建的对象
- 保证按照添加的key-value进行排序,实现排序遍历【按照key自然排序/定制排序】
- 底层使用红黑树
Hashtable
Map的古老实现类,线程安全,效率低,不能存储null的键值
Properties
常用来处理配置文件,key和value都是String类型
Properties pros=new Properties();
FileInputStream fis=new FileInputStream(new File("jdbc.properties"));
pros.load(fis);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
System.out.println(user);
System.out.println(password);
fis.close();
Collections工具类
Collections是一个提供操作Set、List、Map的工具类
排序
reverse(List):反转列表
shuffle(List):对列表进行随机排序
sort(List):根据列表中元素的自然排序对指定List集合元素升序排序
sort(List,Comparator):根据指定Comparator产生的顺序对List集合元素进行排序
swap(List,int,int):将列表中两个索引处元素呼唤
查找、替换
Object max/min(Collection):根据元素自然排序返回最大/小元素
Object max/min(Collection,Comparator):根据Comparator指定顺序,返回最大/小元素
int frequency(Collection,Object):返回元素出现次数
void copy(List dest,List src):将src复制到dest
boolean replaceAll(List list,Object oldval,Object newVal):使用新值替换List对象的所有旧值
同步控制
将指定集合包装成线程同步的集合,解决线程安全问题
sychronizedCollection(Collection)
sychronizedList(List)
sychronizedMap(Map)
sychronizedSet(Set)
sychronizedSortedMap(SortedMap)
sychronizedSortedSet(SortedSet)