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. jquery photoClip支持手机端,PC端 本地裁剪图片后上传插件

    支持手机,PC最好的是jquery photoClip插件,下载地址&示例:https://github.com/topoadmin/photoClip demo.html 代码: <! ...

  2. 关于typeid和typeof

    typeid和typeof是c++/gcc编译器的两个关键字,也就是操作符,所以他们根本就不会声明在头文件中. 只不过typeid返回的是type_info,它定义在<typeinfo>头 ...

  3. 判断一个点是否在RotatedRect中

    openCV函数pointPolygonTest(): C++: double pointPolygonTest(InputArray contour, Point2f pt, bool measur ...

  4. shell脚本之 给PNG图片添加后缀@3x

    1,给png图片加上后缀@3x #!/bin/sh #root_src=$(dirname $(PWD)) #echo ${root_src} image_path=${root_src}/image ...

  5. ODAC(V9.5.15) 学习笔记(二)控件列表

    ODAC的控件有26个,简单介绍如下: TOraSession  管理Oracle的连接  TOraQuery  使用SQL进行数据获取,自动将更新提交数据库  TSmartQuery    在处理字 ...

  6. MongoDB ReplicaSet 集群搭建

    说明 本文创建的集群的名字为test,在同一台机器上创建了三个mongo实例,端口不同即可. 安装mongodb的教程,之前总结过,请参考:CentOS安装MongoDB笔记 创建实例 # 本机默认原 ...

  7. tp剩余未验证内容-5

    经过实践, ie678是不能正确显示解析bs的,所以要用ff和chrome浏览器. page-header类是有特殊样式的 在标题下有一条浅色的细线条,源代码中有: border-bottom: 1p ...

  8. 0-1背包dp|波动数列|2014年蓝桥杯A组10-fishers

    标题:波动数列 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a ...

  9. 【做题】agc008f - Black Radius——计数&讨论&思维

    原文链接 https://www.cnblogs.com/cly-none/p/9794411.html \[ \newcommand{\stif}[2]{\left[ \begin{matrix} ...

  10. Elasticsearch查询Index以及删除

    查询Index信息 GET /bank HTTP/1.1Host: localhost:9200 { "bank": { "aliases": {}, &quo ...