第23次(容器)
学习主题:容器
学习目标:
1. 掌握Vector,以及与ArrayList的区别
2. 掌握Map接口下的HashMap和HashTable
对应视频:
/course/id/85.html
对应作业:
1.Vector用法和ArrayList区别
(1) Vector的特有方法有哪些?
答:public void addElement(E obj)//将指定的组件添加到此向量的末尾
public E elementAt(int index)//返回指定索引处的组件
public Enumeration<E>elements()//返回此向量的组件的枚举
(2) Vector与ArrayList的区别是什么?
答:需要线程安全时,使用Vector。不存在线程安全问题时,并且查找较多时用ArrayList。
2.Map接口_HashMap_Hashtable的用法详解
(1) Map接口常用的方法有哪些?
(2) HashMap与Hashtable的异同是什么?
答:HashMap采用哈希算法实现,是Map接口岁常用的实现类。由于底层采用了哈希表存储数据,要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。
而HashTable类和HashMap用法几乎一样,底层实现几乎一样,但是HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低。
HashMap: 线程不安全,效率高。允许key或value为null。
HashTable: 线程安全,效率低。不允许key或value为null。
3.HashMap的底层原理
(1) HashMap的底层数据结构是什么?
答:哈希表
(2) 简述哈希表的去重原理?
答:如果对应的位置有Node,Node是一个链表结构。然后比较链表的第一个元素,比较方式使用的是p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))),hash值相等,并且key是同一个或者equals的时候才认为是相同。如果相同,记为e
第24次(容器)
学习主题:容器
学习目标:
1 掌握二叉树和红黑树
2 掌握TreeMap
3 掌握Set接口下的HashSet和TreeSet
4 掌握泛型
对应视频:
/course/id/85.html
对应作业
1.二叉树和红黑树
(1) 简述树的概念和特征?
答:树(Tree)是n(n>=0)个结点的有限集:,n=0时称为空树,树的概念即递归定义。
1:有且仅有一个特定的称为根(root)的结点。
2:当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1,T2,...,Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)
(2) 什么样的树被称为红黑树?
答:一种特定类型的二叉树,用于实现关联数组
2.TreeMap的使用和底层实现
(1) TreeMap的常用构造方法有哪些?
答:1://无参构造方法,没有指定比较器,这时,节点顺序依赖于对key的自然排序
public TreeMap(){
Comparator = null;
}
2://指定比较器的构造方法,这时,节点顺序依赖于该比较器
public TreeMap(Comparator<? super K>comparator){
parator = comparator;
}
3://根据其他Map来创建TreeMap,没有指定比较器
public TreeMap(Map<? extends K,extends V>m){
Comparator = null;
putAll(m);
}
4://根据其他SortedMap来创建TreeMap,比较器设置为SortedMap所用的比较器
public TreeMap(SortedMap<K,?Extends V>m){
Comparator = parator();
Try{
buildFromSorted(m.size(),m.entrySet().iterator(),null,null);
}catch(java.io.IOException cannotHappen){
}catch(ClassNotFoundException cannotHappen){
}
}
(2) TreeMap的底层数据结构是什么?
答:红黑树。
3.Set接口_HashSet的用法
(1) Set集合存储元素的特征?
答:无序。不可重复只能放入一个null元素
(2) Set接口常用的子类有哪些?
答:HashSet/TreeSet
4.HashSet底层实现_JDK源码分析
(1) HashSet的底层数据结构概念?
答:HashSet的底层数据结构是哈希表
(2) HashSet与HashMap的关系?
答:HashSet是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高
5.TreeSet的使用_JDK源码分析
(1) TreeSet的底层数据结构是什么?在存储自定义元素时是通过什么方式去掉重复元素的?
答:红黑树,指定顺序,对象存入后会按照指定顺序排列。进行比较时equals返回true则去掉一个该元素
(2) TreeSet集合的特点?
答:TreeSet内部需要对存储的元素进行排序,因此对应的类需要实现Comparable接口才能根据compareTo()方法比较对象之间的大小,才能进行内部排序,如果要放入TreeSet中的类没有实现Comparable接口,则会抛出异常:java.lang.ClassCastException。
TreeSet中不能放入null元素
6.泛型
(1) 为什么需要泛型?使用泛型的好处有哪些?
答:为了更好地使用容器,泛型可以帮助建立类型安全的集合,在使用了泛型的集合中,遍历是不必进行强制类型转换。JDK提供了支持泛型的编译器,将运行时的类型检查提前到了编译时执行,提高了代码可读性和安全性。
(2) 泛型分几类,分列举例说明?
答:1:泛型类:把泛型定义在类上。
public class ObjectTool<T>{
private T obj;
public T getObj(){
return obj;
}
public void setObj(T obj){
this.obj = obj;
}
}
2:泛型方法:把泛型定义在方法上
public class ObjectTool{
public<T> void show(T t){
System.out.println(t);
}
}
3:泛型接口:把泛型定义在接口上
定义接口:
public interface Inter<T>{
public abstract void show(T t);
}
定义实现类:
public class InterImpl<T> implements Inter<T> {
@Override
public void show(T t) {
System.out.println(t);
}
}
4:泛型通配符:
A: ? : 任意类型,如果没有明确,那么就是Object以及任意的Java类了。
B: ? extends E : 向下限定,E只能是 E本身及其子类。
C: ? super E : 向上限定,E只能是 E本身及其父类。
7.泛型的高级使用_容器中使用泛型
(1) 泛型的高级应用分为哪两类?
答:extends和super
(2) 泛型的上限指的是什么含义,请举例说明?
答:泛型的上限:extends,限定父类。上限的应用场合:往集合当中加入元素
class Demo
{
public static void main(String[] args)
{
//泛型上限的使用
TreeSet<Student> ts1 = new TreeSet<>();
ts1.add(new Student("lisi",21));
ts1.add(new Student("zhaosi",24));
ts1.add(new Student("wangsi",20));
TreeSet<Worker> ts2 = new TreeSet<>();
ts2.add(new Worker("lisi",22));
ts2.add(new Worker("zhaosi",24));
ts2.add(new Worker("wangsi",28));
// TreeSet<E>
// TreeSet(Collection<? extends E> c)
//假如是Student类,<Studend extends Person>,其父类的对象也是可以存入的
TreeSet<Person> ts = new TreeSet<Person>(ts1);
TreeSet<Person> ts = new TreeSet<Person>(ts2);
System.out.println("Hello World!");
}
}