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 ...
随机推荐
- 字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 目录 @ 目录 目录 一.前言 二.开发环境 三.案例目标 四.技术实现 五.测试结果 1. ...
- [hdu5396 Expression]区间DP
题意:给一个表达式,求所有的计算顺序产生的结果总和 思路:比较明显的区间dp,令dp[l][r]为闭区间[l,r]的所有可能的结果和,考虑最后一个符号的位置k,k必须在l,r之间,则l≤k<r, ...
- 2018-06-30 js事件
一.js代码加载的时机 1.DOM加载完毕 -> 将js代码放到body体之下即可: 2.网页资源加载完毕-> $(window).onload(function(){ }); 3.jQ ...
- orcle增删改操作及alter修改表字段操作
orcle增删改操作:操作前确保当前用户有增删改的权限. --创建表 create table itcast( pid ), pname ) ); drop table itcast; --复制表 c ...
- ORACLE 统计文件后缀SQL
ORACLE 统计文件后缀SQL查询语句 select lower(substr(file_name,instr(file_name, '.', -1),length(file_name))),cou ...
- vue与其他框架对比
https://cn.vuejs.org/v2/guide/comparison.html 1. vue 框架的特点? MVVM框架模式 轻量级,灵活,容易上手 数据驱动 组件化(单文件组件) 插件化 ...
- Java 代码精简
Java 代码精简 利用语法 利用三元表达式 普通 String title; if (isMember(phone)) { title = "会员"; } else { titl ...
- Python操作MongoDB代码示例
import pymongo #pip install pymongo安装python操作mongodb的模块 myclient=pymongo.MongoClient(host='127.0.0.1 ...
- 团队作业-Beta冲刺 (第一天)
这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 RTD <团队博客链接> 这个作业的目标 剩余任务预估,分配任务(开发,测试 ...
- canvas遇到的一些问题
1.移动端无法全屏问题 问题描述:由于canvas的width和height只能设置px值,不支持rem单位,所以想在移动设备屏幕分辨率繁杂的情况下达到canvas铺满全屏的效果很困难. 解决方法:通 ...