黑马程序员_java之集合框架
集合框架
集合框架体系概述
集合:存储对象最常用的一种方式
数组集合作为容器区别:数组,可存储对象、基本数据类型,但长度固定;集合只存储对象,长度可变,可存储不同数据类型对象。

多容器出现原因:每个容器数据存储方式(数据结构)不同。
集合共性方法:
添加:boolean add(E e) //集合中存储的都是对象的地址引用
Boolean addAll(Collection<? Extends E> c) //添加集合
删除:void clear() //移除所有元素
Boolean remove(Object o) //移除指定元素
Boolean removeAll(Collection<? Extends E> c)//移除指定集合
判断:boolean contains(Object o);boolean containsAll(Collection<?> c)
boolean equals(Object o);int hashCode(); boolean isEmpty() 判断是否为空
集合变数组:<T> T[] toArray(T [ ] a)
取交集:boolean retainAll(Collection<? Extends E> c)
//如al1. retainAll(al2)al1中只保留al1中与al2中相同元素
获取:int size() 元素数;Iterator<E> iterator() 获取迭代器
集合一般取出方式: 迭代器 和 for循环
迭代器:集合的取出元素方式
例:两种方式获取ArrayList集合中元素,集合里有a, b,c 3个元素
方式一:迭代器Iterator<String> it=al.iterator();
While(it.hasNext()){
Sop(it.next();
}
方式二:for循环 for(Iterator it=al.iterator();it.hasNext();){
Sop(it.next();
}
Collection
!................List 元素有序、可重复,集合体系有索引(ArrayList、LinkedList、Vector)
!................Set 元素无序、不可重复 (HashSet、TreeSet)
List特有方法:凡是可操作角标的方法。
增加:void add(int index,E e);Void addAll(int index, Colle(ction<? Extends E> c)
删除:E remove (int index);更改:E set(int index,E e)
获取:E get (int index)//可通过此方法,特殊取出方式,迭代器
Int indexOf(Object o)//返回索引
Int lastLndexOf(Object o)
List<T> subList(int from,int to)//返回包含头不包含尾的集合
ListIterator <E> listIterator //返回列表迭代器
ListIterator是List特有的迭代器,ListIterator是Iterator的子接口。
迭代时,不能用集合方法的操作集合中元素,发生并发修改异常;只能用Iterator操作,但只能对元素进行判断、取出、删除操作;若要进行增删查改操作则用ListIterator。
可用ListIterator迭代器中特有方法: 更改void set(E e)、删除 void remove ()、添加:void add(E e)、判断hasNext()、hasPrevious、获取next、previous
例:Iterator<String> it=al.iterator();
While(it.hasNext()){
Object obj=it.next();
if(obj.equals(“b”))
//al.add(“d”);集合增删,迭代不知道
it.remove();//移除集合元素引用,但obj还有元素引用
sop(“obj=”+obj);
}
List集合具体对象特点
List
!......... ArrayList 底层是数组数据结构;查询修改快,增删慢;线程不同步;长度可变,默认为10,以50%延长
!......... LinkedList 底层是链表数据结构;查询修改慢,增删快;线程不同步;
!......... Vector 底层是数组数据结构;查询修改快,增删慢;线程同步;长度可
变,默认为10,以100%延长
Vector特有取出方式:枚举(还有一般的取出方式迭代器、for循环get方法)
例:有一个Vector集合,里面有a、b、c三个数组,获取数组中元素
Enumeration en=v.elements();
While(en.hasMoreElements()){
Sop(en.nextElement();
}
LinkedList特有方法:
增加:void addFirst(E e);void addLast (E e)
获取:E getFirst() //获取但不删除元素,若集合无元素则异常; E getLast ()
删除:E removeFirst ()//获取且删除元素,若集合无元素则异常; E removeFirst ()
LinkedList获取全部元素新方法: While(link.isEmpty()){ Sop(link.removeFirst());}
JDK1.6以后出现替代方法:(还有String的isEmpty)
增加:boolean offerFirst(E e); boolean offerLast (E e)
获取:E peekFirst() //获取但不删除元素,若集合无元素则返回null; E peekLast ()
删除:E pollFirst ()//获取且删除元素,若集合无元素则返回null; E pollFirst ()
练习:去除ArrayList集合中重复元素
Public static ArrayList singleElement(ArrayList al){
ArrayList newAl=new ArrayList();
Iterator it=al.iterator();
While(it.hasNext()){
Object obj=it.next();
If(!newAl.contains(obj))
newAl.add(obj);
}
return newAl;
}
Set集合:无序(存入和取出的顺序不一定一致),不可有重复元素
!.........HashSet:数据表结构是哈希表,线程是非同步的。保证元素唯一性原理:hashCode和equals方法,先判断hashCode,再判断equals。
!.........TreeSet:数据表结构是二叉树,线程是非同步的,可对集合中元素排序。保证元素唯一性原理:
Comparable接口中compareTo方法 return 0; Comparator接口中compare方法 return 0
TreeSet集合排序方式有两种:
第一种:元素自身具备比较性实现Comparable接口覆盖compareTo方法,元素自然顺序
第二种:元素不具备比较性,或比较性非所需,让集合具备比较性,Comparator接口中compare方法,定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数
注意:当两种排序都有时,优先比较器;排序时,当主要条件相同时,一定要判断次要条件。
注:TreeSet存一个正常,存两个ClassCastException,学生对象不具备比较性
Map集合
Map集合:该类集合存储键值对,一对一往里存,而且要保证键的唯一性。Map集合有3个常用子类对象:HashTable、HashMap、TreeMap。Map和Set很相似,其实Set底层使用了Map集合。
HashTable:底层哈希表数据结构,不可存null键null值,线程同步,效率稍低;
HashMap :底层哈希表数据结构,可存null值null键,线程不同步,效率稍高;
TreeMap :底层二叉树数据结构,可给集合中键排序,线程不同步。
Map集合有一些共性方法:
添加:V put(K key,V value) 如出现相同键时,新值V覆盖旧值V,返回旧值V
Void putAll(Map<? extends K,?extends V> m) 添加Map集合
删除:void clear() 移除所有映射关系;V remove(Object key) 删除并返回键对应的值
判断:boolean containsKey(Object key); boolean containsValue(Objectvalue)
boolean equals(Object o); int hashCode(); boolean isEmpty() 判断是否为空
获取:V get (Object key) 获取值;Int size( 映射关系数;Collection<V> values() 所有值集合
Set<K> keySet() 返回键的Set集合;Set<Map.Entry<K,V>> entrySet() 返回所有的映射集合,类型为Map.Entry
注意:通过get方法返回值是否为null判断键是否存在,因为键、值=null通常无意义
Map集合的两种取出方式:keySet、entrySet
Map集合取出原理:将Map集合转成Set集合,再通过迭代器取出
1、 keySet: 将Map中所有的键存入Set集合中,迭代键,在通过get方法获取键对应的值
2、 entrySet:将Map集合中的映射关系存入Set集合中,迭代映射关系Map.Entry ,再通
过映射关系中getKey()和getValue()方法获取键和值
什么时候使用map集合?数据存在映射关系
浙公网安备 33010602011771号