面试-java基础

    1、List 和 Set 的区别
 
1.1    list是有序集合(容器)且元素可以重复,输出顺序就是插入顺序;Set是无序集合且元素不可以重复。
1.2    list可以存放多个null;set只可以存一个null
1.3     常用list有ArrayList,LinkedList,vector;
  •      ArrayList
  • 优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
  • 缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。
  • LinkedList
  • 优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势LinkedList 适用于要头尾操作或插入指定位置的场景
  • 缺点:因为LinkedList要移动指针,所以查询操作性能比较低。
  • 适用场景分析:
  •  当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。
  • vector
  • ArrayList和Vector都是用数组实现的,主要有这么三个区别:
 
  • 1.Vector是多线程安全的,线程安全就是说多线程访问同一代码,不会产生不确定的结果。而ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;
  • 2.两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同。
  • 3.Vector可以设置增长因子,而ArrayList不可以。
  • 4.Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
 
  •     常用的set有HashSet,LinkedSet,Treeset,[简单介绍]
  • HashSet
  • .HashSe哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束 
  • HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例
  • 适用场景分析:HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。为快速查找而设计的Set,我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。
  • LinkedSet
 
  • Treeset
  • TreeSet 二差树(红黑树的树据结构)实现的,Treeset中的数据是自动排好序的,不允许放入null值 
1.4    [应用场景]
    1.如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。
    2.如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。
    3.如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。
    4.如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。
    
    
 
注意:
LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。
 
扩展:
HashMap 非线程安全  
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。 
 
TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。 
 
适用场景分析:
HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允许空键值,而HashTable不允许。
HashMap:适用于Map中插入、删除和定位元素。 
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。 
 
 
 
2、HashSet 是如何保证不重复的 
3、HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全)? 
4、HashMap 的扩容过程 
5、HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的?
6、final finally finalize
7、强引用 、软引用、 弱引用、虚引用
8、Java反射 9、Arrays.sort 实现原理和 Collection 实现原理
10、LinkedHashMap的应用 
11、cloneable接口实现原理 
12、异常分类以及处理机制
13、wait和sleep的区别 
14、数组在内存中如何分配
 
参考:
  • 比较好的参考关于list,set
https://blog.csdn.net/qq_22118507/article/details/51576319
 
 
 
 
 
 
*************************************************
一:List接口
    1.List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素
 
ArrayList:
    1.ArrayList是一个动态数组,也是我们最常用的集合,初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加
    2.ArrayList擅长于随机访问。同时ArrayList是非同步的
 
LinkedList
    1.LinkedList是一个双向链表,除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部
    2.LinkedList不能随机访问,LinkedList也是非同步的
    
Vector
    1. 与ArrayList相似,但是Vector是同步的。所以说Vector是线程安全的动态数组。它的操作与ArrayList几乎一样。
    
Stack
    1.Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
    
二:Set接口
    1.Set是一种不包括重复元素的Collection,Set接口有三个具体实现类,分别是散列集HashSet、链式散列集LinkedHashSet和树形集TreeSet。
    
HashSet
    1.HashSet 是一个没有重复元素的集合。它是由HashMap实现的不保证元素的顺序;HashSet是非同步的
    2.HashSet的实现方式大致如下,通过一个HashMap存储元素,元素是存放在HashMap的Key中,而Value统一使用一个Object对象
 
LinkedHashSet  
    1. LinkedHashSet继承自HashSet,有序,非同步
TreeSet
    1.TreeSet是一个有序集合,其底层是基于TreeMap实现的,非线程安全
    
三:Map接口
HashMap
    1.以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,它是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry的源码它是一个单链表结构。
LinkedHashMap
    1.
TreeMap
    1.TreeMap 是一个有序的key-value集合,非同步基于红黑树(Red-Black tree)实现,每一个key-value节点作为红黑树的一个节点。TreeMap存储时会进行排序的,会根据key来对key-value键值对进行排序,其中排序方式也是分为两种,一种是自然排序,一种是定制排序,具体取决于使用的构造方法
参考:
https://www.cnblogs.com/xiaoxi/p/6089984.html

猜你喜欢

转载自www.cnblogs.com/youdream/p/8926270.html