15集合的应用

集合的概念

集合是一个容器,可以容纳其他类型的数据,前面所讲的数组就是一个集合。
所有的集合相关的类和接口都在java.util包下

特点

  • 集合不能直接存储基本数据类型(但是代码上不需要体现,因为Java中有自动装箱)
  • 另外集合不能直接存储Java对象,而是存储其内存地址也叫做引用
  • 不同集合,底层对应不同的数据结构
  • 数据结构就是数据存储的结构,常见的结构有:数组、二叉树、连败哦、哈希表等。

分类

Java中的集合分为两类
一类是以当个方式存储元素:java.util.Collection
集合的继承结构图
另一类是以键值对的方式存储元素:java.util.Map
Map集合的继承结构图
图中已经展现出各个集合的特点。

总结常用集合

集合存储结构
ArrayList数组
LinkedList双向链表
HashSet底层是HashMap,其存储的元素等于HashMap的key
TreeSet底层是TreeMap,其存储的元素等于TreeMap的key
HashMap哈希表
Properties线程安全,key和value只能存储String类型,常用做配置类
TreeMap二叉树,key可以自动按大小排序

Collection

Collection集合没有泛型时,可以存储Object的所有子类
但是存在泛型之后,只能存储泛型的类型

注意:不能存放基本数据类型和对象本身,只能存储封装类或对象的内存地址。

常用的方法

常用方法说明
boolean add(E e)向集合中添加一个元素,添加成功返回true
boolean remove(Object o)删除某个元素,底层会调用equals方法进行对比,成功返回true
int size()返回集合中元素的个数
boolean contains(Object o)判断集合中是否包含改元素,底层调用equeals(),包含返回ture
boolean isEmpty()判断集合是否为空,为空返回true
void clear()清空改集合
Object[] toArray()将集合转换为数组

演示:

public class Test{public static void main(String[] args){//多态,夫类型引用指向子类型对象Collection c = new ArrayList();//向集合中添加一个元素1/*注意Java在中存在自动装箱机制,实际上是:Integer i = new Integer(1);*/c.add(1);//获取当前集合的元素个数,当前为1int size = c.size();//判断当前集合中是否包含1,结果是tureboolean isContains = c.contains(1);//清空集合c.clear();//判断集合是否为空,结果为tureboolean isEmpty = c.isEmpty();}
}

Iterator 迭代器

只有Collection集合才能被迭代器迭代,Map集合不可以使用

常用方法说明
boolean hasNext()判断当前指向的元素后是否还存在元素
E next()返回当前指向的元素,并且指向下一个元素
remove()删除迭代器当前指向的元素

使用方法:

main(){//首先需要准备一个Conllection的集合Collection collections = new ArrayList();collections.add("元素1");...collections.add("元素n");//获取迭代器对象,改方法继承自Iterator接口Iterator<String> it = collections.iterator();//判断当前元素后是否还有元素while (iterator.hasNext()) {//使用一个变量接收该元素后,并指向下一个元素String element = iterator.next();//打印前面接收的元素System.out.println(element);}
}

注意:在迭代的过程中,要删除集合中元素时,请使用迭代器的remove方法。
直接使用Collection中的方法,需要重新获取一个新的迭代器。

List子类

List作为Collection的子类,存在一些特有的方法
这些方法根据该集合的特点而来

方法说明
void add(int index, E element)向指定下标处添加元素
E get(int index)获取指定下标的元素
E set(int index, E elemtnt)修改指定下标的元素
int indexOf(Object o)返回列表中第一次出现指定元素的索引,如果没有返回-1
int lastIndexOf(Object o)返回列表中最后出现的指定元素的索引,如果没有返回-1
E remove(int index)删除指定索引的元素

ArrayList

特点:

  • ArrayList不是线程安全的
  • 默认的初始化容量是10
  • 底层先创建一个长度为0的数组,添加第一个元素时长度变为10
  • 集合的底层时一个Object数组

构造方法:

new ArrayList();//默认初始化方式
new ArrayList(20);//指定初始大小
new ArrayList(一个集合);
//比如将HashSet转化为ArrayList

数组的扩容:

  • 增长到原容量的1.5倍

面试题:ArrayList的优缺点

  • ArrayList使用最多,与数组的特点相同
  • 数组检索效率高//以后经常检索
    (由于每个元素占用的空间大小相同,内存地址连续,知道首元素的地址,可根据偏移量计算出目标元素的内存地址)

缺点:

  • 数组无法存储大数据量
  • 随机增删元素效率低
  • 末尾增删不受影响

LinkedList

特点:

  • 底层存储在双向链表中
  • 由三部分组成:上一个节点的内存地址、数据、下一个节点的内存地址
  • 没有初始化容量,firstlast都是null

Vector(使用很少,了解即可)

  • 底层是数组
  • 初始化容量是 10
  • 扩容之后是原容量的二倍 10-20-40-80
  • Vector 都是线程同步/线程安全的,都带有synchronized关键字,使用较少

Set集合中的元素都等同于Map集合的Key

Map

与Collection没有关系
其存储方式以key-value的形式存储(key和value都是引用数据类型)
不能直接存储对象,只能存储对象的内存地址

Map接口中常用的方法

方法说明
V put(K key, V value)向集合中添加键值对
V get(Object key)通过key获取value
V remove(Object key)通过key删除value
Collection< V> values()获取所有的value
Set< K> keySet()返回Map集合中所有的key

Map集合遍历的方式

方式一:先获取所有的key,再通过key来获取value

Iterator<Integer> it = keys.interator();
while(it.hasNext()){//取出一个keyInteger key = it.next();//通过key获取valueString value = map.get(key);System.out.println(key+"+"+value);
}

方式二:将Map集合转化为Set集合
效率较高!!适合大数据量

Set<Map.Entry<Integer,String>> set = map.entrySet();
Iterator<Map.Entry<Integer,String>> it2 = map.entrySet();
while(it.hasNext()){Map.Entry<Integer,String> node = it2.next();Integer key = node.getKey();String value = node.getValue();System.out.println(key+"="+value);
}

HashMap

特点:

  • 集合的默认初始化容量是16,默认加载因子是0.75
  • 初始化容量必须是2的倍数
  • 扩容是原来的二倍
  • 默认加载因子是HashMap集合容量达到75%时数组开始扩容
  • 非线程安全

HashMap的源代码中有以下属性:

final int hash; //实际上是key的hashCode()
final K key
V value
Node < K,V> next;

HashMap 集合允许key值为 null
但是HashMap集合的key null 值只能有一个

了解内容:
如果hashcode();固定为某个值,会使hashMap变成单项列表
这种情况叫:散列分布不均匀
如果hashcode()全部不一样的,会使hashMap变成一维数组
也是散列分布不均匀
哈希表

散列分布均匀需要重写hascode();有一定的技巧

【最终结论】
放在HashMap key部分的元素和HashSet的元素
需要同时重写equals();和hashcode();

Properties

特点:

  • 继承Hashtable
  • 初始化容量是11,默认加载因子是0.75
  • 扩容是原容量乘以2再加一
  • 线程安全
  • key和value都是字符串,且不能为空
常用方法说明
String getProperty(String key)根据键值,获取属性
Object setProperty(String key, String value)调用 Hashtable 的方法 put

TreeMap

特点:

  • 底层是二叉树
  • 无序不可重复,存入的值会自动按照大小排序(String按字典升序,Integer按大小升序)
  • 对自定义的类进行排序时,需要声明比较规则。如果没有实现 java.lang.Comparable比较接口 JVM会报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696137.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

etcd集群恢复、单节点恢复操作手册

一、集群备份 备份方式&#xff1a;Jenkins触发每小时的定时任务&#xff0c;通过调取ansible的playbook进行etcd集群的数据备份和上传&#xff0c;默认只备份集群中的非leader成员&#xff0c;避免leader成员压力过大。将备份数据上传到对应的公有云对象存储&#xff0c;分别…

2024初会押题来了!经济法和实务,内部资料,赶快做一做!

初级会计考试考前冲刺策略 1. 核心知识点掌握 考前冲刺首先需要对核心知识点进行梳理和重点复习。《初级会计实务》和《经济法基础》是考试的两个主要科目&#xff0c;考生需要确保对其中的高频考点有深刻的理解。 2. 高效记忆技巧 对于容易遗忘的知识点&#xff0c;可以采用…

Bootloader+升级方案

随着设备的功能越来越强大&#xff0c;系统也越来越复杂&#xff0c;产品升级也成为了开发过程不可或缺的一道程序。在工程应用中&#xff0c;如何在不更改硬件的前提下通过软件的方式实现产品升级。通过Bootloader来实现固件的升级是一种极好的方式&#xff0c;Bootloader是单…

Springboot HelloWorld

新建一个maven工程 引入依赖项 <modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.11.RELEASE</version><…

ST表(静态RMQ问题)

static Range Max/Min Query ST表 利用的是动态规划的思想 状态&#xff1a; //st[i][j]-->区间长度为1<<j&#xff0c;在区间[i,i1<<j-1]上的最值 状态转移方程&#xff1a; st[i][j]max(st[i][j-1],st[i(1<<j-1)][j-1]);#include <iostream> #inc…

vue3延迟加载(异步组件​)defineAsyncComponent

最简单用法 Index.vue: <script setup> import { onMounted, defineAsyncComponent } from vue import ./index.cssconst Child defineAsyncComponent(() > import(./Child.vue))onMounted(() > {}) </script><template><div class"m-home-w…

C/C++:Windows中的静态链接库

静态链接库 静态链接库是在编译时将库的代码和数据复制到可执行文件中&#xff1b;这意味着最终的可执行文件包含了程序所需的所有函数和数据&#xff0c;因此它在运行时是完全独立的。 静态链接库工作原理&#xff1a; 开发人员创建一个或多个静态链接库&#xff0c;其中包含…

vue3.0(八) 监听器(watch),高级监听器(watchEffect)

文章目录 watch1 watch的用法2 watch的高级用法3 watch性能优化 watchEffect1 停止监听2 侦听多个状态3 懒执行 watch和watchEffect的区别watch和computed的区别 watch watch特性进行了一些改变和优化。与computed不同&#xff0c;watch通常用于监听数据的变化&#xff0c;并执…

【数据结构】详解栈且实现

一.栈 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;…

《Mybatis》系列文章目录

什么是 MyBatis&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff…

动手学深度学习18 预测房价竞赛总结

动手学深度学习18 预测房价竞赛总结 李沐老师代码AutoGluonh2o集成学习automlQA 视频&#xff1a; https://www.bilibili.com/video/BV15Q4y1o7vc/?vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 代码&#xff1a; https://www.bilibili.com/video/BV1rh411m7Hb/?vd_sourceeb04…

【强训笔记】day21

NO.1 思路&#xff1a;第一个位置放最小的&#xff0c;其次放最大的&#xff0c;依次类推。 代码实现&#xff1a; #include<iostream>using namespace std; int n;int main() {cin>>n;int left1,rightn;while(left<right){cout<<left<<" &…