Java面试题基础知识(收集)
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面试题基础知识(收集)的更多相关文章
- Java面试题-基础知识
参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...
- Java 面试题基础概念收集
问题:如果main方法被声明为private会怎样? 答案:能正常编译,但运行的时候会提示”main方法不是public的”. 问题:Java里的传引用和传值的区别是什么? 答案:传引用是指传递的是地 ...
- Java 面试题基础概念收集(高级)
JVM垃圾回收: GC又分为 minor GC 和 Full GC (也称为 Major GC ).Java 堆内存分为新生代和老年代,新生代中又分为1个 Eden 区域 和两个 Survivor 区 ...
- 【Java面试】基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...
- 第76节:Java中的基础知识
第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...
- JAVA核心技术I---JAVA基础知识(工具类Arrays和Collections类)
一:工具类 –不存储数据,而是在数据容器上,实现高效操作 • 排序 • 搜索 –Arrays类 –Collection类 二:Arrays类(处理数组) (一)基本方法 –排序:对数组排序, sort ...
- JAVA核心技术I---JAVA基础知识(static关键字)
一:static特殊关键字用处 –变量 –方法 –类 –匿名方法 二:静态变量:类共有成员 –static变量只依赖于类存在(通过类即可访问),不依赖于对象实例存在. –所有的对象实例,对于静态变量都 ...
- Java JDBC的基础知识(三)
在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...
- Java JDBC的基础知识(二)
在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...
随机推荐
- php 使用fileupload上传多张图片,压缩包
test.php <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- devexpress 10.0升级为 15
- 程序员编程艺术:面试和算法心得-(转 July)
1.1 旋转字符串 题目描述 给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdef ...
- 【Python022--递归】
一.递归 1.写一个求阶乘的函数 --正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的数 --普通的代码编写方式: def factorial(n): result = n for i ...
- log4j2使用介绍
工作中,用到了log4j2,以前只接触过log4j,也没有太过深入,这次就稍微系统的学习了以下log4j2. 一.引入pom.xml 使用maven作为项目的构建环境,pom.xml使用slf4j,s ...
- Python3 tkinter基础 Label compound 图片上显示文字 fg字体颜色 font字体大小
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Connections in Galaxy War (逆向并查集)题解
Connections in Galaxy War In order to strengthen the defense ability, many stars in galaxy allied to ...
- 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 ...
- P4822 [BJWC2012]冻结
思路 和p4568类似的分层图最短路 从上一层向下一层连边权/2的边即可 代码 #include <cstdio> #include <algorithm> #include ...
- 论文笔记之:Graph Attention Networks
Graph Attention Networks 2018-02-06 16:52:49 Abstract: 本文提出一种新颖的 graph attention networks (GATs), 可 ...