当前位置: 首页 > news >正文

集合及映射

1、集合类图

1)ArrayList与LinkedList 区别

LinkedList 实现了双向队列的接口,对于数据的插入速度较快,只需要修改前后的指向即可;ArrayList对于特定位置插入数据,需要移动特定位置后面的数据,有额外开销

public class Test {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("b");list.add("c");list.add(1,"d");//相对LinkedList插入速度较慢System.out.println(list);System.out.println(list.get(1));//直接通过数据下标index获取数据,查询速度相对LinkedList较快List<String> linkedList = new LinkedList<>();linkedList.add("a");linkedList.add("b");linkedList.add("c");linkedList.add(2,"d");//相对ArrayList插入速度较快System.out.println(linkedList.get(1));//需要遍历整个队列,查询速度相对ArrayList较慢System.out.println(linkedList);}
}

2)Set 存储的元素不重复,元素重复的标准如下:

i:先判断集合元素的hashCode是否在集合里面存在,不存在认为是不重复的,直接插入进集合,插入集合的位置按照hash出来散列值排序
ii:如果集合元素的hashCode在集合里面存在,需要再判断集合元素的内容是否一致(存在hash冲突,即不同的元素hash后产生相同的hashCode),调用equals方法,如果内容不一致,可以插入
iii:调用equals方法,如果内容一致,说明是重复,则不插入集合
import lombok.AllArgsConstructor;
import lombok.Data;import java.util.Objects;@Data
@AllArgsConstructor
public class Student {private String num;//学号private String name;private int age;@Overridepublic int hashCode() {return num.hashCode();//用学号计算hashCode}@Overridepublic boolean equals(Object o) { //学号、姓名、年龄完全一致才认为是相同学生if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(num, student.num) && Objects.equals(name, student.name);}@Overridepublic String toString() {return this.hashCode() + "-Student{" +"num='" + num + '\'' +", name='" + name + '\'' +", age=" + age +'}';}
}
import java.util.*;public class Test {public static void main(String[] args) {Set<Student> set = new HashSet<Student>();/*** set集合里面内容不可重复,判断重复的标准是:* 1)先判断集合元素的hashCode是否在集合里面存在,不存在认为是不重复的,直接插入进集合,插入集合的位置按照hash出来散列值排序* 2)如果集合元素的hashCode在集合里面存在,需要再判断集合元素的内容是否一致(存在hash冲突,即不同的元素hash后产生相同的hashCode),*    调用equals方法,如果内容不一致,可以插入* 3)调用equals方法,如果内容一致,说明是重复,则不插入集合*/Student s1 = new Student("1", "张三", 18);//hashCode:49Student s2 = new Student("2", "李四", 19);//hashCode:50set.add(s1);set.add(s2);System.out.println(set);//[49-Student{num='1', name='张三', age=18}, 50-Student{num='2', name='李四', age=19}]Student s4 = new Student("1", "赵六", 18);//hashCode:49,此时集合中已经存在hashCode=49的元素boolean add = set.add(s4);//true hashCode与s1一致,但是内容与s1不同,可以插入System.out.println(set);//[49-Student{num='1', name='张三', age=18}, 49-Student{num='1', name='赵六', age=18}, 50-Student{num='2', name='李四', age=19}]Student s5 = new Student("1", "张三", 18);//hashCode:49,内容与s1完全一致,插入不成功add = set.add(s5);System.out.println(add);//false}
}

3)TreeSet 实现了SortedSet 接口,存放的元素可以按照自定义的顺序排序,示例如下:按照学生年龄升序排序

import java.util.*;public class Test {public static void main(String[] args) {Set<Student> set = new TreeSet<>((s1,s2) -> {return s1.getAge() - s2.getAge();//定义排序的集合,按照学生年龄升序排序});Student s1 = new Student("1", "张三", 20);Student s2 = new Student("2", "李四", 25);Student s3 = new Student("3", "李四", 18);set.add(s1);set.add(s2);set.add(s3);//[51-Student{num='3', name='李四', age=18}, 49-Student{num='1', name='张三', age=20}, 50-Student{num='2', name='李四', age=25}]System.out.println(set);}
}

2、映射类图:

1)HashMap、LinkedHashMap、TreeMap 区别

HashMap: 按照key hash后的值大小顺序存放元素;

LinkedHashMap:有链表特性,按照映射插入顺序存放元素

TreeMap:按照key的自然顺序或自定义排序key进行存放元素

示例代码如下:

import java.util.*;public class Test {public static void main(String[] args) {Map<String,Object> map = new HashMap<>();map.put("name","张三");map.put("age","18");map.put("num","001");//按照key-hash后的值大小顺序放入映射中System.out.println(map);//{num=001, name=张三, age=18}Map<String,Object> linkedMap = new LinkedHashMap<>();linkedMap.put("name","张三");linkedMap.put("age","18");linkedMap.put("num","001");//LinkedHashMap,有链表特性,可以保证插入的顺序就是映射的顺序System.out.println(linkedMap);//{name=张三, age=18, num=001}Map<String,String> treeMap = new TreeMap<String,String>((s1,s2) -> {return s2.compareTo(s1);//自定义排序,按照字符串降序排列});treeMap.put("A1","A1");treeMap.put("A2","A2");treeMap.put("B1","B1");System.out.println(treeMap);//{B1=B1, A2=A2, A1=A1}//遍历treeMap.forEach((key,value) -> {System.out.println(key + ":" + value);});}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux批量解压tar.gz文件
  • 动态规划-最大子数组和
  • STM32的CRC校验(基于HAL库)
  • c++面向对象程序设计中的二义性及解决办法--郭妍论文
  • Electron 项目实战 03: 实现一个截图功能
  • Spark框架
  • 【kubernetes】持久化存储 —— PV / PVC
  • 打开mdk的configuration wizard界面
  • Qt:玩转QPainter序列九(文本,文本框,填充)
  • SpringBoot Web请求响应
  • 极盾故事|某金融租赁机构应用数据保护新策略:“动态脱敏”“二次授权”
  • Trm理论 2(Word2Vec)
  • 使用AI写WebSocket知识是一种怎么样的体验?
  • 【C++ Qt day5】
  • Docker 安装FileBeat、Elasticsearch及Kibana详细步骤
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • #Java异常处理
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • echarts的各种常用效果展示
  • Java编程基础24——递归练习
  • Markdown 语法简单说明
  • node学习系列之简单文件上传
  • spring-boot List转Page
  • ucore操作系统实验笔记 - 重新理解中断
  • use Google search engine
  • vue中实现单选
  • 多线程事务回滚
  • 后端_MYSQL
  • 老板让我十分钟上手nx-admin
  • 聊聊flink的BlobWriter
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 如何设计一个微型分布式架构?
  • 收藏好这篇,别再只说“数据劫持”了
  • 我看到的前端
  • 小程序测试方案初探
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (7)摄像机和云台
  • (javaweb)Http协议
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)windows配置JDK环境
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (四) 虚拟摄像头vivi体验
  • (五)网络优化与超参数选择--九五小庞
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)socket Aio demo
  • (转)大型网站架构演变和知识体系