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));//使用这种方法可以输出集合内容
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值