目录
所有的案例有需要详细的案例代码的链接:
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有哪些区别
-
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);
遍历:第三种遍历方式我使用了:迭代器(等会我会把所有案例的代码下载连接放在最后面)
-
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的覆盖来实现 说白了就是把原来的值覆盖掉了
遍历
//遍历
//方式一:通过先获取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));//使用这种方法可以输出集合内容