Java Container——Collection
为什么要引入数据容器
在书写程序的时候,我们常常需要对大量的对象引用进行管理。为了实现有效的归类管理,我们常常将同类的引用放置在同一数据容器中。由于数据容器中存放了我们随时可能需要使用到的对象引用,所以一般的数据容器要都要能能提供方便的查询、遍历、修改等基本接口功能。早期的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相关推荐
- java中collection方法_Java 8中的Collector toCollection()方法
toCollection()Java中的Collector类的方法返回一个Collector,该Collector以遇到的顺序将输入元素累积到一个新的Collection中. 语法如下static & ...
- 细述 Java垃圾回收机制→Java Garbage Collection Monitoring and Analysis
本文非原创,翻译自Java Garbage Collection Monitoring and Analysis 在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的.和C语言不一样的 ...
- Java中Collection与Collections的区别
Collection与Collections的根本区别是: 1.Collection 是一个集合接口.它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类库中有很多具体 ...
- Java集合Collection与List的关系、常见用法
关系树 [java] view plain copy print? ---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList: 数组实现, 查找快 ...
- 【Java】Collection集合和泛型
学习目标:会存取,掌握特性 学习方式:学习顶层接口/抽象类的共性方法,使用底层的子类创建对象使用 1 集合框架 集合类的继承体系: Collection接口: ·············1) List ...
- Java集合 Collection
Jdk提供了一些特殊的类,用来保存数量不确定的对象,存储任意类型对象,长度可变.这些类统称为集合. 集合类位于Java.util包中,按存储结构分为Collection单列集合和Map双列集合. Co ...
- 细述 Java垃圾回收机制→How Java Garbage Collection Works?
本文非原创,翻译自How Java Garbage Collection Works? 在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的.和C语言不一样的是Java程序员不需要手动 ...
- Java集合Collection接口中的常用方法演示
Java集合Collection接口中的常用方法演示 添加 add(Objec tobj) 和 addAll(Collection coll) 获取有效元素的个数 int size() 清空集合 vo ...
- JAVA day15 Collection(集合)、Iterator迭代器、泛型<E>
1.Collection(集合) 集合:集合是java中提供的⼀种容器,可以⽤来存储多个数据. 集合与数组的区别: 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同⼀类型的元素,可以存储基本 ...
最新文章
- Application Architecture Guide 2.0 - CH 19 - Mobile Applications(5)
- android:process=.server,Android启动(三)----开启SystemServer进程
- 一个医院院长电视机坏了,拿到一个大修理店去修
- 稳定工作和创业之间的抉择
- 实例化Model的三种方式
- 从零开始学_JavaScript_系列(四)——jquery(基础,选择器,触发条件,动画,回调函数)...
- 【NLP】毕设学习笔记(八)“前馈 + 反馈” = 循环神经网络RNN
- 京东资深架构师代码评审歪诗
- SpringMVC学习(四)结果跳转的方式:转发和重定向
- python常见的错误类型_python中新手朋友常见的错误信息汇总
- 外卖程序_淘宝客系统_淘客小程序-淘客系统,外卖返利程序,外卖程序,返利程序
- php源码内网穿透,PHP DDOS源码
- selnium 判断页面加载完成_Selenium 的页面加载以及几种等待的问题
- su插件打开显示html,如何让自己的su从工具变成神器?你需要这些插件
- illumina平台的一些扩增子测序项目介绍
- 完美解决Can‘t locate Data/Dumper.pm in @INC
- Mysql数据库入门 (基础知识点 由来 各种指令 如何运用)
- ORA-02396:超出最大空闲时间,请重新连接!
- C++之适配器(以优先队列为例)
- jQuery小型mp3音乐播放器插件
热门文章
- C语言 编写一个程序,根据本金a、存款年数n和年利率p计算到期利息。
- Hackme-Misc-wp
- npm publish相关问题记录
- vs2017调用目标发生异常
- VS2017出现调用的目标发生了异常的解决办法
- ESP8266连接网络助手
- ssm+jsp计算机毕业设计在线考试系统qiw6b(程序+lw+源码+远程部署)
- Discuz发帖时将远程图片自动下载并保存至服务器
- 【智慧PDU】智能PDU远程电源开关控制器技术参数
- 计算机毕业设计、课程设计、实战项目之[含论文+源码等]基于SpringBoot在线电影订票系统[包运行成功]