重写(Override) 是指子类对父类方法的一种重写,只能比父类抛出更少的异常,访问权限不能比父类的小,被重写的方法不能是 private 的,否则只是在子类中重新定义了一个新方法。
我们可以理解为将从父类中继承出来的方法进行了内容的修改,体现了多态的特点。
重载(Overload) 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同。参数不同体现在 参数类型不同、参数个数不同、参数顺序不同 三个方面。
首先我们要明确一点:List和Set存储单列数据,Map存储键值对这样的双列数据
list是我们最常用到的一类集合,list主要有三个实现类:
ArrayList
ArrayList 是我们常说的顺序表,他的底层实现是数组,因此他的查找快、效率高,支持下标查找,但是由于底层是数组,插入删除操作略显繁琐。
LinkedList
LinkedList 是我们常说的链表,他的底层实现是链表,因此他的存储是散列的,对空间要求不高,但是由于指针的存在,需要额外占用一部分空间作为指针;
LinkedList 实现了 List 和 Deque 接口,一般称为双向链表;
插入删除操作快,但是查找方面只能进行遍历查找,查找速度慢;
Vector
Vector是我们常说的容器,他的底层实现也是数组,因此他拥有和ArrayList类似的特性; 但是值得注意的是 他是三者中唯一一个线程安全的。
Map类有四个实现类:
HashMap
hashmap是我们最常用的map类,他是基于hash表实现的,key,value 都支持 null值,但是鉴于key的唯一性,key最多只能有一个null值;
hashmap是非线程安全的。
HashTable
hashtable是线程安全的,因为他给自己加了一把锁,但是由于为了确保线程安全,不得不牺牲部分效率。
hashtable的键值对均不支持 null值
ConcurrentHashMap
最为常用的线程安全的hashmap,它结合了 HashMap 和 HashTable 二者的优势。
ConcurrentHashMap 锁的方式是稍微细粒度的。 ConcurrentHashMap 将 hash 表分为 16 个桶(默认值),诸如get,put,remove 等常用操作只锁当前需要用到的桶。因此效率有了很大的提升(但是还是比非线程安全的hashmap慢)
TreeMap
TreeMap,能够把它保存的记录根据键排序,默认是键值的升序排序。
set接口我们常用的就是HashSet、TreeSet
HashSet 底层是由 HashMap 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hash Code()方法;
TreeSet 能够把它保存的记录根据值排序,默认是值的升序排序。不允许出现 null值,可以通过实现 Java.util.Comparator< Type >接口来自定义排序方式。
== 对于基本数据类型 比较的是 数据;但是对于引用类型 对比的是引用地址;
equals() 无论是基本数据类型还是引用数据类型,比较的是对应的具体数据。