集合类List、Set、Map的区别、联系和遍历方式
说集合之前,先说说数组和集合:
1.数组长度是固定的,当超过容量后会在内存中重新创建一个原来数组1.5倍长度的新数组,再把元素存进去;数组既可以存储基本数据类型,又可以存储引用数据类型。
2.集合长度是可变的,集合只能存储引用数据类型,集合也可以存储基本数据类型,但是在存储时自动装箱变成对象。
3.如果元素个数是固定的推荐用数组,如果元素不是固定的推荐用集合。
一.三者关系
1.Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。如何遍历Collection中的每一个元素,不论Collection的实际类型如何都支持一个iterator()方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator();
while(it.hasNext()){
Object obj = it.next();
}
List和Set是Collection两个派生接口。
2.Set
Set接口继承Collection
接口,而且它不允许集合中存在重复项。所有原始方法都是现成的,没有引入新方法。具体的Set
实现类依赖添加的对象的equals()
方法来检查等同性。
HashSet: 使用HashMap的一个集的实现。虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的。
TreeSet: 在集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用了一个TreeMap。
Set的两种遍历:
(1)迭代遍历
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
(2)for循环遍历
for (String data : set) {
System.out.println(data);
}
3.List
List接口继承了Collection
接口,特点是存储有序,有索引,可以存储重复元素。 实际上有两种List: 一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。
ArrayList:由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。
LinkedList:由链表实现的List。查询元素慢(二分查找,从头或从尾一个一个往中间找),但是往List中间插入和移除元素的速度很快。
Vector:实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。你也可以用一个迭代器从一个Vector中检索对象。Vector是唯一的同步容器类!!当两个或多个线程同时访问时也是性能良好的
List的遍历方式由以下几种:
(1)普通for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
(2)迭代遍历
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
(3)增强for循环
for(String data : list){
System.out.println(data);
}
4.List的三个子类的特点
ArrayList:
底层数组结构是数组,查询快,增删慢;线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢;线程安全,效率低。
Vector相对ArrayList查询慢(线程安全),Vector相对LinkedList增删慢。
LinkedList:
底层数据结构是链表,查询慢,增删快;线程不安全,效率高。
5.Map
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。
“集合框架”提供两种常规的Map
实现:HashMap
和TreeMap
。和所有的具体实现一样,使用哪种实现取决于您的特定需要。在Map
中插入、删除和定位元素,HashMap
是最好的选择。但如果您要按顺序遍历键,那么TreeMap
会更好。根据集合大小,先把元素添加到HashMap
,再把这种映射转换成一个用于有序键遍历的TreeMap
可能更快。使用HashMap
要求添加的键类明确定义了hashCode()
实现。有了TreeMap
实现,添加到映射的元素一定是可排序的。
HashTable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。
HashMap: 实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。
TreeMap: 实现这样一个映象,对象是按键升序排列的。
Map的几种遍历方式:
(1)二次取值
for (String key : map.keySet()) {
System.out.println(key + map.get(key));
}
(2)通过Map.entrySet使用iterator遍历key和value
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
System.out.println(entry.getKey() + entry.getValue());
}
(3)通过Map.entrySet遍历key和value
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + entry.getValue());
}
(4)通过Map.values()遍历所有的value,但不能遍历key
for (String value : map.values()) {
System.out.println(value);
}
集合类List、Set、Map的区别、联系和遍历方式的更多相关文章
- Map集合的几种遍历方式
Map<String ,String> map=new HashMap<String,String>(); map.put("1","value1 ...
- Map集合的应用及其遍历方式
---> HashMap :底层基于哈希表 存储原理也使用哈希表来存放的: 往HashMap添加了元素 ,首先会调用键的hashCode方法 获得一个哈希值,然后 ...
- Map集合的两种遍历方式
Map集合:即 接口Map<K,V> map集合的两种取出方式: 1.Set<k> keyset: 将map中所有的键存入到set集合(即将所有的key值存入到set中) ...
- Map集合的四种遍历方式
很久以前写的代码,和上一个做比较吧!便于以后查看 import java.util.HashMap; import java.util.Iterator; import java.util.Map; ...
- Map集合的四种遍历方式(转载)
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestMap { pu ...
- List和Map常用的几种遍历方式
遍历一个List有以下几种方法: /*//1.普通for循环的方式: List<String> list=new ArrayList<String>(); list.add(& ...
- Map集合的4种遍历方式
import java.util.HashMap;import java.util.Iterator;import java.util.Map; public class TestMap { p ...
- Java-list,set,map的区别
jdk中api的定义 Collection ├----List │ ├----LinkedList │ ├----ArrayList │ └----Vector │ └----Stack └----S ...
- Java 常用数据结构对象的实现原理 集合类 List Set Map 哪些线程安全 (美团面试题目)
Java中的集合包括三大类,它们是Set.List和Map, 它们都处于java.util包中,Set.List和Map都是接口,它们有各自的实现类. List.Set都继承自Collection接口 ...
随机推荐
- CentOS下 NFS的简单使用以及windows 关在linux的NFS存储方法
1. 全部安装的情况下NFS已经安装到服务器上面了,如果没有安装的话 需要使用如下命令进行安装 yum -y install nfs-utils rpcbind 2. 创建需要使用的NFS目录 mkd ...
- NOIP2018划水记
// 6次NOIP里最爽的一次 去年的NOIP的游记:https://www.cnblogs.com/GXZlegend/p/7880740.html Day 0 特意请了一天假复习NOIP 实际上是 ...
- echarts实现环形图
前端框架使用的angular,使用echarts实现环形图 1. item.component.html <div id="box1" class="pie&quo ...
- #pragma once 与 #ifndef 的使用
为了防止头文件被重复包含,主要有两种方式: 方式一:使用 #ifndef #ifndef OPTIONAL_TEST_H #define OPTIONAL_TEST_H //............. ...
- Django_ KindEditor 插件使用
KindEditor 富文本编辑器插件 目的及原理: 更便捷的在前端页面上实现用户的文本编辑操作, 本质上就是对标签的样式进行封装和事件预处理, 常规操作都可以通过直接的引入即可实现, 但是对于存在 ...
- 【题解】 Test 买水的ACX(套路)
题目描述: ACX在××信竞组学会信息竞赛,但是他的同学都很巨,于是要他去买水,结果来到某个买水的商店(奇奇怪怪的商店). 一天,ACX买了 N 个容量可以认为是无限大的瓶子,初始时每个瓶子里有 1 ...
- SpringBoot整合Swagger-ui
SpringBoot整合Swagger-ui 引入依赖 <dependency> <groupId>org.springframework.boot</groupId&g ...
- plsql批量导入sql文件
背景:有时候在两个数据库之间导入导出数据,不可避免的需要进行sql文件的批量导入,一个个导入效率太低,所以可以考虑批量导入的办法进行导入. 操作步骤 1.假设有三个sql脚本,分别为aa.sql,bb ...
- 遭遇:“传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确” 错误
http://www.cnblogs.com/delphinet/archive/2010/03/09/1681777.html 正在写一个类似文章的发表系统.其中记录文章内容的字段Contents设 ...
- NO.6: 为多态基类声明virtual析构函数
注意:polymorphic base class 应该具有虚析构函数,如果class带有任何virtual函数,也应具有虚析构函数 class不具备polymorphic属性则不应该声明virtua ...