JAVASE(十四) 集合: 数组和集合、Collection、Iterator、List、Set、Map
个人博客网:https://wushaopei.github.io/ (你想要这里多有)
1、数组和集合
1.1 内存中对数据进行存储和管理的“容器”:数组,集合
1.2 数组存储的特点和缺点
特点:
- 数组一旦创建成功,长度不可变
- 元素存储的类型就是数组声明时的类型。
缺点:
- 数组的长度不可变
- 数组的API属性比较少,比如没有 增,删,改,插 等...
- 存储的元素是序的可重复的,对无序的不可重复的无能为力。
集合存储的优点:
- 长度可变
- 底层的数据结构比较丰富。比如:数组,链表,红黑树
- 集合的API比较丰富,比如 增,删,改,查,插等
- 对数据的存储方式支持也比较多,比如序可重复,无序不可重复。
2、Collection接口
2.1 Java 集合概述
Java 集合可分为 Collection 和 Map 两种体系
2.2 单列集合框架结构:Collection
继承树图:
概述:
- Collection 接口是 List、Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。
- JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)实现。
- 在 Java5 之前,Java 集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object 类型处理;从 JDK 5.0 增加了泛型以后,Java 集合可以记住容器中对象的数据类型。
2.3 Collection接口常用方法:
3、Iterator接口
3.1 遍历Collection的两种方式:
第一种 增强for循环
第二种 Iterator接口
3.2 java.utils包下定义的迭代器接口:Iterator
- 作用:遍历集合中的元素
- 如何获取实例:集合的对象.iteraotr()
- 常用方法:
hasNext() : 判断是否还下一个元素
next() :①指针下移 ②返回指针指向的元素
4.举例:
//获取Iterator实现类的对象
Iterator iterator = c.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
5.图示说明:
- Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。
- 所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。
- Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建 Iterator 对象,则必须有一个被迭代的集合。
3.3 Iterator接口的方法
在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。
3.4 增强for循环:(foreach循环)
格式:
for(元素的类型 临时变量 : 集合、数组的对象){
}
遍历集合:
Collection c = new ArrayList();
c.add("gg");
c.add("jj");
c.add("dd");
c.add("mm");
for(Object obj : c){
System.out.println(obj);
}
遍历数组:
String[] names = {"小泽泽","小圆圆","小玲玲"};
for(String str : names){
System.out.println(str);
}
4、Collection子接口-List
4.1 存储的数据特点:存储的元素是序的且可重复的
4.2 常用方法:
List接口的常用实现类:
|-------ArrayList : 主要实现类 线程不安全
|-------LinkedList :
|-------Vector : 线程安全
4.3 [ 面试题 ] ArrayList,LinkedList,Vector的区别是什么?
三者都是List的实现类,存储的元素都是有有序的可重复的。
ArrayList : List的主要实现类底层是一个数组,查找快,增删慢。线程不安全的效率高。
LinkedList : 底层是一个双向链表,查找慢,增删快
Vector :古老的实现类,底层是一个数组,查找快,增删慢。线程安全的效率低。
4.4 存储的元素的要求:自定义类必须重写equals方法
4.5 ArrayList
(1)ArrayList构造器的说明:
new ArrayList() : 底层创建一个长度为10的数组
new ArrayList(int initialCapacity) : 创建一个长度为initialCapacity的数组
(2)如何向ArrayList中添加数据?
当我们创建一个空参构造器的ArrayList的对象时,底层会为我们创建一个长度为10的数组,当我们向容器中添加第11个元素时,底层会进行扩容,扩容为原来的1.5倍(创建一个长度为原来的1.5倍的数组,同时将原有的数据复制到新的数组中)。
4.6 案例:
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
updateList(list);
System.out.println(list);
}
private static void updateList(List<Integer> list) {
list.remove(new Integer(2));
//list.remove(2);
}
5、Collection 子接口-Set
5.1 存储的数据特点:存储的元素是无序的且不可重复
Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals 方法
5.2 HashSet元素添加方式:
当我们向集合中添加元素时,会先调用该元素的hashCode方法来决定元素存放的位置。如果该位置没有其它元素则直接存放。如果该位置已经有其它元素,则调用该元素的equals方法进行比较。
如果返回值为true则认为这两个元素是相等的则不能再存放。如果返回值是false则以链表的形式存放该数据。(jdk1.8如果该链表位置上的元素到达8个时则改成红黑树的形式存放数据。
HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
5.3常用方法:没额外增加其它的方法
5..4常用实现类:
|-----HashSet : 是Set的主要实现类 , 线程不安全
|-----LinkedHashSet : 继承了HashSet底层实现原理和HashSet一样。除此之外还维护了一张链表用来记录元素存放的顺序。那么就可以按照元素存放的顺序进行遍历。
|-----TreeSet : 可以对元素进行排序
5..5存储元素所在类的要求:
HashSet,LinkedHashSet : 自定义类需要重写equals和hashCode方法
TreeSet : 自定义类实现Comparble接口,或者 创建一个Compartor接口实现类的对象
5..6TreeSet的使用:
说明:
- 可以用来对元素进行排序
- TreeSet的底层数据结构是红黑树
- TreeSet元素的类型必须是同一类型
5.7 思考?
- 如果即自然排序又定制排序谁起作用? 定制排序
- 自然排序和定制排序哪个更好? 定制排序更灵活
自然排序 :
- 自定义类实现Comparable接口
- 重写comparTo方法
- 在comparTo方法中进行相关属性的比较
- 向集合中添加元素
定制排序 :
- 创建一个Comparator实现类的对象
- 重写compare方法
- 在compare方法中进行相应的属性的比较
- 将Comparator实现类的对象作为实参传入给TreeSet的构造器中
- 向集合中添加数据
5.8 LinkedHashSet的使用说明:
继承了HashSet底层实现原理和HashSet一样。除此之外还维护了一张链表用来记录元素存放的顺序。那么就可以按照元素存放的顺序进行遍历。
5.9 HashSet的实现原理
当我们向集合中添加元素时,会先调用该元素的hashCode方法来决定元素存放的位置。如果该位置没有其它元素则直接存放。如果该位置已经有其它元素,则调用该元素的equals方法进行比较。
如果返回值为true则认为这两个元素是相等的则不能再存放。如果返回值是false则以链表的形式存放该数据。(jdk1.8)如果该链表位置上的元素到达8个时则改成红黑树的形式存放数据。
6、Map接口(双列结合)
继承关系树:
6.1 存储数据特点:存储的是键值对
说明:
- Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value
- Map 中的 key 和 value 都可以是任何引用类型的数据
- 可以把Map中所有的key看成是Set的集合,无序的且不可重复的 ---> 要求key中存放自定义类的对象必须重写equals和hashCode方法
- 可以把Map中所有的value看成是Collection的集合,无序的可重复的--> 要求value中存放自定义类的对象必须重写equals方法
- 我们可以把键值对看成是Entry。Entry是无序的且不可重复的(Entry存放的位置由key来决定)
图示:
6.2 常用实现类:
|-----HashMap 数组+ 链表+红黑树(jdk8以后新增的)
|------LinkedHashMap
|-----TreeMap
|-----Hashtable
|----Properties
6.3 常用方法
6.4 面试题:
相同点:都是以key和value的形式存储;
不同点:
- HashMap是不安全的;HashTable线程安全的(使用了synchronized关键字来保证线程安全)
- HashMap中key和value可以为空;HashTable中value不可以为空
(2)HashMap的底层实现原理?
当我们向HashMap中存放元素(K1,V1)时,会先根据K1的HashCode方法来决定在数组中存放的位置。如果该位置上没有其它元素则直接放入。如果该位置上有其它元素(K2,V2),那么会调用K1的equals方法和K2进行比较。如果返回结果为true说明两个元素的Key(特点:无序且不可重复)值相同。那么V1将会覆盖V2。如果返回结果为false,那么(K1,V1)将以链表的形式存放该内容。如果链表的数量超过8则将链表改成红黑树。
6.5 结构说明
new HashMap() :
通过空参的构造器创建一个HashMap的对象。该对象底层会创建一个长度为16的数组,加载因子为0.75。当集合中的元素的个数超过12时会进行扩容,扩容为原来的2倍。
说明:
- HashSet的底层其实就是一个HashMap
- LinkedHashSet的底层其实就是一个LinkedHashMap
- TreeSet的底层其实就是一个TreeMap
6.7 读取配置文件的操作实现
//1.创建Properties的对象
Properties properties = new Properties();
//2.创建一个文件
File file = new File("person.properties");
//3.创建一个文件输入流
FileInputStream fis = new FileInputStream(file);
//4.加载流
properties.load(fis);
//5.获取文件中的内容
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println(username + " " + password);
//6.关流
fis.close();
6.8 Collections工具类的使用
- reverse(List):反转 List 中元素的顺序
- shuffle(List):对 List 集合元素进行随机排序
- sort(List):根据元素的自然顺序对指定 List 集合元素升序排序
- sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
- swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
- Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
- Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
- Object min(Collection)
- Object min(Collection,Comparator)
- int frequency(Collection,Object):返回指定集合中指定元素的出现次数
- void copy(List dest,List src):将src中的内容复制到dest中
- boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所旧值
JAVASE(十四) 集合: 数组和集合、Collection、Iterator、List、Set、Map的更多相关文章
- 条目二十四《当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择》
条目二十四<当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择> 当效率至关重要时,应该在map::operator[]和map::insert之 ...
- 学JAVA第二十四天,Set集合与StringBuilder
下面的内容需要慢慢看,因为,我的语言表达能力不是很好 首先说Set把,Set集合是一个无序且不允许重复的集合,而且查找效率也是快的可怕的. 但是,有些时候,我们必须要用储存多个相同的值时,Set也是可 ...
- <JAVA8新增内容>关于集合的操作(Collection/Iterator/Stream)
因为下文频繁使用lambda表达式,关于Java中的lambda表达式内容请见: http://www.cnblogs.com/guguli/p/4394676.html 一.使用增强的Iterato ...
- 二十四种设计模式:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现 ...
- redis(十四):Redis 有序集合(sorted set)
Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过 ...
- C#编程(三十四)----------数组作为参数
原文链接: http://blog.csdn.net/shanyongxu/article/details/46765267 数组作为参数 数组可以作为参数传递给方法,也可以从方法中返回.要返回一个数 ...
- php分享二十四:数组
1:isset() 对于数组中为 NULL 的值不会返回 TRUE,而 array_key_exists() 会. 2:利用array_filter和strlen快速过滤数组中等于0的值 $path ...
- C++(四十四) — 数组模板类(vector工具)
实现 stl 中的 vector 操作. 1.MyVector.h #pragma once #include <iostream> using namespace std; templa ...
- java中的数组与集合相互转换
1.数组转换成集合 数组转换为集合,用Arrays.asList方法. public static void main(String[] args) { String[] arr = {"a ...
随机推荐
- QML设计飘散效果
1,目标及展示 首先希望实现文字.图片.控件等在触发后,呈现飘散并消失的效果.在QT例程<Qt Quick Particles Examples>是一个海星点击鼠标后呈现打散的效果,这个效 ...
- 【HBase】HBase和Hue的整合
目录 一.修改hue.ini配置文件 二.启动HBase的thrift server服务 三.启动Hue 四.页面访问 一.修改hue.ini配置文件 cd /export/servers/hue-3 ...
- 【Hadoop离线基础总结】完全分布式环境搭建
完全分布式环境搭建 服务规划 适用于工作当中正式环境搭建 安装步骤 第一步:安装包解压 停止之前的Hadoop集群的所有服务,并删除所有机器的Hadoop安装包,然后重新解压Hadoop压缩包 三台机 ...
- jvm入门及理解(五)——运行时数据区(虚拟机栈)和本地方法接口
一.虚拟机栈背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要 ...
- Altium Designer PCB封装bug,元件焊盘位置偏移解决方法
1.问题描述:在拖动几个电阻位置时,意外发现Altium designer20版本软件的一个bug——0805的电阻两焊盘位置发生了偏移,如下图所示. 2.解决办法: ①选中焊盘偏移的封装,右键剪切掉 ...
- 可怕!CPU竟成了黑客的帮凶!
本故事根据CPU真实漏洞改编 前情回顾 还记得我吗,我是阿Q,就是那个CPU一号车间的阿Q啊.如果你忘记了我,记得看看这里回忆一下哦:完了!CPU一味求快出事儿了! 自从我们车间用上了乱序执行和分支预 ...
- Offset等一些类似属性的使用
1.offset系列 // offset 系列 var father = document.querySelector('.father'); var son = document.querySele ...
- 浅析微软的网关项目 -- ReverseProxy
浅析微软的网关项目 ReverseProxy Intro 最近微软新开了一个项目 ReverseProxy ,也叫做 YARP(A Reverse Proxy) 官方介绍如下: YARP is a r ...
- 关于layui数据表格的各种事件
table.on('tool(demo)', function(obj){}):监听工具条事件,tool 是工具条事件名,demo 是 table 原始容器的属性 lay-filter="对 ...
- 【WEB自动化】【第一节】【Xpath和CSS元素定位】
目前自动化测试开始投入WEB测试,使用RF及其selenium库,模拟对WEB页面进行操作,此过程中首先面对的问题就是对WEB页面元素的定位,几乎所有的关键字都需要传入特定的WEB页面元素,因此掌握常 ...