整理之Java容器
主要参考:JAVA常见容器
Set,List,Map,Vector,ArrayList的区别
Java所有容器见下图:

数组
int[] t = new int[10]; //声明并创建长度为10的数组,用默认值占位,String默认值为null
int[] t = new int[] {1, 2, 3}; //声明并创建数据同时初始化初值
int[] t = {1, 2, 3}; //同楼上
//数组的长度都是不可变的
List
list是有序的集合,内容也可以重复
- ArrayList是采用数组实现的list,所以利于随机查找和修改,不利于增加和删除。
- LinkedList是采用循环双链表实现的list,所以利于在插入和删除,不利于随机查找和修改。而且由于需要存储节点,LinkedList占用空间较大
- Vector与ArrayList的唯一区别是Vector是线程安全、同步、效率低,ArrayLisy相反
- Stack类继承于Vector,实现一个栈,提供push、pop、peek(不出栈的pop)、search、empty等方法
list的子类都继承了iterator方法以供遍历:
ArrayList<Integer> al = new ArrayList<>();
Iterator<Integer> it = al.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
此外List还提供ListIterator方法,允许增加、删除、修改和向前向后移动,使用方法同Iterator。
ArratList和Vector的默认容量为10, 最大容量是Integer.MAX_VALUE - 8。】
ArrayList采用1.5倍扩容,Vector采用2倍扩容如果扩容后仍不够用,则直接扩容到所需的大小。
Map
1.HashMap与HashTable
HashMap与HashTable类似于ArrayList与Vector,实现原理相同,但是前者非线程安全非同步,效率高;后者相反。
Map的key是不可重复的
Map的常用Api:
HashMap<Integer, String> hm = new HashMap();
hm.put(1, "英语");
hm.put(2, "语文");
hm.put(3, "数学");
hm.replace(1, "化学"); //将key=1的value替换
Boolean i = hm.replace(1, "英语", "化学"); //如果key=1的value=英语则替换为化学,否则不替换
hm.remove(1); //这一对函数的原理同replace
Boolean i = hm.remove(1, "英");
Set<Entry<K, V>> entrySet = hm.entrySet(); //Map的实际元素就是Entry
hm.getOrDefault(Object key, String defValue);//取出key对应的value,如果没有则返回默认值defValue
hm.putIfAbsent(Object key, String defValue);//插入键值对.如果key不存在则
HashMap内部采用Hash算法进行排序,HashMap默认容量为16,容量为2^n,加载因子为0.75(已有元素超过总容量的75%是扩容),如:
HashMap<Integer, String> hm = new HashMap();
hm.put(15, "数学"); //15
hm.put(19, "英语"); //4
hm.put(72, "语文"); //8
for (Map.Entry<Integer, String> e : hm.entrySet()) {
System.out.println(e.getKey() + " " + e.getValue());
}
//上面输出为:
//19 英语
//72 语文
//15 数学
HashTable默认容量为11,加载因子为0.75,扩容方式为:2*原容量+1
2.LinkedHashMap
LinkedHashMap继承了HashMap。但是与HashMap不同的是:LinkedHashMap插入元素和取出元素的顺序是一致的,因为其内部维持了一个双向链表,用于记录迭代顺序。
LinkedHashMap扩容机制同HashMap
3.TreeMap
TreeMap同样有序,但是TreeMap是按照字典顺序升序排列key(数字0-9,字母a-z)。如:
TreeMap<String, String> tm = new TreeMap<>();
tm.put("aircrew", "英语");
tm.put("aircraft", "数学");
tm.put("rabbit", "语文");
tm.put("airdrome", "语文");
for (Map.Entry<String, String> e : tm.entrySet()) {
System.out.println(e.getKey() + " " + e.getValue());
}
//以上输出为:
//aircraft 数学
//aircrew 英语
//airdrome 语文
//rabbit 语文
TreeMap由红黑树算法实现,无容量限制
Set
Set内部元素是无序、确定、单一的。Set比较元素是否相同使用equals而不是==。
Set的主要子类有HashSet、LinkedHashSet和TreeSet,其关系与Map的三个子类相同。
HashSet用HashMap来实现,其内部实例化一个HashMap用于存储数据,但只用到了key,value用一个Object()代替。
所以在排序和扩容方面,HashSet和HashMap完全相同。
Queue
除了以上三大类数据结构外,Java还提供了队列的接口Queue(LinkedList实现了其子接口Deque,可以当做Queue使用)。
整理之Java容器的更多相关文章
- Java容器相关知识点整理
结合一些文章阅读源码后整理的Java容器常见知识点.对于一些代码细节,本文不展开来讲,有兴趣可以自行阅读参考文献. 1. 思维导图 各个容器的知识点比较分散,没有在思维导图上体现,因此看上去右半部分很 ...
- 【Java心得总结七】Java容器下——Map
我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...
- 【Java心得总结五】Java容器上——容器初探
在数学中我们有集合的概念,所谓的一个集合,就是将数个对象归类而分成为一个或数个形态各异的大小整体. 一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集.构成集合的事物或对象称作元素或是成 ...
- 【公开课】【阿里在线技术峰会】魏鹏:基于Java容器的多应用部署技术实践
对于公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我.以下是阿里对公开课的整理 摘要: 在首届阿里巴巴在线峰会上,阿里巴巴中间件技术部专家魏鹏为大家带来了题为<基于Java容 ...
- 【转载】国外程序员整理的Java资源大全
以下转载自: 推荐!国外程序员整理的Java资源大全中文版 https://github.com/akullpp/awesome-java英文版 Java 几乎是许多程序员们的入门语言,并且也是 ...
- java容器基础
总结一下学过的java容器知识. 一.java容器框架 由于之前学习的java容器类比较混乱,先简单的整理一下java集合框架. 首先,像这种图,网上到处都是,因为这个也算比较准确吧,我也懒得自己画了 ...
- Java容器框架总结(一)
本篇根据<Java编程思想> 第11章 持有对象 整理,总结Java容器框架中常用集合类及接口的特点及使用场景. (一)总结 1)数组将数字与对象联系起来:可以保存基本类型的数据:一旦生成 ...
- Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本
Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本 前言 序言 再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点. 适合阅读人群 J ...
- 【Java心得总结六】Java容器中——Collection
在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...
随机推荐
- Python -- 值转换为字符串的两种机制
可以通过以下两个函数来使用这两种机制:一是通过str函数,它会把值转换为合理形式的字符串,以便用户可以理解:而repr会创建一个字符串,它以合法的Python表达式的形式来表示值.下面是一些例子: & ...
- LATEX学习和IEEE Tran模板介绍
目录 软件的选择 IEEE 模板下载 模板正文 图 表格 公式 算法 参考文献 Latex学习网站:http://www.latexstudio.net/page/tex-documents/ IEE ...
- markdown文档编写基础
Markdown快速入门教程 ###########来源:https://zhuanlan.zhihu.com/p/84918488 ###########来源:https://github.com/ ...
- Jupyter Kernel Error 解决办法
首先在pycharm的terminal中输入 python -m ipykernel install --user 之后会如下图显示: 这就是kernel的安装路径. 然后输入: jupyter ke ...
- JUC学习笔记(三)
JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...
- BUUCTF-[极客大挑战 2019]BabySQL(联合注入绕过waf)+[极客大挑战 2019]LoveSQL(联合注入)
BUUCTF-[极客大挑战 2019]BabySQL(联合注入绕过waf) 记一道联合注入的题,这道题存在过滤. 经过手工的测试,网站会检验用户名和密码是否都存在,如果在用户名处插入注入语句,语句后面 ...
- C++ 封装类 2 设计一个学生类 属性有姓名学号 可以给姓名 和学号赋值 可以显示学生的姓名和学号
1 //设计一个学生类 属性有姓名学号 可以给姓名 和学号赋值 可以显示学生的姓名和学号 2 #include <iostream> 3 #include<string> 4 ...
- 2021大厂Android面试高频100题最新汇总(附答案详解)
前言 现在越来越多的人应聘工作时都得先刷个几十百来道题,不刷题感觉都过不了面试. 无论是前后端.移动开发,好像都得刷题,这么多人通过刷题过了面试,说明刷题对于找工作还是有帮助的. 不过这其中有一个问题 ...
- Linux下使用pure-ftpd建立匿名ftp访问
by 无若 (一)ubuntu14.04下使用pure-ftpd建立匿名ftp访问 1.安装apt-get install pure-ftpd 2.修改配置nano /etc/pure-ftpd/co ...
- OOP面向对象程序设计原则
OOP面向对象程序设计原则 开闭原则(Open Close Principle) 对扩展开放,对修改关闭 里氏代换原则(Liskov Substitution Principle) 继承必须确保超累所 ...