Java常见集合的归纳总结
?
?
首先来看看集合的关系:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
?
?一、Collection接口中定义的方法
? ? ? ??int size():获取当前集合中的元素数量
?
? ? ? ? boolean isEmpty():查看当前集合中是否包含元素
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?不包含返回true ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?检查当前集合是否为空集?
?
? ? ? ? boolean contains(Object o):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 查看当前集合中是否包含给定的元素
?
? ? ? ? ?void clear():清空集合
?
? ? ? ? ?boolean add(E e):向集合中添加元素
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 当元素成功添加到集合中返回true
?
? ? ? ? ? boolean remove(Object o):从集合中删除给定的元素
?
? ? ? ? ? boolean addAll(Collection c):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?将给定集合中的所有元素添加到当前集合
?
? ? ? ? ? ?boolean removeAll(Collection c):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 删除当前集合中与给定集合中相同的元素
?
? ? ? ? ? ? Iterator iterator():
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 获取迭代
二、List接口
? ? ? ? 1)ArrayList
? ? ? ? ? ? ? 1.ArrayList集合是有序的,可重复的集合,可以根据下表来取元素(下表从0开始)
? ? ? ? ? ? ? ?2.常用方法有:
? ? ? ? ? ? ? ? ? ?add() ? 增加元素
? ? ? ? ? ? ? ? ? ?set() ? ? 修改元素的值
? ? ? ? ? ? ? ? ? ?remove() ? 删除元素
? ? ? ? ? ? ? ? ? ?indexOf() ? 第一个对应元素的下标
? ? ? ? ? ? ? ? ? ?lastIndexOf() ? 最后一个对应元素的下标
? ? ? ? ? ? ? ? ? ?subList(int a,int b) ? 取子集(操作子集会影响原集合) 下标前包含后不包含[a,b) ? List中的独有方法
? ? ? ? ? ? ? ? ? ?toArray() ? 集合转化成数组(Arrays.toString(array)是显示该数组的方法)
? ? ? ? ? ? ? ?2.遍历集合的统一方式:
class="java" name="code">import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /** * 遍历集合的统一方式 * 迭代器模式 * @author admin * */ public class IteratorDemo { public static void main(String[] args) { Collection c = new ArrayList(); c.add("one"); c.add("two"); c.add("three"); //java.util.Iterator /* * Iterator不能实例化(接口) * 不同的集合提供了可以遍历自身元素的迭代器实现 */ Iterator it = c.iterator(); /* * 使用迭代器遍历集合的步骤 * 问取删 * 删不是必须的操作 */ //问问集合是否还有元素可以遍历 while(it.hasNext()){ //取出这个元素 Object element = it.next(); //每次调用next()方法前都应先确保hasNext()为true // element = it.next(); System.out.println(element); } } }
?
? ? ? ? 2)LinkedList
? ? ? ? ? ? ? ?1.Queue接口定义了队列存取元素的基本方法,基于LinkedList的实现原理,它非常适合队列的特性。
? ? ? ? ? ? ? ? ? ?队列,遵循先进先出原则.
? ? ? ? ? ? ? ? ? ?1>.Queue常用方法
? ? ? ? ? ? ? ? ? ? ? ? ?offer() ??向队列末尾追加新元素
? ? ? ? ? ? ? ? ? ? ? ? ?poll() ??获取队首元素,获取后该元素就从队列中被删除
? ? ? ? ? ? ? ? ? ? ? ???peek() ??获取队首元素,但不从队列中删除
? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? 2.Deque ??双端队列,两端都可以进出队但当我们约束从队列的一端进出队时,就形成了另一种存取模式
? ? ? ? ? ? ? ? ? ? ??先进后出原则,这就是栈结构
? ? ? ? ? ? ? ? ? ?1>.Deue常用方法
? ? ? ? ? ? ? ? ? ? ? ? ?push() ? 压入元素
? ? ? ? ? ? ? ? ? ? ? ? ?pop() ? “弹出"栈顶元素(注意,当栈中没有元素的时候pop方法会引发异常)
? ? ? ? ? ? ? ? ??
三、Map接口
? ? ? ??Map中的key不允许重复。
? ? ? ??1)HashMap 一个多行两列的表格存储元素以 key-value对的形式,散列算法实现的Map。
? ? ? ? ? ? 1>常用方法:
? ? ? ? ? ? ? ? ?put() ? 存放元素
? ? ? ? ? ? ? ? ?toString() ??HashMap重写了toString(),格式为{key1=value1,key2=value2,....}
? ? ? ? ? ? ? ? ?get(key) ? 取对应key值的元素的值
? ? ? ? ? ? ? ? ?boolean containsKey(Object k) ??查看当前Map中是否包含给定的key
? ? ? ? ? ? ? ? ?boolean containsValue(Object v) ??查看当前Map中是否包含给定的value
? ? ? ?
? ? ? ? ? ? ? ? 4>HashMap的遍历
?
public class IterateMapDemo { public static void main(String[] args) { Map<Integer,String> map = new HashMap<Integer,String>(); map.put(1, "一"); map.put(2, "二"); map.put(3, "三"); map.put(4, "四"); map.put(5, "五"); /* * 获取Map中所有的key * Set keySet() * 获取一个Set集合,该集合中存放当前Map中的所有key */ Set<Integer> keys = map.keySet(); for(Integer key : keys){ System.out.println("key:"+ key); } /* * 遍历每组键值对 * Map中每组键值对,使用一个Entry实例保存的 * Set entrySet() * 获取一个Set集合,其中每一个元素是一个Entry的 * 实例,而每一个Entry的实例都包含着两个内容 * 分别是key与value */ //java.util.Map.Entry Set<Entry<Integer,String>> entrySet = map.entrySet(); for( Entry<Integer,String> entry : entrySet ){ System.out.println( "key:" + entry.getKey() + "," + "value:" + entry.getValue() ); } /* * Collection values() * 遍历所有的value,这个操作很少用 */ Collection<String> values = map.values(); for(String value : values){ System.out.println("value:" + value); } }
?
?
? ? ??
? ? ? ? ? ??3>HashMap关于性能的几个名词
? ? ? ? ? ? ? ? Capacity 容量: Hashmap中数组的长度
? ? ? ? ? ? ? ? Initial capacity 初始容量:创建HashMap时,
? ? ? ? ? ? ? ? ? ? ? ? ? 数组的默认大小,16。
?
? ? ? ? ? ? ? ? ?size 大小:HashMap中的元素数量
?
? ? ? ? ? ? ? ? ? load factor 加载因子:默认值0.75
? ? ? ? ? ? ? ? ? ? ? ? ? ? 是一个比值 size/capacity
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? 每当size/capacity达到加载因子时,数组扩容
? ? ? ? ? ? ? ? 并且对原数组中的数据重新进行散列算法并存入
? ? ? ? ? ? ? ? 扩容后的数组中
? ? ? ? ? ? ? ? ?
四、Set集合的实现类
? ? ? ??1)HashSet
? ? ? ? ? ? ? ?使用散列算法实现的
? ? ? ? ? ? ? ?存放元素的顺序与元素在集合中的顺序不一致?但是元素在不改变的情况下,在集合中的顺序是一致 ? ? ? ? ? ? ? ? 的
? ? ? ? ? ? ? ??Set集合的不重复的集合。
? ? ? ? ? ? ? ? ? ?1>.HashSet常用方法
? ? ? ? ? ? ? ? ?add() ? 添加元素
? ? ? ? ? ? ? ? ?remove() ? 删除元素
? ? ? ? ? ? ? ? ? ? ? ? ?注意:a.一般循环遍历的时候删除Set集合使用用迭代器的remove()方法,不能直接调用 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Set.remove(e)否则会报异常.? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? b:存放元素时是根据元素的hashcode()方法的返回值进行的,所以要保证equals方法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?为ture的元素应具有相同的hashcode
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?c:尽可能不要在元素存入集合后修改该元素的内容防止hashcode值发生变化导致不 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 能正确访问
? ? ? ??1)TreeSet?
? ? ? ? ? ? ? ?使用二叉树实现的
?
五、集合的排序
? ? ? ?1)ArrayList排序
? ? ? ? ? ? 使用集合的工具类 Collections.sort(list)方法做自然排序。 ?
? ? ? ? ? ??
? ? ? ? 2)实现Comparator接口
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /* * Comparable接口与Comparator接口 */ public class ComparableDemo { public static void main(String[] args) { //实现该类后,子类是可比较的 Comparable c; /* * 当我们需要排序的元素自身已经实现了Comparable * 接口,并且定义好了比较规则,但这种比较规则不能 * 满足我们对于排序的需求是,我们就需要提供一种 * 额外的比较规则,这时候我们就需要使用Comparator */ List<String> list = new ArrayList<String>(); list.add("Killer"); list.add("adam"); list.add("cark"); list.add("marry"); list.add("Boss"); list.add("Jazz"); list.add("jason"); list.add("mark"); list.add("bill"); System.out.println(list); Collections.sort(list); System.out.println(list); /* * 不能够满足我们的希求,我们希望字母少的在前 * 字母多的在后 */ MyComparator comparator = new MyComparator(); /* * 使用Collections的重载sort方法 */ Collections.sort(list, comparator); System.out.println(list); } } /** * 为字符串提供额外的比较规则 * @author admin * */ class MyComparator implements Comparator<String>{ /** * 根据字符串的长度进行比较 */ public int compare(String o1, String o2) { return o2.length() - o1.length(); } }
? ?
? ? ? ? ? ? ? ? ??
?
?