【Java容器】Java容器入门教程
一、数组
- 容器类只能保存对象的引用。而数组可以像保存对象的引用一样,直接保存基本类型。与包装过的基本类型的容器相比,创建与访问一个基本类型的数组效率更高。
- Java允许直接“返回一个数组”。不需要担心要为数组负责,当使用完后,垃圾回收器负责清理。
- 填充数组:方法fill()只能以某个单一的值填充整个数组,如果想用随机生成的若干数字填充数组,fill()就无能为力了。
- 复制数组:System.arraycopy() ,复制数组比用for循环复制要快多。System.arraycopy()为所有类型作了重载。
- 数组比较:Arrays类重写了equals()方法,用来比较整个数组(包括基本类型与Object)。数组相等的条件:数组元素个数必须相等,并且对应位置的元素也相等。可以通过对每一个元素使用equals()做比较来判断。
- 数组元素的比较:Java提供了比较功能,主要是实现java.lang.Comparable接口。此接口很简单,只有compareTo()一个方法。此方法以要比较的Object为参数,如果当前对象小于参数则返回负值,如果相等则返回0,如果当前对象大于参数则返回正值。
- 数组排序:使用内置的排序方法,就可以对任意的基本类型数组排序,也可以对任意的对象数组进行排序,只要该对象实
现了Comparable接口或具有相关联的Comparator。 - 二分查找:如果数组已经排好序了,就可以使用Arrays.binarySearch()执行快速查找。不要对未排序的数组使用binarySearch(),否则结果不可预料(二分法查找)。如果使用Comparator对对象数组排序(基本类型数组无法使用Comparator进行排序),再使用binarySearch()时必须提供同样的Comparator (使用此方法的重载版本)。
二、容器
ArrayList是一种List,而HashSet是一种Set。HashMap是一种Map,与数组不同。
List按对象进入的顺序保存对象,不做排序或编辑操作。
Set对每个对象只接受一次,并使用自己内部的排序方法。
Map同样对每个元素只保存一份,但这是基于“键”的,Map也有内置的排序,因而不关心元素添加的顺序.
- Collection接口及操作
1.1基本操作的方法有
size()
isEmpty()
contains()
add()
remove()
iterator() //转换
1.2 批量操作
containsAll(Collection):返回集合中是否
包含指定集合中的所有元素;
addAll(Collection)方法和removeAll(Collection)方法:将指定集合中的元素添加到集合中和从集合中删除指定的集合元素;
retainAll(Collection)方法:删除集合中不属于指定集合中的元素;
clear()方法删除集合中所有元素。
1.3 数组操作
toArray()方法可以实现集合与数组的转换
无参数的toArray()方法实现将集合转换成Object类型的数组。
有参数的toArray(Object[] a)方法将集合转换成指定类型的对象数组。 - 容器元素的访问
2.1迭代器
迭代器是一个对象,它的工作是遍历并选择序列中的对象. Java的Iterator是受限制的,它只能用来:
使用方法iterator()要求容器返回一个Iterator.第一
次调用Iterator的next()方法时,它返回序列的第一
个元素.
使用next()获得序列中的下一个元素.
使用hasNext()检查序列中是否还有元素.
使用remove()将上一次返回的元素从迭代器中移除.
Iterator it = c.iterator(); //得到迭代器对象
while (it.hasNext()){ System.out.println(it.next());
}
2.2 foreach
for (Object o : collection) System.out.println(o);
List的功能方法
可以使用add()添加对象,使用get()一次取出一个元素
有两种List:
一种是基本的ArrayList,其优点在于随机访问元素。
另一种是更强大的LinkedList,它并不是为快速随机访问设计的,它对顺序访问进行了优化,向List中间插入与删除的开销并不大,而随机访问则相对较慢。LinkedList还具有下列方法:addFirst()、addLast()、getFirst()、getLast()、removeFirst()和removeLast(),这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。Set的功能方法
Set具有与Collection完全一样的接口。但是Set不保存重复的元素。
HashSet*——为快速查找设计的Set,存入HashSet的对象必须定义hashCode().
TreeSet——保持排序的Set,底层为树结构。使用它可以从Set中提取有序的序列).
LinkedHashSet ——具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示,同样必须定义hashCode().
使用SortedSet接口(TreeSet是其唯一的实现),可以确保元素处
于排序状态,还可以使用SortedSet接口提供的附加功能。Map的功能方法
Map接口是“使用一个对象来查找另一个对象” :
方法put(Object key, Object value)添加一个“值”(value)(想要的东西)和与“值”相关联的“键”(key)(使用它来查找)。
方法get(Object key)返回与给定“键”相关联的“值”。
可以用containsKey()和containsValue()测试Map中是否包含某个“键”或“值”。
标准的Java类库中包含了几种不同的Map:
l HashMap* l TreeMap
l LinkedHashMap
l WeakHashMap
l IdentityHashMap
5.1
使用SortedMap接口(TreeMap是其唯一的实现),可以确保
“键”处于排序状态,这使得它具有额外的功能,这些功能由
SortedMap接口中的方法提供。
5.2
为了提高速度,LinkedHashMap散列化所有的元素,但是在遍历“键值对”时,又以元素的插入顺序返回“键值对”。
可以在构造器中设定LinkedHashMap,使之采用基于访问的“最近最少使用”(LRU)算法,使得没有被访问过的(可被看作需要删除的)元素出现在队列的前面.
5.3
HashMap的性能因子
容量(Capacity)——散列表中桶的数量.
初始化容量(Initial capacity):创建散列表时桶的数量(16)。HashMap和HashSet都允许在构造器中指定初始化容量。
尺寸(Size):当前散列表中记录的数量。
负载因子(Load factor):等于“size/capacity”。默认的负载因子为0.75.
三、选择接口的不同实现
- 对List的选择:
对于随机访问(get()),ArrayList的开销小于LinkedList。
从中间的位置插入和删除元素,LinkedList要 比ArrayList(需移动)快,特别是删除操作。 - 对set的选择
HashSet*的性能总是比TreeSet好(特别是最常用的添加和查询元素操作)。
TreeSet存在的唯一原因是,它可以维持元素的排序状态。所以,只有当你需要一个排好序的Set时,才应该使用TreeSet。
对于插入操作,LinkedHashSet比HashSet略微慢一点;这是由维护链表所带来额外开销造成的。不过,因为有了链表,遍历LinkedHashSet会更快。 - 对Map的选择:
Hashtable和HashMap(替代)的效率大致相同。
TreeMap通常比HashMap慢。但可以使用它生成一个排好序的队列。
LinkedHashMap比HashMap慢一点。
【Java容器】Java容器入门教程相关推荐
- Arthas(1):Java诊断工具Arthas入门教程
文章目录 前言 第一节 Arthas 能为你做什么? 第二节 环境准备 第三节 快速入门 1. 启动math-game 2. 启动arthas 3. 查看dashboard 4. 通过 thread ...
- java springboot整合zookeeper入门教程(增删改查)
java springboot整合zookeeper增删改查入门教程 zookeeper的安装与集群搭建参考:https://www.cnblogs.com/zwcry/p/10272506.html ...
- (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务...
http://blog.csdn.net/zixiao217/article/details/53044890 读完第一节,我们已经对Quartz有了一个大体的认识,它可以定时帮我们执行一些处理程序, ...
- 学编程语言C/C++、Java、Python的入门教程都在这里
前言 经常有小伙伴在群里问我:新手学编程有什么好的视频教程可以推荐? 问完后,他们经常会很含蓄的补充一句:要白嫖的! 好吧,能理解! 毕竟大多数学生党还是在靠家里支助,能白嫖的情况下,都会想着尽量 ...
- 学生党必看!C/C++、Java、Python的入门教程都在这里,能让你省下好几万的学费!
前言 经常有小伙伴在群里问我:新手学编程有什么好的视频教程可以推荐? 问完后,他们经常会很含蓄的补充一句:要白嫖的! 好吧,能理解! 毕竟大多数学生党还是在靠家里支助,能白嫖的情况下,都会想着尽量 ...
- 从零开始学习 webservice第一集,java webservice简单实例入门教程
现在从零开始学习webservice 概念自己百度搜,总之,webservice就相当于一个接口,就像你走进了一家售货店,你不需要知道这家店怎么卖给你东西,你拿着钱去,说我要一包玉溪,人家就会给你返回 ...
- idea没有out文件夹_史上最详细没有之一的 Java JNI傻瓜级入门教程
本文使用java的IDEA和visual studio2017来详细的一步一步演示java的JNI构建过程(eclipse+vs2017的教程在文末) 1.打开java的IDEA,file->n ...
- (转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例...
http://blog.csdn.net/zixiao217/article/details/53075009 Quartz的主要接口类是Schedule.Job.Trigger,而触发器Trigge ...
- (转)Java任务调度框架Quartz入门教程指南(三)任务调度框架Quartz实例详解深入理解Scheduler,Job,Trigger,JobDetail...
http://blog.csdn.net/zixiao217/article/details/53053598 首先给一个简明扼要的理解: Scheduler 调度程序-任务执行计划表,只有安排进执行 ...
- 【Java提升】设计模式入门教程 工厂模式
工厂模式是平时开发过程中最常见的设计模式.工厂模式解决类的实例化问题,它属于创建型模式.工厂模式也经常会和其他设计模式组合使用. 试想你去麦当劳买一个汉堡.你只需要告诉收银员要一个xx汉堡.过一会就会 ...
最新文章
- [C#][EF] 添加表添加不进来
- QT中事件发送函数sendEvent()、postEvent()详解
- [转]使用 LDAP 组或角色限制访问,包含部分单点登录SSO说明
- 洛谷 3381 【模板】最小费用最大流
- 6-7 jmu-Java-07多线程-Thread (3分)
- PostgreSQL 9.5 pg_dump新特性 你是我的眼
- 浙江大学_包家立教授计算生物学2_信源编码理论
- Java之品优购课程讲义_day12(2)
- pandas.Series.values
- HDU 1995 R-汉诺塔V
- BP神经网络算法基本原理,基于bp的神经网络算法
- SpringMVC工作原理(含案例图解)
- 小米 12S Utra 莱卡水印生成在线工具
- 光栅渲染器(二)画线
- python微博评论情感分析_用python对鹿晗、关晓彤微博进行情感分析
- 图解网络硬件 资料分享
- æµè¯oschina
- [修改 Mysql5.7密码策略]Your password does not satisfy the current policy requirements
- 北海道看雪(攻略及摄影)
- mybatis批量入库