JAVA基础之容器基础内容
Java Collections框架
Java Collections框架中包含了大量的集合接口以及这些接口的实现类和操作它们的方法,具体包含了Set(集合)、List(列表)、Map(键值对)、Queue(队列)、Stack(栈)等,其中List、Set、Queue、Stack都继承了Collection接口。我理解的容器就是类似于放不同奶茶的杯子的统称,不同的实现类对应了盛放不同奶茶需要不同的杯子,而我们不需要知道杯子是怎么构造的,我们只需要知道什么奶茶需要什么杯子即可,而迭代器(Iterator)相当于喝奶茶的吸管,拿到吸管我们不用了解奶茶的构造,仅仅用吸管喝美味的奶茶就好。下面是Collection框架类图:
最为主要的是三类:
- Set:集合,要求集合中的元素不相同,通过定义equals()函数来确保对对象的唯一性。
- List:有序的Collection,按照对象进入的顺序保存数据,可以通过索引来读取数据。
- Map:键值对,要求Key具有唯一性。其中HashMap通过散列表实现,LinkedHashMap采用散列表来维持内部的顺序,TreeMap是基于红黑树的数据结构来实现。
Iterator(迭代器)
用于遍历以及选择序列中的对象。就像上面所说的我们就像使用吸管一样不必了解容器内部构造,就可以使用容器实现的迭代器遍历容器的元素。包含最为主要的三个方法:
- 利用容器对象的Iterator()方法返回一个Iterator,使用next()返回第一个元素。
- hasNext() 判断是否还有元素。
- remove()删除迭代器返回的元素。
另外,在使用Iterator()遍历容器时常常出现ConcurrentModificationException异常,主要是在使用迭代器遍历容器时,进行了容器的增加或者删除操作,因为当调用容器的Iterator() 方法时,会把容器包含的对象个数赋值给Iterator对象中的expectedModCount,在调用next() 方法时会比较当前容器元素个数和expectedModCount,如果不相等抛出ConcurrentModificationException异常。解决的方法有:
- 在使用Iterator遍历时,如果删除或者增加的一个元素后即刻使用break跳出循环。
- 使用线程安全的容器:ConcurrentHashMap和CopyOnWriteArrayList。
- 在遍历时使用一个容器将要删除的对象保存,然后遍历结束后使用removeAll()。
- 使用Iterator自带的remove()方法删除
- 把遍历容器时对容器的操作放到synchronized代码中。
同类容器之间的区别
ArrayList、Vector、LinkedList区别
三者都是可伸缩的数组,可以根据用户的需求动态的变换数组的长度,很好的解决了固定长度数组构造时需要指定固定的长度的问题。另外,它们有以下区别:
- ArrayList和Vector都是利用Object[] array实现的,都是顺序存储的,支持用下标访问元素。当当前容器容量不足时,动态扩充容量,Vector采用2倍扩容,而ArrayList采用1.5倍扩容(ArrayList源码详解),其中前者可以指定扩容因子,后者固定。另一个最大的区别,Vector是线程安全的,后者是线程不安全的。
- LinkedList是利用双向列表实现的,对数据的索引需要从头开始遍历,效率较低,但是插入数据较快。
HashMap、HashTable、TreeMap以及WeakHashMap区别
- 对比HashMap和HashTable,前者是后者的轻量级实现即是非线程安全实现,HashMap允许空键值存在,而HashTable不允许;HashMap去掉HashTable中contains方法,改为containsKey以及containsValue,另外前者是Map的一个实现,而后者是Dictionary的一个实现;Hashtable使用Enumeration,HashMap使用Iterator;对于扩容方式,HashTable默认大小为11,扩容因子为old*2+1,HashMap默认大小是16,扩容因子是2的指数。
- TreeMap实现了SortedMap接口,能够按照指定的顺序对键值排序,因此取出的的键值是排完序的。
- WeakHashMap的key采用一种弱引用的方式,只要key不被外部引用,它就可以被gc回收,而HashMap则是key被删除。
Collections工具类
- 针对Collection的一个包装类,提供一系列的静态方法来处理相应的容器,服务于Collection框架中的各种类。
JAVA基础之容器基础内容相关推荐
- JAVA编程思想—容器基础(一)
JAVA编程思想-容器基础(一) Java容器类类库的用途就是"保存对象" 1>:***Collection***一个独立元素的序列,这些元素都服从一条或多条规则. Li ...
- 学习笔记:Java 并发编程①_基础知识入门
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...
- 【java后端学习】java语言基础(夯实基础)
文章目录 一.基础语法 1 java中的标识符 1.1 变量命名规范 1.2 保留字 2 java中的常量 3 java基本数据类型 4 数组 5 字符及字符串 6 运算符 7 控制语句 for语句 ...
- 《深入剖析Kubernetes》-张磊——白话容器基础(三):深入理解容器镜像
<深入剖析Kubernetes>-张磊 白话容器基础(三):深入理解容器镜像 写在前面: 张磊的极客时间课程<深入剖析Kubernetes>,是我见过讲docker和k8s最好 ...
- 第87节:Java中的Bootstrap基础与SQL入门
第87节:Java中的Bootstrap基础与SQL入门 前言复习 什么是JQ? : write less do more 写更少的代码,做更多的事 找出所有兄弟: $("div" ...
- [Java面试三]JavaWeb基础知识总结.
[Java面试三]JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Int ...
- Java基础-02(基础语法)
Java基础-02(基础语法) 一 注释 加粗样式 注释用来解释和说明程序的文字,注释是不会被执行的. 1.1单行注释 //这是一条单行注释 public int i; 1.2多行注释 /* 这是 * ...
- 服务器系统打包,详解Docker 容器基础系统镜像打包
因为容器本身是共享宿主操作系统内核,所以容器基础系统镜像包本身就是一个标准的 Linux rootfs + 用户自定义的工具.根据这个思路,我们就可以构建一个自己的容器基础系统镜像. 构建标准的 Li ...
- java代码讲解_Java基础系列-代码块详解
注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 前言 Java基础系列,尽量采用通俗易懂.循序渐进的方式,让大家真正理解Java基础知识! 代码块 ...
最新文章
- TiM:rDNA拷贝数的种内变化影响微生物群落分析吗?
- 生产过剩下的危机--房价上涨买不起房,房价泡沫破裂后仍然买不起房!
- Socket网络编程--小小网盘程序(4)
- AJAX ASP/PHP 请求实例
- DAY4(python)打印字符串以及增删改查
- 北京文化:目前《你好李焕英》贡献营收约6000万至6500万元
- 牛客练习赛31: D. 神器大师泰兹瑞与威穆(链表)
- Swift 提示 error running playground...
- python 简单 socket 编程
- python模拟类蠕虫--蠕虫初探
- 深入理解原子操作-底层基础
- Java-多人聊天小程序
- 考勤月度统计mysql_mysql中跨月统计考勤天数-问答-阿里云开发者社区-阿里云
- 小白也可以学会小爱同学语言控制灯
- ubuntu16.04下解决wps无法使用五笔输入中文的问题
- 从SOD到OOD(C++编码风格)
- ipad iphone开发_如何更快地为iPhone或iPad充电
- 已知有十六支男子足球队参加2008 北京奥运会
- PyTorch入门(二)搭建MLP模型实现分类任务
- 学习了一下python中使用adb命令的方法
热门文章
- nginx中的location指令
- 【二维差分】Monitor
- 在加拿大读大学被开除了,以后该怎么办?
- CES 2017前瞻之AI:无人机依旧小巧,机器人主打家庭服务
- Windows 7 资源管理器搜索Channel 9 视频
- STM32串口寄存器操作(转)
- Android系统Recovery工作原理之使用update.zip升级过程分析(二)---u...
- OSPF单域实验报告
- 孪生神经网络_轩辕实验室:数字孪生:基于机器学习的汽车数字孪生模型
- python3的pyqt5 qtablewidget按数据大小排列_InnoDB为什么要选择B+树来存储数据?