一、集合
二、集合的框架体系(必背)
主要分两大类(必背)
单双列集合的区别
三、Collection 方法
1、Collection 接口实现类的特点
注:list.add(10); 等价于list.add(new Integer(10)); 其余的同理
2、Collection 接口遍历元素方式1---使用Iterator(迭代器)
案例:
3、Collection 接口遍历元素方式2--- for 循环增强
注:增强 for 也可以用在数组上
底层依然是迭代器(可以理解为简单的迭代器)
四、List 接口和常用方法
注:list.subList();左闭右开
1、List 的三种遍历方式
2、ArrayList 的注意事项
3、ArrayList 的底层操作机制源码分析(重点、难点)(扩容机制)
注:transient 表示瞬间,短暂的,表示改属性不会被序列化
4、Vector 底层结构和源码分析
5、Vector 和 ArrayList 的比较
6、双链表模拟
-
LinkedList 底层结构
CRUD(增删改查)
7、ArrayList 和 LinkedList 比较
五、Set 接口和常用方法
1、Set 接口基本介绍
2、Set 接口的常用方法
注:Set接口的遍历方式
3、HashSet 全面说明
4、数组链表模拟(HashSet底层说明)
5、HashSet 扩容机制
练习:
public class HashSetExercise {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add(new Employee("milan",18));
hashSet.add(new Employee("smith",28));
hashSet.add(new Employee("milan",18));
System.out.println(hashSet);
}
}
/*
定义一个Employee类,该类包含:private 成员属性name,age 要求:
1、创建3个Employee对象放入HashSet中
2、当name和age的值相同时,认为是相同员工,不能添加到HashSet集合中
*/
class Employee{
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//如果name 和 age 值相同,则返回hash值
//重写 equal 和 hashcode方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return age == employee.age && Objects.equals(name, employee.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
6、LinkedHashSet
7、TreeSet 的使用
public class TreeSet_ {
public static void main(String[] args) {
//1、当我们使用午餐构造器创建 TreeSet 时,仍然是无序的
//2、希望添加的元素,按照字符串大小排序
//3、使用 TreeSet 提供的构造器,可以传入一个比较器(匿名内部类),并指定排序规则
//TreeSet treeSet = new TreeSet();
TreeSet treeSet = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//调用compareTo() 方法。让两个字符串相比较(默认是按照字符的大小比较的)
return ((String) o1).compareTo((String) o2);
}
});
//添加数据
treeSet.add("jack");
treeSet.add("tom");
treeSet.add("sp");
treeSet.add("a");
System.out.println(treeSet);
}
}
六、Map 接口和常用方法
1、Map 接口实现类的特点
2、Map 接口和常用方法
3、Map 六大遍历方式
//Map 六大遍历
@SuppressWarnings({"all"})
public class Map_ {
public static void main(String[] args) {
//Map的特点
Map map = new HashMap();
map.put("邓超", "孙俪");//第一个是key,第二个是 values
map.put("王宝强", "马蓉");
map.put("宋喆", "马蓉");
map.put("刘令博", null);
map.put(null, "刘亦菲");
map.put("鹿晗", "关晓彤");
//第一组:先取出 所有的key,通过key 取出对应的Value
Set keyset = map.keySet();
//(1)增强for
System.out.println("=====第一种方式:增强for循环=====");
for (Object key : keyset) {
System.out.println(key + "-" + map.get(key));
}
//(2)迭代器
System.out.println("=====第二种方式:迭代器=====");
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
//第二组:把所有的values取出
Collection values = map.values();
//这里可以使用所有的Collection使用的遍历方法
//(1)增强for循环
System.out.println("=====取出所有的value,增强for=====");
for (Object o : values) {
System.out.println(o);
}
//(2)迭代器
System.out.println("=====取出所有的value,迭代器=====");
Iterator iterator2 = values.iterator();
while (iterator2.hasNext()) {
Object value = iterator2.next();
System.out.println(value);
}
//第三组:通过 EntrySet 来获取 k-v
Set entryset = map.entrySet();//EntrySet<Map.Entry<K,V>>
//(1)增强for
System.out.println("=====使用EntrySet 的 for增强(第三种)=====");
for (Object entry : entryset) {
//将 entry 对象转成 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey()+"-"+m.getValue());
}
//(2)迭代器
System.out.println("=====使用EntrySet 的 迭代器(第四种)=====");
Iterator iterator3 = entryset.iterator();
while (iterator3.hasNext()) {
Object entry = iterator3.next();
//HashMap$Node -实现-> Map.Entry (getKey,getValue)
//System.out.println(entry.getClass());
//向下转型 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey()+"-"+m.getValue());
}
}
}
4、HashMap 小结
5、HashTable
HashMap 和 HashTable 对比
6、Properties
注:1、可以通过 k-v 存放数据,当然 key 和 value 不能为 null
2、Properties 继承 Hashtable
3、如果有相同的 key ,value 会被替换
7、TreeMap
public class TreeMap_ {
public static void main(String[] args) {
//使用默认的构造器
//TreeMap treeMap = new TreeMap();
//要求传入的 key(String) 的大小进行排序
TreeMap treeMap = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//要求传入的 key(String) 的大小进行排序
return ((String) o1).length() - ((String) o2).length();
//return ((String) o1).compareTo((String) o2);
}
});
treeMap.put("jack", "杰克");
treeMap.put("tom", "汤姆");
treeMap.put("kielil", "凯勒");
treeMap.put("smith", "斯密思");
System.out.println(treeMap);
}
}
七、总结-开发中如何选择集合实现类(记住)
八、Collections 工具类
public class Collections_ {
public static void main(String[] args) {
//创建ArrayList集合,用于测试
List list = new ArrayList();
list.add("tom");
list.add("smith");
list.add("king");
list.add("milan");
System.out.println(list);
//reverse():反转元素顺序
Collections.reverse(list);
System.out.println("=====反转=====");
System.out.println(list);
//shuffle():随机排序
Collections.shuffle(list);
System.out.println("=====随机排序=====");
System.out.println(list);
//sort():根据元素的自然顺序对指定List集合元素按升序排序
Collections.sort(list);
System.out.println("=====自然排序=====");
System.out.println(list);
//sort(list,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
// 按照字符串的长度大小排序
Collections.sort(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String) o1).length() - ((String) o2).length();
}
});
System.out.println("=====按照字符串的长度大小排序=====");
System.out.println(list);
//swap(list,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交谈
Collections.swap(list, 0, 1);
System.out.println("=====按照指定位置交换=====");
System.out.println(list);
//Object max(Collection):根据元素的自然顺序,返回给定集合中最大元素
System.out.println("自然顺序最大元素=" + Collections.max(list));
//Object max(Collection, Comparator):根据 Comparator 指定的顺序,返回给定集合中最大元素(min 同理)
//比如:我们要返回长度最大的元素
Object max = Collections.max(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String) o1).length() - ((String) o2).length();
}
});
System.out.println("长度最大的元素=" + max);
//int frequency(Collection, Object): 返回指定集合中指定元素的出现次数
System.out.println("tom出现的次数=" + Collections.frequency(list, "tom"));
//void copy(List dest, List src):将src中的内容复制到dest中
ArrayList dest = new ArrayList();
//为了完成一个完整的拷贝,我们需要先给dest 赋值,大小和 list.size() 一样大
for(int i=0; i<list.size(); i++){
dest.add("");
}
//拷贝
// Collections.copy(dest , list); 抛出索引越界的异常
Collections.copy(dest , list);
System.out.println("=====拷贝=====");
System.out.println("dest="+dest);
//boolean replaceAll(list list, Object oldVal, Object newVal):使用新值替换 List 对象的所有值
//如果list中,有tom就替换成汤姆
Collections.replaceAll(list,"tom","汤姆");
System.out.println("list替换后="+list);
}
}