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语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...
随机推荐
- Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源
Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源 在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spri ...
- 基础_cifar10_model
今天进一步在cifar10数据集上解决几个问题: 1.比较一下序贯和model,为什么要分成两块: 2.同样的条件下,我去比较一下序贯和model.这个例子作为今天的晚间运行. 1.比较一下序贯和mo ...
- 20145308 《网络对抗》 MAL_免杀原理及实践 学习总结
20145308 <网络对抗> MAL_免杀原理及实践 学习总结 实践内容 (1)理解免杀技术原理 (2)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免 ...
- FireMonkey 源码学习(5)
(5)UpdateCharRec 该函数的源码分析如下: procedure TTextLayoutNG.UpdateCharRec(const ACanvas: TCanvas; NeedBitma ...
- tp框架中的一些疑点知识-3
rewrite就是伪静态, 伪静态就是 rewirte, 可以把入口地址隐藏掉. 兼容模式就是 普通模式 和 pathinfo模式的 结合, 前面是普通模式 ?s= , 后面的 模块/控制器/操作和参 ...
- How to search for ? (question mark) in Excel
The ? is a wildcard which represents a single character, and the * is a wildcard character that repr ...
- 题解——洛谷 P2680 NOIP提高组 2015 运输计划
树上差分加上二分答案 详细题解待填坑 #include <cstdio> #include <algorithm> #include <cstring> using ...
- 论文笔记:A Review on Deep Learning Techniques Applied to Semantic Segmentation
A Review on Deep Learning Techniques Applied to Semantic Segmentation 2018-02-22 10:38:12 1. Intr ...
- 自定义Exception——实战篇
public class EntityConfigurationException : Exception { public EntityConfigurationException(string m ...
- tcpdump使用方法
TcpDump可以将网络中传送的数据包完全截获下来提供分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and.or.not等逻辑语句来帮助你去掉无用的信息. 工作中使用tcpdump命令抓 ...