List集合三个子实现类的特点
ArrayList
底层数据结构是数组,查询快,增删慢
从线程角度:线程不安全的,不同步的-----执行效率高!
Vector
底层数据结构是数组,查询快,增删慢
线程角度:线程安全----同步的------执行效率低(可变因子)
LinkedList
底层数据结构是链接列表,查询慢,增删快
线程角度:线程不安全的----不同步的-----执行效率高!
HashSet集合存储自定义对象如何去重
不重复的,能够保证元素唯一,不能保证迭代顺序恒久不变!
HashSet
HashSet的添加功能add---->HashMap集合put方法
hashCode()和equals方法
对于自定义对象所在的类必须重写hashCode()和equals方法()
List集合存储自定义对象如何去重
本身:可重复的,存储和取出一致
List
使用新集合的思想:使用新集合判断元素是否包含在该集合中!
contains()方法---->底层依赖于equals方法()
List:自定义对象所在类重写equals()方法/重写hashCode()
集合和数组,StringBuffer的区别
三者都是容器
StringBuffer:存储的可变的字符序列(构造字符串缓冲区),最终是以"字符串"展示
线程角度:是一个线程安全的,同步----执行效率低---->单线程程序中,使用StringBuilder替代StringBuffer
集合:单例集合(Collection)
长度可变,可以存储任意类型的元素,它只能引用数类型
数组:
长度固定同一种类型的元素,它可以存储基本类型/引用类型
应用场景:大部分时候会使用集合去操作!
查询所有/查询一些部分数据----存储到集合中List
集合的遍历方式
Object[] toArray
Collection的迭代器:Iterator iterator()
List列表迭代器:ListIterator listiterator()
size()和get(int index)相结合,普通for循环
增强for循环:替代迭代器,简化书写格式:foreach语句 (推荐)
final,finalize的区别
final:状态修饰符,修饰类,该类不能被继承
修饰变量,此时变量是常量
修饰成员方法,该方法不能被重写
finalize:是Object类中方法,主要用来开启垃圾回收器,会调用finalize()方法,
回收没有更多引用的对象(和GC有关系!)
TreeSet集合
本质基于TreeMap的底层实现(红黑树结构---->自平衡"的二叉树结构")
public TreeSet():默认的自然顺序排序
由于TreeSet属于Set集合(本身保证元素唯一,不重复的元素!),还可以将元素按照自然顺序排序
有两种排序方式:
**自然排序:**
要实现自然排序,必须实现接口:Comparable
重写Comparable接口中的compareTo方法
源码分析:
interface Collection{
}
interface Set extends Collection{
}
class TreeSet implements Set{
//成员位置
private transient NavigableMap<E,Object> m;
public boolean add(E e) {
//20,18,24,17,16,23,22,24
return m.put(e, PRESENT)==null;
}
}
interface NavigableMap<K,V> extends Map<K,V>{
V put(K key, V value);
}
//Entry<K,v>实现了接口:Map.entry<K,V>:键值对对象,以一种内部类的方式出现在TreeMap集合汇总
//将put进行重写
public class TreeMap<K,V> implements NavigableMap<K,V>{
public V put(K key, V value) {
//key =20,18,24,17,16,23,22,24
Entry<K,V> t = root; //root---->是一个键对对象 (根节点)
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
int cmp;
Entry<K,V> parent; //parent:是一个父节点
// spl