Java 常用集合

---|Collection: 单列集合,定义了最常规的操作方法

          ---|List: 有存储顺序, 可重复

              ---|ArrayList:    数组实现, 查找快, 增删慢                         

              ---|LinkedList:   链表实现, 增删快, 查找慢实现了栈 队列  

              ---|Vector:   和ArrayList原理相同, 但线程安全, 效率略低

---| Stack 类

           ---|Set: 无存储顺序, 不可重复

              ---|HashSet  线程不安全,存取速度快。底层是以哈希表实现的

              ---|TreeSet  红-黑树的数据结构,默认对元素进行自然排序(String)。如果在比较的时候两个对象返回值为0,,那么元素重复。 Comparable,Comparator。

              ---|LinkedHashSet

---| Map: 键值对

      ---|HashMap 采用哈希表实现,所以无序

---|TreeMap 可以对键值进行排序

---|HashTable 线程同步

       ---|LinkedHashMap 对Map集合进行增删提高效率



Collection 定义了最基本的操作方法:

1、增加(add/addAll)        

 2、删除(remove/removeAll/clear/retainAll)

3、查询(contain/containAll/iterator/size/isEmpty 

4、转数组(toArray/toArray(T[]))

AbstractCollection Collection的一个实现类,实现了Collection的方法,

https://www.cnblogs.com/android-blogs/p/5566212.html

其中,比较有趣的地方:

 privatestaticfinalintMAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

-8是因为数组对象的头部会占用这8个字节



List


List接口相对Collection扩展了几个方法:

indexOf(),lastIndexOf(),subList(),set()



AbstractList

public abstract class AbstractList extends AbstractCollection implements List

继承自AbstractCollectio 实现了 List的接口 

其中 

checkForComodification 用于检测列表是否在其它线程被修改

final void checkForComodification() {

            if (modCount != expectedModCount)

                throw new ConcurrentModificationException();

        }



ArrayList

详细介绍: https://www.cnblogs.com/xujian2014/p/4625346.html



Set



AbstractSet 继承了AbstractCollection实现了Set接口

AbstractSet的Hash值是所有元素的hash值的总和 

Java中的Hash原理:取数据内容的每个char值按照一个算法做运算得到的值,例如String的hash算法就比较简单:

public int hashCode() {

      int h = hash; 

      if (h == 0 && value.length > 0) { 

          char val[] = value; 

            for (int i = 0; i < value.length; i++) { 

              h = 31 * h + val[i]; 

          } 

           hash = h; 

      } 

      return h; 

  } 



HashSet


HashSet不能添加重复的元素,当调用add(Object)方法时候,

首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;

如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。

HashSet底层数据实现用HashMap,那每次插入的数据其实只放在haspmap的key当中,而hashmap存的value都固定为一个空置Object

// PRESENT是向map中插入key-value对应的value 13

// 因为HashSet中只需要用到key,而HashMap是key-value键值对; 14

// 所以,向map中添加键值对时,键值对的值固定是PRESENT 15

private static final Object PRESENT =new Object();

http://www.cnblogs.com/skywang12345/p/3311252.html


Map


 更完整的解析

https://blog.csdn.net/panweiwei1994/article/details/77185902




©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容