为什么要引入数据容器

在书写程序的时候,我们常常需要对大量的对象引用进行管理。为了实现有效的归类管理,我们常常将同类的引用放置在同一数据容器中。由于数据容器中存放了我们随时可能需要使用到的对象引用,所以一般的数据容器要都要能能提供方便的查询、遍历、修改等基本接口功能。早期的OOP语言都通过数组的方式来实现对引用集的集中管理和维护。

但是数组方式下,数组大小需要提前被确定,并不允许修改大小,导致其作为一种灵活的数据容器的能力的功能大为下降。为了方便的利用数据容器进行引用的管理,Java中提供了丰富的数据容器以满足程序员多样化的需求。

分类

java结合类主要有两个接口派生出如下图:

常用集合主要特点及实现方式

(1)set

1)(元素不重复),是没有顺序的。比较元素是否相同是用equls实现的

注意:equals的底层是用==实现的,==比较的是指向值的引用。而引用类型重写了equals方法比较的是具体的值。

2)set的底层是用map实现的,hashSet由hashMap实现

原因:set的值是不可重复的,而map的key值是不可重复的,所以set将值保存到了map的key中,而value存的一个object对象。

3)底层实现源码,以添加元素为例

<span style="font-family: Arial, Helvetica, sans-serif;">public boolean add(E e) {</span>
        return map.put(e, PRESENT)==null;}public V put(K key, V value) {if (table == EMPTY_TABLE) {inflateTable(threshold);}if (key == null)return putForNullKey(value);int hash = hash(key);int i = indexFor(hash, table.length);for (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;e.recordAccess(this);return oldValue;}}modCount++;addEntry(hash, key, value, i);return null;}void addEntry(int hash, K key, V value, int bucketIndex) {if ((size >= threshold) && (null != table[bucketIndex])) {resize(2 * table.length);hash = (null != key) ? hash(key) : 0;bucketIndex = indexFor(hash, table.length);}createEntry(hash, key, value, bucketIndex);}void createEntry(int hash, K key, V value, int bucketIndex) {Entry<K,V> e = table[bucketIndex];table[bucketIndex] = new Entry<>(hash, key, value, e);size++;}

过程:a)添加元素时先判断存放se中数据的obeject数组(transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;)是否存在,不存在新建一个

b)判断key值是否存在,不存在返回错误

c)计算hashcode,遍历已经存在的数据比较hashcode和key值是否存在,若存在新的值覆盖原来的值,否则新加到数组中

d)向数组中添加数据时判断是否能添加(一般超过75%就不可以),可以就添加。不可以就新建一个

(1)arrayList

1)不是线程安全的,vector是线程安全的。两者都是以数组的形式保存数据的

2)用法

 public void testFixArrayList(){//add()和remove()方法在失败的时候会抛出异常(不推荐)//它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。Queue<String> queue = new LinkedList<String>();//添加元素queue.offer("a");queue.offer("b");queue.offer("c");queue.offer("d");queue.offer("e");for(String q : queue){System.out.println(q);}System.out.println("===");System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除for(String q : queue){System.out.println(q);}System.out.println("===");System.out.println("element="+queue.element()); //返回第一个元素 ,但不删除for(String q : queue){System.out.println(q);}System.out.println("===");System.out.println("peek="+queue.peek()); //返回第一个元素 ,但不删除for(String q : queue){System.out.println(q);}}

3)放进去是什么类型的取出来强制转换成什么类型,否则会报错

 public void testarray(){ArrayList list = new ArrayList();list.add("hehda");list.add(new Integer(1));String a = (String)list.get(0);Integer b = (Integer)list.get(1);System.out.println(a);System.out.println(b);}

4) 存放元素的就是一个 object 数组。没生成一个新的数组长度为原来的1.5+1倍,之后将原来数组复制到新的数组中

Java Container——Collection相关推荐

  1. java中collection方法_Java 8中的Collector toCollection()方法

    toCollection()Java中的Collector类的方法返回一个Collector,该Collector以遇到的顺序将输入元素累积到一个新的Collection中. 语法如下static & ...

  2. 细述 Java垃圾回收机制→Java Garbage Collection Monitoring and Analysis

    本文非原创,翻译自Java Garbage Collection Monitoring and Analysis 在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的.和C语言不一样的 ...

  3. Java中Collection与Collections的区别

    Collection与Collections的根本区别是: 1.Collection 是一个集合接口.它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类库中有很多具体 ...

  4. Java集合Collection与List的关系、常见用法

    关系树 [java] view plain copy print? ---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList: 数组实现, 查找快 ...

  5. 【Java】Collection集合和泛型

    学习目标:会存取,掌握特性 学习方式:学习顶层接口/抽象类的共性方法,使用底层的子类创建对象使用 1 集合框架 集合类的继承体系: Collection接口: ·············1) List ...

  6. Java集合 Collection

    Jdk提供了一些特殊的类,用来保存数量不确定的对象,存储任意类型对象,长度可变.这些类统称为集合. 集合类位于Java.util包中,按存储结构分为Collection单列集合和Map双列集合. Co ...

  7. 细述 Java垃圾回收机制→How Java Garbage Collection Works?

    本文非原创,翻译自How Java Garbage Collection Works? 在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的.和C语言不一样的是Java程序员不需要手动 ...

  8. Java集合Collection接口中的常用方法演示

    Java集合Collection接口中的常用方法演示 添加 add(Objec tobj) 和 addAll(Collection coll) 获取有效元素的个数 int size() 清空集合 vo ...

  9. JAVA day15 Collection(集合)、Iterator迭代器、泛型<E>

    1.Collection(集合) 集合:集合是java中提供的⼀种容器,可以⽤来存储多个数据. 集合与数组的区别: 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同⼀类型的元素,可以存储基本 ...

最新文章

  1. Application Architecture Guide 2.0 - CH 19 - Mobile Applications(5)
  2. android:process=.server,Android启动(三)----开启SystemServer进程
  3. 一个医院院长电视机坏了,拿到一个大修理店去修
  4. 稳定工作和创业之间的抉择
  5. 实例化Model的三种方式
  6. 从零开始学_JavaScript_系列(四)——jquery(基础,选择器,触发条件,动画,回调函数)...
  7. 【NLP】毕设学习笔记(八)“前馈 + 反馈” = 循环神经网络RNN
  8. 京东资深架构师代码评审歪诗
  9. SpringMVC学习(四)结果跳转的方式:转发和重定向
  10. python常见的错误类型_python中新手朋友常见的错误信息汇总
  11. 外卖程序_淘宝客系统_淘客小程序-淘客系统,外卖返利程序,外卖程序,返利程序
  12. php源码内网穿透,PHP DDOS源码
  13. selnium 判断页面加载完成_Selenium 的页面加载以及几种等待的问题
  14. su插件打开显示html,如何让自己的su从工具变成神器?你需要这些插件
  15. illumina平台的一些扩增子测序项目介绍
  16. 完美解决Can‘t locate Data/Dumper.pm in @INC
  17. Mysql数据库入门 (基础知识点 由来 各种指令 如何运用)
  18. ORA-02396:超出最大空闲时间,请重新连接!
  19. C++之适配器(以优先队列为例)
  20. jQuery小型mp3音乐播放器插件

热门文章

  1. C语言 编写一个程序,根据本金a、存款年数n和年利率p计算到期利息。
  2. Hackme-Misc-wp
  3. npm publish相关问题记录
  4. vs2017调用目标发生异常
  5. VS2017出现调用的目标发生了异常的解决办法
  6. ESP8266连接网络助手
  7. ssm+jsp计算机毕业设计在线考试系统qiw6b(程序+lw+源码+远程部署)
  8. Discuz发帖时将远程图片自动下载并保存至服务器
  9. 【智慧PDU】智能PDU远程电源开关控制器技术参数
  10. 计算机毕业设计、课程设计、实战项目之[含论文+源码等]基于SpringBoot在线电影订票系统[包运行成功]