JavaSE知识总结之集合和多线程

本文详细介绍了Java中的集合框架,包括ArrayList、Vector和LinkedList的特点及线程安全性,以及HashSet和List的去重策略。此外,讨论了final、finalize和对象的生命周期,讲解了TreeSet的排序方式、Map的使用、Collections工具类的方法。还涵盖了异常处理,如throws和throw的区别,自定义异常以及异常注意事项。最后深入探讨了多线程相关概念,如join()、yield()、线程池和同步机制。
摘要由CSDN通过智能技术生成

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值