今天学习一下集合包里面的内容,常见的有Collection和Map两个接口的实现类
Collection中常见的又分为两种:

1.List ,支持放入重复的对象,实现类有arraylist,linkedlist,vector,stack
           2.Set ,不支持放入重复对象,hashset,treeset
ArrayList:
    创建arraylist:提供了三种构造方式。

  1. public ArrayList(int initialCapacity) {
  2. if (initialCapacity > 0) {
  3. this.elementData = new Object[initialCapacity];//大于0时就直接创建object数组
  4. } else if (initialCapacity == 0) {
  5. this.elementData = EMPTY_ELEMENTDATA;//为0时构造一个空的
  6. } else {
  7. throw new IllegalArgumentException("Illegal Capacity: "+
  8. initialCapacity);
  9. }
  10. }

当插入的数据大于它的容量时就会扩容,过程如下:

  1. public static void main(String[] args) {
  2. List list = new ArrayList(2);
  3. list.add(1);
  4. list.add(2);
  5. list.add(3);
  6. }

上面定义了长度为2,但存放了三个,调用过程是这样的,在第三次时决断minCapacity-elementData.length>0就调用grow法。源码如下:

  1. //添加
  2. public boolean add(E e) {
  3. ensureCapacityInternal(size + 1); // Increments modCount!!
  4. elementData[size++] = e;
  5. return true;
  6. }
  7.  
  8. private void ensureCapacityInternal(int minCapacity) {
  9. ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
  10. }
  11.  
  12. private static int calculateCapacity(Object[] elementData, int minCapacity) {
  13. if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
  14. return Math.max(DEFAULT_CAPACITY, minCapacity);
  15. }
  16. return minCapacity;
  17. }
  18.  
  19. private void ensureExplicitCapacity(int minCapacity) {
  20. modCount++;
  21.  
  22. // overflow-conscious code
  23. if (minCapacity - elementData.length > 0)
  24. grow(minCapacity);
  25. }
  26.  
  27. private void grow(int minCapacity) {
  28. // overflow-conscious code
  29. int oldCapacity = elementData.length;
  30. int newCapacity = oldCapacity + (oldCapacity >> 1);
  31. if (newCapacity - minCapacity < 0)
  32. newCapacity = minCapacity;
  33. if (newCapacity - MAX_ARRAY_SIZE > 0)
  34. newCapacity = hugeCapacity(minCapacity);
  35. // minCapacity is usually close to size, so this is a win:
  36. elementData = Arrays.copyOf(elementData, newCapacity);
  37. }

删除元素:

  1. public E remove(int index) {
  2. rangeCheck(index);
  3.  
  4. modCount++;
  5. E oldValue = elementData(index);
  6.  
  7. int numMoved = size - index - 1;
  8. if (numMoved > 0)
  9. System.arraycopy(elementData, index+1, elementData, index,
  10. numMoved);
  11. elementData[--size] = null; // clear to let GC do its work
  12.  
  13. return oldValue;
  14. }
  15.  
  16. public boolean remove(Object o) {
  17. if (o == null) {
  18. for (int index = 0; index < size; index++)
  19. if (elementData[index] == null) {
  20. fastRemove(index);
  21. return true;
  22. }
  23. } else {
  24. for (int index = 0; index < size; index++)
  25. if (o.equals(elementData[index])) {
  26. fastRemove(index);
  27. return true;
  28. }
  29. }
  30. return false;
  31. }
  32.  
  33. private void fastRemove(int index) {
  34. modCount++;
  35. int numMoved = size - index - 1;
  36. if (numMoved > 0)
  37. System.arraycopy(elementData, index+1, elementData, index,
  38. numMoved);
  39. elementData[--size] = null; // clear to let GC do its work
  40. }

遍历时:

  1. public Iterator<E> iterator() {
  2. return new Itr();
  3. }
  4.  
  5. int cursor; // index of next element to return
  6. int lastRet = -1; // index of last element returned; -1 if no such
  7. int expectedModCount = modCount;
  8.  
  9. Itr() {}
  10.  
  11. public boolean hasNext() {
  12. return cursor != size;
  13. }
  14.  
  15. @SuppressWarnings("unchecked")
  16. public E next() {
  17. checkForComodification();
  18. int i = cursor;
  19. if (i >= size)
  20. throw new NoSuchElementException();
  21. Object[] elementData = ArrayList.this.elementData;
  22. if (i >= elementData.length)
  23. throw new ConcurrentModificationException();
  24. cursor = i + 1;
  25. return (E) elementData[lastRet = i];
  26. }
  27.  
  28. public void remove() {
  29. if (lastRet < 0)
  30. throw new IllegalStateException();
  31. checkForComodification();
  32.  
  33. try {
  34. ArrayList.this.remove(lastRet);
  35. cursor = lastRet;
  36. lastRet = -1;
  37. expectedModCount = modCount;
  38. } catch (IndexOutOfBoundsException ex) {
  39. throw new ConcurrentModificationException();//这个异常说明在操作元素时,有其他线程对list进行了改变
  40. }
  41. }
  42.  
  43. @Override
  44. @SuppressWarnings("unchecked")
  45. public void forEachRemaining(Consumer<? super E> consumer) {
  46. Objects.requireNonNull(consumer);
  47. final int size = ArrayList.this.size;
  48. int i = cursor;
  49. if (i >= size) {
  50. return;
  51. }
  52. final Object[] elementData = ArrayList.this.elementData;
  53. if (i >= elementData.length) {
  54. throw new ConcurrentModificationException();
  55. }
  56. while (i != size && modCount == expectedModCount) {
  57. consumer.accept((E) elementData[i++]);
  58. }
  59. // update once at end of iteration to reduce heap write traffic
  60. cursor = i;
  61. lastRet = i - 1;
  62. checkForComodification();
  63. }
  64.  
  65. final void checkForComodification() {
  66. if (modCount != expectedModCount)
  67. throw new ConcurrentModificationException();
  68. }
  69. }

总结:

ArrayList基于数组方式实现,无容量限制,在插入元素时可能会扩容,在删除元素时,容量大小并不会改变,但可以通过trimToSize()来修改。在查找元素时要遍历数组,对于非null的元素,采取equals的方式查找,最后一点arrayList是非线程安全的。

LinkedList也是非线程安全的,它基于双向链表机制实现,插入元素时要新建一个Entry对象(1.8好像是Node,没骨找到Entry对象)。

Vector是基于Synchronized实现的线程安全的ArrayList,但在插入元素时容量扩充的机制和ArrayList稍有不同,并可通过capacityIncrement来控制容量的扩充。

Stack继承Vector,实现后进先出(LIFO)的弹出及压入操作,提供了push,pop,peek三个主要方法。

HashSet:

hashset是set接口的实现,set 和list区别就是set不允许有元素重复(不重复是底层用hashmap),

总结:

HashSet基于HashMap,无容量限制,HashSet是非线程安全的。

集合类中的Collection接口实现类的更多相关文章

  1. 『Java』Collection接口 Collections类

    接口Collection public interface Collection<E>定义了所有单列集合中共性的方法,所有的单列集合都可以使用共性方法. Collection的常用子接口有 ...

  2. JavaWeb学习之JDBC API中常用的接口和类

    JDBC API中包含四个常用的接口和一个类分别是: 1.Connection接口 2.Statement接口 3.PreparedStatement接口 4.ResultSet接口 5.Driver ...

  3. Java中的List接口实现类LinkedList

    package collection; import java.util.LinkedList; /* * 1.implement List接口 * 2.底层是一个链表结构:查询慢,增删快 * 注意: ...

  4. 集合框架二(Collection接口实现类常用遍历方法)

    四种常用遍历方式 Collection coll = new ArrayList(); coll.add("123"); coll.add("456"); co ...

  5. JAVA中Collection接口和Map接口的主要实现类

    Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素 ...

  6. JAVA 中的 Collection 和 Map 以及相关派生类的概念

    JAVA中Collection接口和Map接口的主要实现类   Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的 ...

  7. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  8. 16、Collection接口及其子接口Set和List(常用类LinkedList,ArrayList,Vector和Stack)

    16.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同 ...

  9. 【集合系列】- 深入浅出分析Collection中的List接口

    一.List简介 List 的数据结构就是一个序列,存储内容时直接在内存中开辟一块连续的空间,然后将空间地址与索引对应. 以下是List集合简易架构图 由图中的继承关系,可以知道,ArrayList. ...

随机推荐

  1. php chop()函数 语法

    php chop()函数 语法 chop()函数是什么意思? php chop函数是rtrim函数的别名,作用与rtrim函数是相同的,删除字符串右边的空格或其他预定义字符,语法是chop(strin ...

  2. QUartus 使用之001_空格_箭头切换----FPGA--001

    Quartus里的Tab键,按下后,显示的为什么是箭头,以前显示的是空白,图片如下: 解决方式如下: 修改后效果图如下:

  3. The shortest problem(hdu,多校

    The shortest problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  4. (转)maven怎么 引入(或引用/使用) 自定义(或本地/第三方) jar的三种方式 图文教程 方法二最简单

    转:https://blog.csdn.net/wabiaozia/article/details/52798194 准备工作: 假如我有一个自定义jar是:123456.jar,下载地址http:/ ...

  5. Intel CPUs

    http://en.wikipedia.org/wiki/Intel_cpus List of Intel Atom microprocessors List of Intel Xeon microp ...

  6. offsetleft 和 style.left 的区别

    offsetLeft 获取的是相对于父对象的左边距: left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距: 如果父div的position定义为rel ...

  7. iterm2简易登录服务器

    文章目录 添加文件 添加配置 直接登录 方法一 方法二 添加文件 在mac任意目录添加 10.0.1.1.txt ,这里的名字可以随意起,也可以不是txt #!/usr/bin/expect set ...

  8. appium常见问题11_小米手机初次启动app,报错255“Requires permission android.permission.WRITE_SECURE_SETTINGS”

    问题: 新申请的测试机到啦,申请机型是小米9.打开开发者模式.USB调试后,连接电脑,准备跑一下自动化脚本.但是在pycharm中点击run后,出现报错,报错code:255,提示“Requires ...

  9. spring boot 尚桂谷学习笔记09 数据访问

    springboot 与数据库访问 jdbc, mybatis, spring data jpa,  1.jdbc原生访问 新建项目 使用 springboot 快速构建工具 选中 web 组件 sq ...

  10. Java前端控制器模式~

    前端控制器设计模式用于提供集中式请求处理机制,以便所有请求将由单个处理程序处理.此处理程序可以执行请求的身份验证/授权/记录或跟踪,然后将请求传递到相应的处理程序. 以下是这种类型的设计模式的实体. ...