韩顺平老师的零基础30天学java的课程总结
目录
一、Set接口及常用方法
1.Set接口的基本介绍
(1)无序(添加和取出的顺序不一致),没有索引。
(2)元素不重复。(只能有一个null)
(3)Set接口也实现了Collection接口。
其以下的常用子类有HashSet和TreeSet。HashSet的子类有LinkedHashSet。
2.Set接口的常用方法
Set接口也是Collection的子接口,因此常用方法和Collection一样。
3.Set接口的遍历方式
1.增强for。
2.迭代器。
3.不能通过索引方式来获取。
如:
Set set = new HashSet();
//1.add添加
set.add("john");
set.add("lucy");
set.add("john");
set.add("jack");
set.add("audrey");
set.add("Cline");
set.add(null);
set.add(null);
//System.out.println("set=" + set);//无序,不重复。
//2.这里的无序指添加和取出的顺序不一致,但取出的顺序却是固定的,只要取出的是这个顺序,下次运行还是这个顺序。
//for (int i = 0; i < 10; i++) {
// System.out.println("set="+set);
// }
//3.remove删除
set.remove(null);
//4.contains查找-根据key值.
System.out.println(set.contains("Cline"));
//5.isEmpty判断是否为null
System.out.println(set.isEmpty());
//6.遍历
System.out.println("=====使用迭代器=====");
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println("set="+next);
}
System.out.println("======增强for循环=====");
for (Object o :set) {
System.out.println("o="+o);
}
没有set方法修改。
二、Set接口的实现类-HashSet
1.HashSet的全面说明
(1)HashSet实现了Set接口。
(2)HashSet底层实现的是HashMap。
(3)HashSet不能有重复的对象/元素,所以只能存放一个null值。
(4)HashSet不保证元素有序,元素会先计算hash值,再计算索引。
2.HashSet不能加入相同数据的真正含义
HashSet的底层是HashMap,HashMap的底层是(数组+链表+红黑树)
add方法进行添加时,
1.会先根据传入的key值(对象)计算hash值,然后通过hash得出一个索引值。
2.然后找到存储数据表table,看该索引处是否为null,如果是null就直接添加,如果不是就通过equals进行比较。
3.如果equals为true就放弃添加,如果为false就添加到后面。
(String类及基本数据类型的内容相同的对象的hash值是一样的。)
如:
set.add("abc");
set.add("abc");
set.add(1);
set.add(1);
只要一个abc和1能添加成功。
3.分析HashSet的扩容和转成红黑树机制
如果一条链上已经有8个对象,此时还要向链上添加,就要看该数组的大小是不是到64个,如果没到64就会进行扩容,如果到64,就会将这条链转化成红黑树。
三、接口的实现类-LinkedHashSet
1.LinkedHashSet的全面说明
(1)LinkedHashSet是HashSet的子类
(2)底层是LinkedHashMap,维护了一个数组+双向链表
(3)添加顺序和取出顺序一致(使用hash值决定了元素的存储位置,使用双向链表维持了元素的次序。)
(4)LinkedHashSet不允许添加重复元素。
2.LinkedHashSet的底层机制说明
四、TreeSet
介绍
(1)当用无参构造器构建时,仍是无序的。
(2)可以通过传入一个比较器对象Comparator实现定制排序。(如通过字符的大小,通过字符串的长度。)
(3)TreeSet的底层是TreeMap。
如:
//1.默认构造器不会有序
// TreeSet treeSet = new TreeSet();
//2.有参,传入比较器对象,实现定制排序
TreeSet treeSet = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//1.通过字符的大小进行排序
return ((String)o1).compareTo((String)o2);
//2.通过字符串的长度
// return ((String)o2).length()-((String)o1).length();
}
});
//添加数据
treeSet.add("jack");
treeSet.add("tom");
treeSet.add("sp");
treeSet.add("a");
System.out.println("treeSet="+treeSet);