重载和重写
重写:重新写一遍,即子类继承父类,把父类方法重新实现,方法名、参数列表、返回类型相同,但方法访问修饰符比父类大,抛出异常比父类小
重载:方法名相同,参数不同,例参数顺序、参数个数、参数类型,返回值可同可不同,多态的表现
equals和==
==:比较是否是同一个对象,判断引用的地址是否相同;注意,如果是阿拉伯数字比较,值相等则为true
equals:继承父类Object
的方法,如果该对象没有重写该方法,那么就使用父类的,即比较值,注意,常量放在equals
前面,防止null
调用equals
方法,空指针
HashCode
问题:Set
如何去重,如果都用equals
方法比较,元素过多时,方法比较慢
解决:哈希码,根据哈希码分组,这样就知道每个对象对应那个区域,例:一个新元素添加进来,根据对象内存地址换算出来一个值(哈希码),然后找到对应存储区域,判断是否有元素,有则使用equals
比较,相同的话就不存
String、StringBuilder和StringBuffer
String:底层final
修饰的char[]
,即每次+"hello"
新元素,都会创建跟原字符串相同的StringBuilder
对象,然后调用append
方法
StringBuilder:底层char[]
,继承AbstractStringBuilder
,线程不安全
StringBuffer:底层char[]
,继承AbstractStringBuilder
,线程安全,对方法加了synchronized
ArrayList和LinkedList
Array
数组基于index
的数据结构,查询效率高,O(1),缺点:如果删除元素,则需要后面元素前移,数组创建必须知道容量
ArrayList.toArray()
方法变成数组,Arrays.asList()
变成List
ArrayList:容量自动增长的数组
LinkedList:底层双向链表,添加、删除效率高于ArrayList
,而set
或get
低于ArrayList
HashMap和HashTable
父类:HashMap
父类AbstractMap
,HashTable
父类Dictionary
方法:HashTable
多两个方法elements
、contains
,其中elements
继承父类的方法,返回所有value
,contains
判断value
是否存在
null
的支持:HashTable
不支持,HashMap
的key
只能有一个null
,保证key
唯一,而value
可以有多个null
安全性:HashTable
方法上有synchronized
,安全,而HashMap
不安全,支持单线程,效率比HashTable
高,HashTable
可以适用于多线程,但多线程情况下可以使用ConcurrentHashMap
,分段锁,不对整个数据锁定,效率比多线程下的HashTable
高
计算hash
值方法不同
初始容量大小和扩容大小不同