1.集合类:list和Set比较,各自的子类比较(Arraylist,Vector,inkedLIst,HashSet,TreeSet)

List:存入元素有序,元素可以重复,允许null值得存在,主要有3个实现类

  linkedLIst:底层是双向链表,每一个结点都有指向前一个和后一个结点的指针。由于这种特性,他的特点就是增加和删除快,也因为他存储的元素在内存中不是连续存储,查找效率不及ArrayList

  ArrayList:底层是动态数组,所以他的查找效率更高,但是由于增加的删除会涉及到元素的大规模移动,所以增加和删除效率会比ListedList低。有一个情况就是在数组的尾结点增加和删除,由于不涉及数组元素移动,效率也挺高的,下来就是他是线程不安全的

    在多线程环境下,一个线程读,另一个线程写,会出现concurrentModifitionException,从而引起fail-fast机制。

  Vector:他是线程安全的,在一些方法上面加synchronized,保证线程安全,但是在多线程环境下,由于会出现阻塞,所以效率会特别低下,在多线程环境下,要想保证效率可以使用线程安全的List,比如CopyOnArrayList。

Set:他最大额特点就是:集合元素不可以重复出现,用hashcode和equals方法进行去重判断。由于采用hash散列结构,元素也是无序的。不允许出现null值。他主要有两个实现类。

  Hashset:他是按照散列结构进行存取的。所以存储效率比较高。(个人见解:他其实是对hashmap进行了一次封装。构造器中传入了一个hashmap)

  TreeSet:他内部要么对元素实现一个Comparator接口,对元素进行排序,他的实现也是基于TreeMap实现的。

2.HashMap的底层实现,之后会问ConcurrentHashMap的底层实现

  HashMap的底层实现原理:首先他的底层的数据结构是基于数组+链表实现的。这是hashmap1.7及其之前的在1.8中引入了红黑树。

    重点是他对数组的存取过程:首先他存的是一个键值对。调用get方法时:他首先会计算key的hashcode的值,然后调用hash函数方法进行高位运算,得到他的哈数值,进行indexFor方法的调用,确定他在数组的具体位置,具体实现是hash值与上数组长度-1,。在put时他会首先判断,在计算出来的那个数组下标位置处有没有元素的存在,如果没有就插入,如果有的话,也就是出现hash冲突,那么就以该数组结点作为头结点,遍历后面的元素。如果出现key相同的话,那么进行对应的此key的value的修改,返回旧值。如果遍历结果没有key相同的话,就会进行头插。

  下来就是说在插入的过程中可能会设计扩容的问题,就是hashmap实际存储的元素值大于最大的阈值,最大的阈值 = hashmap的初始容量 * 负载因子。一般情况下初始容量是16,负载因子是0.75,当然这个是可以变得。当出现这种情况,会把原来的数组长度变为员来的2倍。然后重进行key的hash计算,放到正确的位置上。

  1.8在此基础进行了几点优化。1.就是在插入元素>8的时候,后面的链表会转化为红黑树

  下来就是在进行高位运算的时候,处于对时间效率性能的考虑,1.7中计算hash值很复杂,进行三次亦或运算,在1.8中只进行一次 异或运算,异或上hash值 异或hash无符号右移16位。

  就是在扩容的时候,1.7要重新计算元素的hash值,1.8进行优化,优化的结果是比如 原先的很多元素在数组下表为5的位置,那么扩容后,这些元素要么在原位置,要么在原位置上+原先数组长度的位置上,极大提高的扩容效率。下来就是还有几个细节的地方我  记得好像onlyif什么的,我理解的这个就相当于一个标志位,在插入时,如果存在相同的key,如果这个标志位是ture,则可以进行覆盖,如果为false则不能进行覆盖。

再说他的get方法。在他进行get的时候,还是会进行hash运算和indexfor 的高位取模运算,确定他在数组中的下标位置,进行读取。

3.如何实现HashMap顺序存储:可以参考LinkedHashMap的底层实现
他有一个子类,就是LinkedHashMap,他可以保证元素在进行插入时的插入顺序。

4.HashTable和ConcurrentHashMap的区别
首先HashTable和Con都是线程安全的集合。
两者最大的区别就在于在对HashTable进行操作时,会锁住整张表,而Con引入了分段锁的概念,每一个段Segment是可重入锁,引入他的意义就在于 一个线程对这一段进行读操作的时候,其他线程也可以进行读操作但是不能进行写操作,在一个线程进行写操作时其他线程不能读也不能写。
就是说每一个Segment就相当于一个HahTable,线程对其进行操作不会锁住全表,只会锁住对应的Segment,提高了并发度。
这就是他主要的区别。

5.String,StringBuffer和StringBuilder的区别
String是用final修饰的,所以他是线程安全的,但是对字符串进行增删该的时候,他不会在原String的基础上进行修改,而是在新生成一个String,原先的String字符串还存在与jvm内存中,这样会造成很大的空间浪费。
StringBuffer和StringBuilder的出现就是解决这个问题,对字符串的修改是在原先的字符串上进行的, 不会新生成一个String。
SringBuffer和SringBuilder的区别在于:StringBuffer在多线程环境下是安全的,通过给方法加synchronized修饰,而StringBuilfder是线程不安全的,所以他的效率回避StringBUffer高。
我看过一点源码就是说 在实现StirngBuffer安全性的前提下,他的实现还是用的StringBuilder进行操作的。
应用方面的话:就是在单线程环境下,用StringBuilderxiaol会更高。在多线程环境下,用StringBuffer安全性会更高,相应的效率也会底下。

Java面试题基础知识(收集)的更多相关文章

  1. Java面试题-基础知识

    参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...

  2. Java 面试题基础概念收集

    问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示”main方法不是public的”. 问题:Java里的传引用和传值的区别是什么? 答案:传引用是指传递的是地 ...

  3. Java 面试题基础概念收集(高级)

    JVM垃圾回收: GC又分为 minor GC 和 Full GC (也称为 Major GC ).Java 堆内存分为新生代和老年代,新生代中又分为1个 Eden 区域 和两个 Survivor 区 ...

  4. 【Java面试】基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...

  5. 第76节:Java中的基础知识

    第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...

  6. JAVA核心技术I---JAVA基础知识(工具类Arrays和Collections类)

    一:工具类 –不存储数据,而是在数据容器上,实现高效操作 • 排序 • 搜索 –Arrays类 –Collection类 二:Arrays类(处理数组) (一)基本方法 –排序:对数组排序, sort ...

  7. JAVA核心技术I---JAVA基础知识(static关键字)

    一:static特殊关键字用处 –变量 –方法 –类 –匿名方法 二:静态变量:类共有成员 –static变量只依赖于类存在(通过类即可访问),不依赖于对象实例存在. –所有的对象实例,对于静态变量都 ...

  8. Java JDBC的基础知识(三)

    在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...

  9. Java JDBC的基础知识(二)

    在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...

随机推荐

  1. php 使用fileupload上传多张图片,压缩包

    test.php <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  2. devexpress 10.0升级为 15

  3. 程序员编程艺术:面试和算法心得-(转 July)

    1.1 旋转字符串 题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdef ...

  4. 【Python022--递归】

    一.递归 1.写一个求阶乘的函数 --正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的数 --普通的代码编写方式: def factorial(n):    result = n    for i ...

  5. log4j2使用介绍

    工作中,用到了log4j2,以前只接触过log4j,也没有太过深入,这次就稍微系统的学习了以下log4j2. 一.引入pom.xml 使用maven作为项目的构建环境,pom.xml使用slf4j,s ...

  6. Python3 tkinter基础 Label compound 图片上显示文字 fg字体颜色 font字体大小

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. Connections in Galaxy War (逆向并查集)题解

    Connections in Galaxy War In order to strengthen the defense ability, many stars in galaxy allied to ...

  8. What are the differences between Flyweight and Object Pool patterns?

    What are the differences between Flyweight and Object Pool patterns? They differ in the way they are ...

  9. P4822 [BJWC2012]冻结

    思路 和p4568类似的分层图最短路 从上一层向下一层连边权/2的边即可 代码 #include <cstdio> #include <algorithm> #include ...

  10. 论文笔记之:Graph Attention Networks

    Graph Attention Networks 2018-02-06  16:52:49 Abstract: 本文提出一种新颖的 graph attention networks (GATs), 可 ...