注解、集合和泛型(Java)
文章目录
Java注解面试题
注解是什么?
Annotation(注解)是Java提供的一种 对元程序中元素关联信息和元数据(metaData)的途径和方法 。Annotation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的Annotation对象,然后通过该Annotaion对象来获取注解中的 元数据信息 。
4中标准元注解是哪四种?
元注解的作用是负责注解其他注解 。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其他annotation类型作说明。
- @Target:标记这个注解应该是哪种Java成员。
- @Retention:标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
- @Documented:标记这些注解是否包含在用户文档中。
- @Inherited:标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)。
Java集合/泛型面试题
ArrayList和LinkedList的区别?
- ArrayList:基于动态数组实现,支持随机访问。
- LinkedList:基于双向链表实现,只能顺序访问,但是可以快速的在链表中插入和删除。此外,LinkedList还可以用作栈、队列和双向队列。
- LinkedList比ArrayList具有更好的插入和删除性能,但是查找性能要差。
HashMap和Hashtable的区别?
- 初始容量大小和每次扩容大小不同。
- 计算Hash值的方法不同。
- 安全性不同:HashMap是线程不安全的,而Hashtable是线程安全的。
- 对null的支持不同:HashMap的key允许存在null,但是Hashtable不允许。
- 对外提供的接口不同:Hashtable比HashMap多提供了elements()和contains()两个方法。其中element()返回此Hashtable中的value的枚举类;contains()用于判断Hashtable是否包含传入的value,实际上containsValue()方法就是调用了contains()方法。
- 两者的父类不同:HashMap继承于AbstractMap,而Hashtable继承于Dictionary。
Collection包结构和Collections的区别?
- Collections是集合类的一个帮助类,不能实例化,包含各种有关集合操作的静态多态方法,是一个工具类,服务于Java的Collection框架。
- Collection是集合类的上级接口,子接口有Set、List、Queue。
泛型常用特点?
- 不必因为添加元素类型的不同而定义不同类型的集合。
- 可以在具体执行的时候有具体的规则来约束。
- 泛型支持通配符。
List、Set和Map三者的区别?
- List:存储一组不唯一(不会有多个元素引用相同的对象)、有序的对象。
- Set:不允许重复的集合。不会有多个元素引用相同的对象。
- Map:使用键值对存储,Key不能重复。两个key可以引用相同的对象。
Array和ArrayList有什么不一样?
Array和ArrayList都是用来存储数据的集合。ArrayList底层是使用数组实现的,但是ArrayList对数组进行了封装和扩展,拥有许多原生数组没有的一些功能。ArrayList是Array的一个升级版。
Map有什么特点?
- 以键值对存储数据。
- 存储的元素是无需的。
- key不允许重复。
集合类存放于java.util包中,主要有几种接口?
- Collection:是集合List、Set和Queue的最基本的父接口。
- Iterator:迭代器,可以通过迭代器遍历集合中的数据。
- Map:是映射表的基础接口。
什么是List接口?
List是Java中非常常用的数据类型,是有序的集合,List一共有三个实现类:ArrayList、Vector和LinkedList。
说说ArrayList?
ArrayList是最常用的List实现类,内部是基于动态数组实现,支持随机访问,缺点是每个元素之间不能有间隔,当数组大小不足需要增加存储能力时,需要将已有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时候,需要对数组进行复制、移动,代价较高,因此ArrayList适合随机查找和遍历,不适合插入和删除。
说说Vector?
Vetor和ArrayList类似,都是通过数组实现的,但是它支持线程同步,因此访问Vector也比ArrayList慢。
说说LinkedList?
LinkedList是用链表存储数据的,很适合数据的动态插入和删除,但是随机访问和遍历比较慢,此外LinkedList可用作栈、队列和双向队列。
什么是Set集合?
Set集合注重独一无二的性质,该体系集合用于存储无序元素,值不能重复。判断两个对象是否相等是通过对象的equals()方法来判断的,一般此方法需要保证相同的对象其hashCode也相同。
说说HashSet?
HashSet存储元素的顺序不是按照存入的顺序来存储的,而是按照HashCode来存储的,所以取数据也是按照HashCode来取数据的。HashSet不允许存入相同的元素,判断两个元素是否相同的依据是equals()方法是否为true,如果为true就是代表同一个元素,不允许存入,否则允许存入,如果允许存入,碰到两个元素的hashcode相同,就将元素放在同一个Hash桶中,也就是一个HashCode位置上允许存放多个元素。
什么是TreeSet(二叉树)?
- TreeSet是按照二叉树的原理对新添加的元素按照指定的顺序排序,没增加一个对象都会进行排序,将对象插入到二叉树指定的位置。
- Interger和String对象可以进行默认的TreeSet排序,但是自定义类型的对象不可以,自定义类型的对象必须实现Comparable接口的compareTo()方法,才能正常使用。
- 实现compareTo()方法时,比较此对象于指定对象的顺序时,如果compareTo()方法返回负整数、0、正整数,则代表该对象小于、等于、大于指定对象。
说说LinkedHashSet(HashSet+LinkedHashMap)?
对于LinkedHashSet而言,它继承于HashSet,又基于LinkedHashMap来实现。LinkedHashSet底层使用LinkedHashMap来存储数据,它基础HashSet,其所有操作方法操作上于HashSet相同。插入顺序是有序的。
说说HashMap(数组+链表+红黑树)?
- HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。
- HashMap最多允许一条key为null的记录,但是允许多条value为null的记录。
- HashMap是非线程安全的,如果需要满足线程安全,可以使用Collections的synchronizedMap()方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。
- HashMap使用拉链法解决hash冲突。
- 从Java8开始,一个桶存储的的链表长度大于等于8时会将链表转成红黑树。
说说HashTable(线程安全)?
Hashtable是一个遗留类(从其命名就可以看出,不遵循驼峰法),很多映射的常用功能与HashMap类似,不同的是它继承于Dictionary类,并且是线程安全的,但是并发性不如ConcurrentHashMap。Hashtable不允许存在key为null的元素。
说说TreeMap(可排序)?
TreeMap实现了SortedMap接口,能够把它保存的记录根据键排序,默认是按照键的升序配许,也可以指定排序的排序器。当使用迭代器遍历TreeMap时候,得到的是排过序的。在使用TreeMap时候,key必须实现Comparable接口或者在构造TreeMap时传入自定义的Comparator。
说说LinkedHashMap(记录插入排序)?
LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时候,先得到的记录是先插入的。也可以在构造LinkedHashMap时候带参数,按照访问次序排序。
说说泛型类?
泛型类除了在类名后面添加类型参数声明部分外,和非泛型类的声明都一致。泛型类的类型参数声明也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称之为一个类型变量,是一个用于指定一个泛型类型名称的标识符。因为泛型类接受一个或多个参数,因此这些类被称为参数化的类或者参数化的类型。
说说类型通配符?
类型通配符一般是使用?代替具体的类型参数。
说说类型擦除?
Java中的泛型基本上都是在编译器这个层次上来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上类型参数,会被编译器在编译的时候就去掉,这个过程就叫做类型擦除。类型擦除的过程就是首先找到用来替代类型参数的具体类,这个具体类一般是Object,如果制定了类型参数的上界的话,则使用这个上界,然后把代码中的类型参数都替换成具体的类。
文章作者 P1n93r
上次更新 2020-06-10