Java基础知识点

本文详细介绍了Java中的集合框架,包括List、Queue、Set和Map,以及各种实现类的特点和应用场景。此外,还讨论了异常处理的概念、分类和处理方式。接着,解释了反射机制,包括其概念、应用和相关API的使用。最后,提到了注解的基本概念、元注解以及注解处理器的作用。
摘要由CSDN通过智能技术生成

1集合

Java的集合类被定义在Java.util包中,主要有4种集合,分别为LIst,Queue,Set,Map,每种集合的具体分类如下:

1.1List:可重复

List是非常常用的数据类型,是有序的Collection,一共有三个实现类,分别是ArrayList,Vector和LinkedList。

1.Array List :基于数组实现,增删慢,查询快,线程不安全

array list是使用最狂饭的List实现类,其内部数据结构基于数据组实现,提供了对List的增加(add),删除(remove)和访问(get)功能。

ArrayList的缺点是元素必须连续存储,当需要在ArrayList的中间的位置插入或者删除袁术是,需要将待插入或删除的节点后的所有元素进行移动,其修改代价较高,

因此,Array List不适合随机插入和删除的操作,更适合随机查找和遍历的操作

Array List不需要在定义时指定数组的长度,在数据长度不能满足存储要求时,Array List会创建一个新的更大的数组并将数据种已有的数据复制到新的数组中。

2.Vector:基于数组实现,增删慢,查询快,线程安全

Vector的数据结构和ArrayList一样,都是基于数组实现的,不同的是Vector支持线程同步,及同一时刻只允许一个线程对Vector进行写操作(新增,删除,修改),以保证多线程环境下数据的一致性,但需要频繁地对Vector实例进行加锁和释放锁操作,因此,Vector的读写效率上比ArrayList低。

3.linkedList:基于双向链表实现,增删快查询慢,线程不安全

LinkedList采用双向链表结构存储元素,在对LinkedList进行插入和删除操作时,只需要在对应的节点上插入或 删除元素,并将上一个节点元素的下一个节点的指针指向该节点即可,数据改动较小,因此随机插入和删除效率很高

但在对Linked List进行随机访问时,需要从链表头部一直遍历到该节点为止,因此随机访问速度很慢。

除此之外,LinkedList提供了在List接口中未定义的方法,用于操作链表头部和尾部的元素,因此有时可以被当作堆栈和队列使用

1.2Queue

queue是队列结构,Java中常用队列如下:

ArrayBlockingQueue:基于数组数据结构实现的有界阻塞队列

LinkedBlockingQueue:基于链表数据结构实现的有界阻塞队列

PriorityBlockingQueue:支持优先级排序的无界阻塞队列

DelayQueue:支持言辞操作的无界阻塞队列

SynchronizedQueue:用于线程同步的阻塞队列

LinkedTransferQueue:基于链表数据结构实现的无界阻塞队列

LinkedBlockingDeque:基于链表数据结构实现的双向阻塞队列

1.3Set:不可重复

Set的核心特性是独一无二,使用与存储无序且值不相等的元素。

对象的相等性在本质上是对象的Hash Code值相同,Java依据对象的内存地址计算出对象的HashCode值。

如果想要比较两个对象是否相等,则必须同时覆盖对象的hashCode方法和equals方法,并且hashCode方法和equals方法的返回值必须相同。

1.HashSet:HashMap实现,无序

HashSet存放的是散列值,他是按照元素的散列值来存取元素的。

元素的散列值是通过元素的HashCode方法计算得到的,HashSet首先判断两个元素的散列值是否相等,如果散列值相等,则接着通过equals方法比较,如果equals方法返回的结果也为true,HashSet就将其是为同一个元素;如果equals方法返回的结果为false,HashSet将其视为不同的元素。

2.TreeSet:二叉树实现

TreeSet基于二叉树的原理对新添加的对象按照指定的顺序排序(升序,降序),每添加一个对象都会进行排序,并将对象插入二叉树的指定位置 。

Integer和String等基础对象类型可以直接根据TreeSet的默认排序精选存储,而自定义的数据类型必须实现Comparable接口,并且覆写其中的compareTo函数才可以按照预定义的顺序存储。

若覆写compare函数,则在升序时在this.对象小于指定对象的条件下返回-1,在降序时在this.对象大于指定对象的条件下返回1.

3.LinkedHashSet:继承HashSet,HashMap实现数据存储,双向链表记录顺序

Linked Hash Set在底层使用LinkedHashMap存储元素,它继承了HashSet,所有的方法和操作都与Hash Set相同,因此LinkedHashSet的实现比较简单,只提供了4个构造方法,并通过传递一个标识参数调用父类的构造器,在底层构造一个LinkedHashMap来记录数据访问,其他相关操作与父类HashSet相同,直接调用父类HashSet的方法即可。

4Map

1.HashMap:数组+链表存储数据,线程不安全

HashMap基于键的HashCode值为一标识一条数据,同时基于键的HashCode值进行数据的存取,

因此可以快速地更新和查询数据,但其每次遍历的顺序都无法保证相同。

HashMap的key和value允许为null。

HashMap是非线程安全的,即在同一时刻有多个线程同时写HashMap时将可能导致数据的不一致。

如果需要满足线程安全的条件,则可以用Collections的synchronizedMap方法时HashMap对线程安全的能力,或者使用ConcurrentHashMap。

HashMap数据结构,其内部是一个数组,数组中的每个元素都是一个单项链表。

链表中的每个元素都是嵌套类Entry的实例,Entry实例包含4个属性:key,value,hash值和用于指向单向链表下一个元素的next。

在这里插入图片描述

HashMap常用的参数:

capacity:当前数组的容量,默认为16,可以扩容,扩容数组大小为当前的两倍。

loadFactor:负载因子,默认为0.75。

threshold:扩容的阈值,其值等于capacity*loadFactor

HashMap在查找数据时,根据HashMap的Hash值可以快速定位到数组的具体下标,

但是在找到数组下标后需要对链表进行顺序遍历直到找到需要的数据,时间复杂度为O(n)

为了减少遍历的开销,Java8对HashMap进行了优化,将数据结构修改为数组+链表或红黑树。

在链表中的元素超过8个以后,HashMap会将链表结构转换为红黑树结构,以提高查询效率,

因此其时间复杂度为O(log N)。

在这里插入图片描述

2.ConcurrentHashMap:分段锁实现,线程安全

与Hash Map不同。ConcurrentHashMap采用分段锁的思想实现并发操作,因此线程是安全的。

Concurrent Hash Map有多个Segment组成(Segment的数量也是锁的并发度),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值