所有的案例有需要详细的案例代码的链接:
list:
链接
set:
链接
map:
链接
1.三大常见集合
Map和Collection是并列关系,List、Set和Queue是Collection的子接口
1.1Java中常见的集合
-
Map和Collection是所有集合接口的父类接口; -
Collection包括Set与List集合; -
Map集合有:HashMap,TreeMap,HashTable,currentHashMap; -
Set集合有:HashSet,TreeSet,LinkedHashSet; -
List集合有:ArrayList,LinkedList,vector
1.2HashMap与HashTable区别
- HashMap是线程不安全的;HashTable是线程安全的,使用了锁;
- 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有哪些区别
1.6list与set的区别
-
List是有序,可重复的链表; -
Set是无序,且不可重复的链表;
1.7Collection和Collections有什么区别
2.list集合
下面删除有一个细节/这里很容易搞错
String sa = list.remove(0);//输入的是int类型那么就是按照数组的下标进行删除
下面是两个删除的方法
String sa = list.remove(0);
System.out.println(sa);
System.out.println(list);
boolean sb = list.remove("小李");
System.out.println(sb);
System.out.println(list);
遍历:第三种遍历方式我使用了:迭代器(等会我会把所有案例的代码下载连接放在最后面)
-
LinkedList完成堆栈/队列的开发 堆栈的特点:先进后出(相同案例比如子弹夹先放进去的子弹最后一个才打出来) 队列的特点:先进先出(相同案例比如水管最前面进去的最先流出来) -
List集合如何进行优化
1.List集合底层是数组 疑惑点:数组的长度是不可变的,而list集合能够无限制的添加元素 2.List集合底层数组的初始化容量是10,增长因子是0.5 疑惑点:当数组容量到达到上限时,容量会自动扩容 3.List集合进行优化,只需要扩大初始化容量,减少扩容的次数,进一步提高性能 有意识的设置初始化容量
3.set集合
- set集合的基本特点
- 容器中不会出现重复的元素(如果有一个元素在添加一个同样的元素就会把前面的元素覆盖掉)
- set集合是无序的相较于list集合是没有下标的(没有顺序的)
- set集合底层去重原理
1.hashset底层去重,与hashCode、equals方法相关 2.是优先对比hashCode值在对比equals值,当hashCode值相同,并且equals返回的值是true,则判定为重复元素 2.1 hashCode值不相同,就不会调用equals方法进行比较了 2.2 hashCode值相同,就调用equals方法
- 集合怎么进行排序
- 需求1:按照名字的首字母进行排序输出 treeset和hashset相比treeset是可以进行排序的
使用treeset集合进行排序必须实现Comparable接口
- 需求2:排序的元素不是String,而是对象Person
得到的结论:treeset中的元素想要进行排序,那么必须实现java.lang.Comparable接口 - 需求3:针对不同的模块,有不同的排序规则,相互之间互不干扰,针对于同一批数据
4.map集合
- map集合的特点以及遍历方式
- 保存的方式是键值对的形式存在
- map的key是可以为null的
- 修改 本质上就是通过(键值对)键key对应的值value的覆盖来实现 说白了就是把原来的值覆盖掉了
遍历
Set<String> key = map.keySet();
for (String str : key) {
System.out.println("当前的key为: "+str+" 对应的值为: "+map.get(str));
}
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));
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);
Arrays.sort(str, (x,y) ->y.compareTo(x));
System.out.println(Arrays.toString(str));
|