集合详细总结

一,常用集合的继承体系,及其特点图
我觉得采用表格的形式比较直观明了
这里写图片描述
数组:查询快,增删慢
链表:查询慢,增删快

二,元素唯一性
哈希表可保证元素的唯一性.
必须重写HashCode()与equals()方法
因为:
(1)HashCode的唯一性
Integer与String默认重写了HashCode方法,值或内容相同,哈希码值相同.
若自定义类,则需要重写该类的HashCode方法.
equals方法的返回值为true,hashCode不一定相同,hashCode相同,equals方法的返回值也不一定为true。
而要HashCode值相同,那equals方法的结果必定为true.
所以若重写HashCode方法必须要重写equals方法,才能保证两者的一致性,从而保证具有相同内容的对象的hashCode相同.

关于HashCode与equals方法的关系,我觉得这篇博客介绍的很好:浅谈Java中的hashcode方法 - 海 子 - 博客园 https://www.cnblogs.com/dolphin0520/p/3681042.html

而TreeSet唯一性是由于依靠TreeMap进行实例化
构造方法源码:

public TreeSet() {
        this(new TreeMap<E,Object>());
    }
 public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }
 然后TreeMap实现唯一性是通过比较键的compare方法或compareTo方法的返回结果.若返回值相等值就会覆盖.

(2) 哈希表不允许防止哈希码值相同的元素.

二,存取有序性
靠底层的数据结构保证
数组,链表都可以保证元素的顺序排列.

三,集合元素排序
(1)TreeSet与TreeMap可实现元素的排序
其实这取决于他们的构造方法与底层的树形结构
红黑树简图:
这里写图片描述
有了这种结构,就可根据compare或compareTo方法的比较结果进行排序.
/*使用TreeSet,TreeMap存储自定义对象的两种排序方式:
* 因为Integer,String默认重写了compareTo方法,可实现自然排序
* Integer的compareTo实际上是利用了compare方法
* 以TreeSet为例:
* (1)自然排序
* 必须要让该让集合元素本身实现comparable接口,重写其中的compareTo方法
* (2)比较器排序
* 通过构造方法,匿名内部类的方式让这个集合对象实现Comparator接口,重写其中的int compare(T o1, T o2)方法,来比较两个对象的值

 TreeSet<CStudent> ts=new TreeSet<CStudent>(new Comparator() {
			@Override
			public int compare(Object o1, Object o2) {
				return 0;
			}
            底层通过TreeMap进行实例化
            TreeSet构造方法源码:
             public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }
        如果不采用以上两种方法就会出现类转换异常:XXX cannot be cast to java.lang.Comparable
		 * 
		 */

(2)List子实现类可通过Collections集合工具类中的方法排序
例如:ArrayList,Vector,LinkedHashList

(a),   public static <T extends Comparable<? super T>> void sort(List<T> list)
根据元素的自然顺序 对指定列表按升序进行排序。
列表中的所有元素都必须实现 Comparable 接口。
此外,列表中的所有元素都必须是可相互比较的
(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。
Integer与String可直接使用.

(b), public static <T> void sort(List<T> list,  Comparator<? super T> c)
根据指定比较器产生的顺序对指定列表进行排序。
此列表内的所有元素都必须可使用指定比较器相互比较
(也就是说,对于列表中的任意 e1 和 e2 元素,c.compare(e1, e2) 不得抛出 ClassCastException)。	

四, 添加元素
单列集合:
Vector:
public void addElement(E obj)
其它List,Set子实现类
public boolean add(E e);
双列集合:Map子实现类
public V put(K key, V value);
无重复键时返回值为null
键相同值覆盖
注意;Hashtable不允许插入null值,null键
否则会出现空指针异常:
Exception in thread “main” java.lang.NullPointerException
at java.util.Hashtable.put(Unknown Source)

TreeMap<String,String> tm2=new TreeMap<String,String>();
		String s=tm2.put("a", "1");
		System.out.println(s);//null
		String s1=tm2.put("b", "2");
		System.out.println(s1);//null
		String s2=tm2.put("b", "3");
		System.out.println(s2);//2
		System.out.println(tm2);
		/**
		 * null
		 * null
		 * 2
		 * {a=1, b=3}
		 */

五, 集合遍历
A, 单列集合:
(1)增强for遍历(最常用)
if(!集合.isEmpty())
for(集合元素类型 变量名:集合名){
}
(2)迭代器遍历
Interator it=集合.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//List有专有的ListIterator
注意不能遍历时同时进行增删操作,否则会出现并发修改异常.
(3)toArray()转换成数组遍历
(4)List子实现类可用普通for结合集合.get(index);

B, Map双列集合
(1)先获取键集,再根据键集get对应的value(最常用)
Set keySet=集合.KeySet();
for(E key:KeySet){
System.out.println(“value”+集合.get(key));
}
(2)获取键值对集合,

 Set<Entry<E, E>> entrySet = 集合.entrySet();
		for ( Entry<E, E> en : 集合) {
			String key = en.getKey();
	        String value= en.getValue();
			String value= en.getValue();
		    System.out.println(key+value);
		}

六, 关于集合的使用
要根据实际需求而定.
(1)对需求没有明确要求的情况下
单列集合就用:ArrayList
(2)涉及到多线程要考虑到线程安全:
单列:Vector,双列:Hashtable
不考虑安全问题用其他类型的集合,效率较高
(3)根据增删,查询,排序:
a, 查询多:选底层数据结构为数组的,ArrayList,Vector
b, 增删多:链表结构,LinkedList等
c, 排序:树形结构:单列:TreeSet,双列:TreeMap
(4)元素唯一性
选取具有哈希表结构的

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值