IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Java三大集合list、set、map -> 正文阅读

[数据结构与算法]Java三大集合list、set、map


所有的案例有需要详细的案例代码的链接:
list: 链接
set: 链接
map: 链接

1.三大常见集合

Map和Collection是并列关系,List、Set和Queue是Collection的子接口

1.1Java中常见的集合

  1. Map和Collection是所有集合接口的父类接口;

  2. Collection包括Set与List集合;

  3. Map集合有:HashMap,TreeMap,HashTable,currentHashMap;

  4. Set集合有:HashSet,TreeSet,LinkedHashSet;

  5. List集合有:ArrayList,LinkedList,vector

1.2HashMap与HashTable区别

  1. HashMap是线程不安全的;HashTable是线程安全的,使用了锁;
  2. HashMap是线程不安全的,是最常用的,它的速度快,内部采用数组来存放数据
  • 保存的方式是键值对的形式存在
  • map的key和value是都可以为null的,HashTable是不可以的

1.3HashMap的存储原理

当调用put()方法,首先会调hashCode()方法,返回一个HashCode值,然后通过hashcode找到hashcode桶,将Entry实例存入桶中;当发生hash冲突,则会在桶后面添加链表。hashMap在1.8前的结构是数组+链表的形式,在1.8后为数组+链表+红黑树,为什么会是这样呢,因为在hashmap容量太大的情况下,检索起来会很慢,因此在1.8后加入了红黑树,提高教唆效率。

1.4ArrayList与LinkedList的区别

  • ArrayList 特点:底层数据结构是数组。特点:查询和修改效率高(快),增加删除效率低(慢)
  • LinkedLis 特点::底层数据结构是链表。特点:查询和修改效率低(慢),增加删除效率高(快)

1.5HashSet和TreeSet有哪些区别

  • HashSet:底层通过hash算法来实现,保证了元素的唯一性;

  • TreeSet底层以红黑树来实现;保证元素唯一性是通过Comparable或者Comparator接口实现;

1.6list与set的区别

  • List是有序,可重复的链表;

  • Set是无序,且不可重复的链表;

1.7Collection和Collections有什么区别

  • collection是集合的一个顶层接口,包含了集合体系的共性;

  • collections是一个工具类,用于操作collection的方法;

2.list集合

  • list集合的增删改查
  • list集合的三种遍历方式

下面删除有一个细节/这里很容易搞错

String sa = list.remove(0);//输入的是int类型那么就是按照数组的下标进行删除

下面是两个删除的方法

String sa = list.remove(0);//输入的是int类型那么就是按照数组的下标进行删除
System.out.println(sa);//打印的是要删除的元素
System.out.println(list);

boolean sb = list.remove("小李");//输入的是string类型那么就按照数组里面的对象进行删除
System.out.println(sb);//通过对象删除返回的是boolean类型 返回 true或false
System.out.println(list);

遍历:第三种遍历方式我使用了:迭代器(等会我会把所有案例的代码下载连接放在最后面)

  1. LinkedList完成堆栈/队列的开发
    堆栈的特点:先进后出(相同案例比如子弹夹先放进去的子弹最后一个才打出来)
    队列的特点:先进先出(相同案例比如水管最前面进去的最先流出来)

  2. List集合如何进行优化

1.List集合底层是数组
疑惑点:数组的长度是不可变的,而list集合能够无限制的添加元素
2.List集合底层数组的初始化容量是10,增长因子是0.5
疑惑点:当数组容量到达到上限时,容量会自动扩容
3.List集合进行优化,只需要扩大初始化容量,减少扩容的次数,进一步提高性能 有意识的设置初始化容量

3.set集合

  1. set集合的基本特点
  • 容器中不会出现重复的元素(如果有一个元素在添加一个同样的元素就会把前面的元素覆盖掉)
  • set集合是无序的相较于list集合是没有下标的(没有顺序的)
  1. set集合底层去重原理

1.hashset底层去重,与hashCode、equals方法相关
2.是优先对比hashCode值在对比equals值,当hashCode值相同,并且equals返回的值是true,则判定为重复元素
2.1 hashCode值不相同,就不会调用equals方法进行比较了
2.2 hashCode值相同,就调用equals方法

  1. 集合怎么进行排序
  • 需求1:按照名字的首字母进行排序输出 treeset和hashset相比treeset是可以进行排序的

使用treeset集合进行排序必须实现Comparable接口

  • 需求2:排序的元素不是String,而是对象Person
    得到的结论:treeset中的元素想要进行排序,那么必须实现java.lang.Comparable接口
  • 需求3:针对不同的模块,有不同的排序规则,相互之间互不干扰,针对于同一批数据

4.map集合

  1. map集合的特点以及遍历方式
  • 保存的方式是键值对的形式存在
  • map的key是可以为null的
  • 修改 本质上就是通过(键值对)键key对应的值value的覆盖来实现 说白了就是把原来的值覆盖掉了

遍历

//遍历
		//方式一:通过先获取map集合中的所有key,然后将其遍历的到单个key,最后通过单个key拿到对应的值
		Set<String> key = map.keySet();
		for (String str : key) {
			System.out.println("当前的key为: "+str+"     对应的值为: "+map.get(str));
		}
		
		//方式二:先拿到map集合对应的映射关系enter对象,然后通过enter对象,拿到key及value值		方式二相比方式一性能要好
		Set<Entry<String, Object>> ent = map.entrySet();
		for (Entry<String, Object> enter : ent) {
			System.out.println("当前的key为: "+enter.getKey()+"     对应的值为: "+enter.getValue());
		}

2.有一段随机生成的字符串,统计字符出现的次数

需求: 有一段随机生成的字符串,统计字符出现的次数:avguudcmjgcfjMfiagvfmjfiugfvzvzgre

思路:
1.将字符串转换成字符数组
2.遍历字符数组,将遍历的字符当作key,在map集合找对应的值
3.值为null,代表这个字符没有在map容器里面出现过,给容器map赋值为1
4.值不为null,代表曾经出现过,那么给原有对应值+1,覆盖原有的值

4.1泛型

  • 1.为什么要使用泛型
  • 之前:编译通过的代码可能会在运行时产生异常,代码健壮性差
  • 之后:将代码运行时的异常转换为编译期的错误,增强了代码的健壮性
  • 需求:保留偶数,输出一个只保留偶数的集合

4.2工具类的介绍

list集合排序

List<Person> list = new ArrayList<Person>();

		// 增加
		list.add(new Person("小王", 10, 100));
		list.add(new Person("小李", 11, 200));
		list.add(new Person("小黑", 12, 300));
		list.add(new Person("小哈", 13, 400));
		list.add(new Person("老李", 14, 500));
		// list.add("a");

//		Collections.sort(list);//按年龄进行排序
		Collections.sort(list, (x,y)->x.getName().compareTo(y.getName()));
		

		for (Person in : list) {
			System.out.println(in);
		}


String[] str= {"a","b","c","d","e","f"};
System.out.println(asList);
//		System.out.println(str);//运行输出[Ljava.lang.String;@53d8d10a
//想要运行它可以使用以下方法
//		Arrays.sort(str);//加个它介绍按照单词表升序(正序)
		Arrays.sort(str, (x,y) ->y.compareTo(x));//降序(反序)
		System.out.println(Arrays.toString(str));//使用这种方法可以输出集合内容
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-05 23:40:24  更:2022-07-05 23:40:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:48:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码