集合框架:
单列集合Collection
List:有序(存取一致),可重复
ArrayList:底层数据结构是数组,查询快,增删慢。线程不安全,效率高。
Vector:底层数据结构是数组,查询快,增删慢。线程安全,效率低。
LinkedList:底层数据结构是链表,增删块,查询慢。线程不安全,效率高。
Set:无序,唯一。
HashSet:底层数据结构是:哈希算法。线程不安全,效率高。
依赖于两个方法: hashCode() equals();
TreeSet:底层数据结构是:二叉树。线程不安全,效率高。
自然排序:
Comparable, compareTo();
比较器接口:
Comparator, compare();
双列集合Map
HashMap 底层数据结构是:哈希算法。线程不安全,效率高。
怎么保证键唯一性?
依赖于两个方法: hashCode() equals();
TreeMap 底层数据结构是:二叉树。线程不安全,效率高。
怎么保证键唯一性的?
自然排序:
Comparable, compareTo();
比较器接口:
Comparator, compare();
如何选择使用哪种集合?
看需求,看是否是单列
是:用Collection
看是否唯一:
是:用Set
是否需要排序:
是:TreeSet
否:HashSet
需求不明确,用 HashSet
否:用List
看是否考虑同步
是:Vector
否:
看查询多还是增删多:
查询多:ArrayList
增删多:LinkedList
需求不明确,用ArrayList
否:Map
是否需要排序:
是:TreeMap
否:HashMap
需求不明确,用HashMap
面试题:
题目一:Map接口和Collection接口有什么不同?
Map:双列集合的顶层接口,键具有唯一性,数据结构只针对键有效。
Collection:单列集合的顶层接口,它的子体系Set具有唯一性,数据结构是针对于元素有效。
题目二:字符串,数组,集合如何获取长度?
题目三: HashMap 和 Hashtable 的区别?
HashMap: JDK1.2以后出现的;线程不安全,效率高;可以存null值和null键。
Hashtable:JDK1.0以后出现的;线程安全,效率低;不可以存null值和null键。
相同点:底层都是哈希算法,都是双列集合。
题目四: TreeSet 和 HashSet 是怎么保证元素的唯一性的。
Map中的成员方法:
添加:
put();
删除:
remove();
clear();
判断:
containsKey();
containsValue();
isEmpty();
获取:
get();
keySet();
values();
Set<键值对对象的类型> entrySet(); //获取所有 键值对对象 的集合。
//Set< Map.Entry<String,Integer> > entrySet();
长度:
size();
Map集合如何遍历: //今天的重点,必须掌握
张三,23
李四,24
王五,25
第一种:
根据键找值。
思路:
A:获取所有键的集合。 //keySet();
B:遍历键的集合,获取到每一个键。 //迭代器,增强for
C:根据键找值。 //get()
第二种:
根据键值对找 键和值。
A:获取所有键值对对象的 集合。 entrySet();
B:遍历键值对对象的集合,获取到每一个键值对。 //迭代器,增强for
C:根据键值对对象来获取 键 和 值。 //getKey() getValue();
LinkedHashMap : 有序。
Collections:
public static void sort(List list);
public static int binarySearch(List list,K key); //如果找不到,返回值是: 负的插入点减一( -插入点-1 )
public static V max(Collection coll);
public static void reverse(List list);
public static void shuffle(List list); //随机置换,相当于洗牌
工具类的两个特性:
A:构造方法私有化。
B:成员基本上都是静态的。
注意:泛型一般和集合结合使用。
泛型高级:
? extends E : 固定上边界(向下限定)
E类及其子类
? super E : 固定下边界(向上限定)
E类及其父类
练习题: //中午把这些题都做一次,第三次选做(下午会讲)
题目一:练习Map集合的第一种遍历方式(通过键找值)
HashMap<String,Integer> hm = new HashMap<>(); //创建集合对象
hm.put("瑞文",18); //往集合中添加元素
hm.put("德邦",25);
hm.put("德玛",40);
//遍历集合,第一种方式:键找值
for(String s : hm.keySet() ) { //获取所有键的集合,然后遍历键集合,获取到每一个键
System.out.println(s + "***" + hm.get(s)); //根据键找值
}
//遍历集合,第二种方式:通过 键值对对象 找键和值
//代码自行补全
题目二:统计字符串中每个字符出现的次数。
题目三:
双元课堂有很多基础班:
第88期基础班定义成一个双列集合,键是学生对象,值是学生的归属地
第99期基础班定义成一个双列集合,键是学生对象,值是学生的归属地
无论88期还是99期都是班级对象,所以为了便于统一管理,把这些班级对象添加到双元课堂集合中。
解题核心关键点:
A:双元课堂集合的 定义。
HashMap<HashMap<Student,String>,String> hm = new HashMap<>(); //双元课堂集合
B:双元课堂集合的 遍历。
增强for的嵌套
代码示例:
HashMap<Student,String> hm88 = new HashMap<>(); // 班级集合
hm.add(new Student("张三",23),"四川");
HashMap<Student,String> hm99 = new HashMap<>(); // 班级集合
hm.add(new Student("皇子",23),"北京");
HashMap<HashMap<Student,String>,String> hm = new HashMap<>(); //双元课堂集合
hm.put(hm88,"第88期基础班"); //把班级集合 当做是一个键,添加到 双元课堂集合中
hm.put(hm99,"第99期基础班");
题目四:模拟斗地主发牌。
思路:
A:买牌。
B:洗牌。
C:发牌。
D:看牌。
|