标签:
关键字特点
看到【list】就要想到元素【可重复】,其次要想到有序看到【array】就要想到【数组】,【查询】快,有【角标】看到【link】就要想到【链表】,【增删】快,有操作【frist last】的方法,存储和取出的顺序一致看到【set】就要想到元素【不可重复】,存取的次序是不一致的,也是不固定的看到【hash】就要想到哈希表,【查询快】,要重写【hashcode和equals】方法看到【tree】就要想到二叉树,【要排序】,要实现【Comparable或Comparator】接口看到【map】就要想到【键值对】,要保证【键唯一】,要想到健是一个Set
集合选择依据
需要存储键值对还是单个值?键值对:Map(健是Integer时可优先考虑使用数组或ArrayList)需要指定健的顺序吗?需要:TreeMap不需要:HashMap但想要一个和存储一致的顺序:LinkedHashMap值:Collection需要元素唯一吗?需要:Set需要指定顺序吗?需要:TreeSet不需要:HashSet但想要一个和存储一致的顺序:LinkedHashSet不需要:List需要频繁增删吗?需要:LinkedList不需要:ArrayList
集合选择细节
对List的选择(ArrayList)
- 对于【随机查询】与【迭代遍历】操作,ArrayList比所有的容器都要快
- LinkedList的底层数据结构是双向链表,查询慢,增删快。这种场合是很少见的
- Vector目前仍然还存在于类库中的原因是为了支持过去的代码,多线程时也不推荐使用,可使用ArrayList的同步视图
对Set的选择(HashSet)
- HashSet的性能总比TreeSet好
- TreeSet存在的唯一原因是,它可以【维持】元素的【排序】状态,所以只有当你需要一个次序固定的Set时,才应该使用TreeSet
- LinkedHashSet不仅有一个固定的次序,且存取顺序是一致的,遍历LinkedHashSet会比HashSet更快
对Map的选择(HashMap)
- TreeMap通常比HashMap慢,因为要维护排序
- LinkedHashMap比HashMap慢一点,因为它同时还要维护链表
- HashMap比Hashtable更快,主要区别是线程安全与否
- HashMap正是为【快速查询】而设计的
集合和数组的不同点
数组和集合不同点
1、长度:数组的长度是固定的,集合的长度是可变的(最根本的区别)。
2、类型:数组中可以存储基本数据类型或对象(即引用数据类型),集合中只能存储对象(注意:存入基本数据类型时,实际存储的是其对应的包装类)。
3、内容:数组中存储的是同一种类型的元素,集合可以存储不同类型的元素(注意:不建议在一个集合中存储多种类型的元素,建议指定泛型)。
HashMap与HashTable的区别
总结:HashMap是用来代替HashTable的类,一般建议使用HashMap。
HashTable的方法是同步的,而HashMap的方法是非同步的,所以HashMap效率更高。
HashTable不允许null的健和值,HashMap允许null健和值。
HashTable使用Enumeration,HashMap使用Iterator。
HashMap把Hashtable的contains方法去掉了,因为contains方法容易让人引起误解。
HashMap和HashTable采用的算法基本一样,所以性能没有很大的差异。
去除List中重复元素的方法
// 将List中的元素存到Set中public static <T> HashSet<T> getSingleElement(ArrayList<T> al) {HashSet<T> set = new HashSet<T>();for (T t : al) {set.add(t);}return set;}// 去除ArrayList中的重复元素--推荐public static <T> ArrayList<T> getSingleElement(ArrayList<T> al) {ArrayList<T> temp = new ArrayList<T>();Iterator<T> it = al.iterator();while (it.hasNext()) {T obj = it.next();//判断被迭代到的元素是否在临时容器存在if (!temp.contains(obj)) temp.add(obj);}return temp;}
集合实现同步的方案
集合框架中常用的ArrayList、HashSet、HashMap都是线程不安全的,如果多条线程访问他们,而且多于一条线程试图修改它们,则可能出错。1、使用集合框架中相应的同步集合
- ArrayList---使用Vector---不推荐
- HashMap---使用HashTable或ConcurrentHashMap(推荐)
2、对原有集合进行包装集合工具类Collections中提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而解决多线程并发访问集合时线程的安全问题。由包装的代码可以看出,只是把原集合的相应方法放在同步块里调用罢了。
- List<T> list = Collections.synchronizedList(new ArrayList<T>());
- Set<T> set=Collections.synchronizedSet(new HashSet<T>());
- Map<K,V> map=Collections.synchronizedMap(new HashMap<K,V>());
集合中是否允许null总结
集合中是否允许null小结
- 一句话总结:Tree不能为null,Hashtable不能为null,其他都可以!
- List:可以有多个null,可以有重复值。
- HashSet:能插入一个null,忽略重复的null。
- TreeSet:不能插入null(内部是以 TreeMap 实现,TreeMap的键为TreeSet的元素,值为TreeSet的元素通过比较器的比较结果,TreeMap的键不能为null)
- HashMap:允许一个null键与多个null值,若重复键,则覆盖以前的值。
- TreeMap:不允许null键(若Map里只有一个元素,则健为null是不会报错的,因为一个元素时没有进行排序操作,但插入第二个时就会立即报错),允许多个null值,覆盖已有键值。
- Hashtable:不允许null键与null值。
泛型的使用
泛型位置
- 把泛型定义在方法上: public <T> void show(T t) {}
- 把泛型定义在类或接口上: public class ObjectTool<T> {}
泛型通配符
- ?表示任意的类型都是可以的: Collection<?> c = new ArrayList<Animal>();
- ? extends E:向下限定,E及其子类: Collection<? extends Animal> c = new ArrayList<Dog>();
- ? super E:向上限定,E极其父类: Collection<? super Animal> c = new ArrayList<Object>();
可变参数
public static int sum(int... a) {int sum = 0;for (int x : a) {sum += x;}return sum;}注意:这里的变量 a 其实是一个指定类型的数组;如果此方法有多个参数,那么可变参数只能是最后一个
设置不可变的集合
Collections有三个方法可返回一个不可变集合:
- emptyXxx():返回一个空的不可变的集合对象。
- singletonXxx(T o):返回一个只包含指定对象的,不可变的集合对象。
- unmodifiableXxx():返回指定集合对象的不可变视图。
案例://创建一个空的,不可变的List对象List<String> unmodList = Collections.emptyList();//创建一个只有一个元素且不可变的set对象Set<String> unmodSet = Collections.singleton("唯一的");//返回map对象对应的不可变版本Map<String, Integer> map = new HashMap<String, Integer>();map.put("语文", 80);map.put("java", 90);Map<String, Integer> unmodMap = Collections.unmodifiableMap(map);//以下代码都将引发UnsupportedOperationException异常unmodList.add("hello");unmodSet.add("kitty");unmodMap.put("语文", 70);
集合的排序、查找、替换
排序
static void reverse(List list):反转指定List集合中元素的顺序。
static void shuffle(List list):对List中的元素进行随机排序(类似于洗牌的动作)。
static void sort(List list):根据元素的自然顺序对指定的List 里的元素按升序排序。
static void sort(List list,Comparator c):根据指定Comparator产生的顺序对List集合的元素进行排序。
static void swap(List list,int i,int j):将指定List集合中i处元素和j出元素进行交换。
static void rotate(List list,int distance):将指定集合中i处元素和list.length-1-i处的元素进行交换。查找static int binarySearch(List list,Object key):使用二分搜索法,以获得指定对象在List中的索引,前提是集合元素已是有序状态。
static Object max(Collection coll):根据元素的自然排序,返回给定集合中的最大元素。
static Object max(Collection coll,Comparator comp):根据指定Comparator产生的顺序,返回给定集合中的最大元素。
static Object min(Collection coll):根据元素的自然排序,返回给定集合中的最小元素。
static Object min(Collection coll,Comparator comp):根据指定Comparator产生的顺序,返回给定集合中的最小元素。
static int indexOfSubList(List source,List target):返回子list对象在母list中第一次出现的索引,如果没有则返回-1。
static int lastIndexOfSubList(List source,List target):返回子list对象在母list中最后一次出现的索引,如果没有则返回-1。
static int frequency(Collection Object o):返回指定集合中等于指定对象的元素数量。替换static void fill(List list,Object obj):使用指定元素obj替换List里的所有元素。
static boolean replaceAll(List list,Object old,Object new):使用一个新值替换List中所有的旧值。
标签:
原文地址:http://www.cnblogs.com/baiqiantao/p/5449145.html