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. 安装python3.7和PyCharm专业版

    安装python3.7 安装PyCharm专业版 1.下载地址http://www.jetbrains.com/pycharm/download/,选择windows下面的Professional,点 ...

  2. Spring Boot(十六):使用Jenkins部署Spring Boot

    Spring Boot(十六):使用Jenkins部署Spring Boot jenkins是devops神器,介绍如何安装和使用jenkins部署Spring Boot项目 jenkins搭建 部署 ...

  3. debug代码时遇到循环时提高效率方法

    在循环时,需要查看uid=uid=12007255时的代码执行情况 可以在循环代码中加入 if((Long)map.get("uid") == 12007255){ System. ...

  4. php 带省略号的分页

    原文链接:https://blog.csdn.net/u011060253/article/details/25308455 $curpage = isset($_GET[; $page = new ...

  5. bzoj 3875 骑士游戏 - spfa - 动态规划

    Description  [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,J ...

  6. 【python38--面向对象继承】

    一.继承 1.语法:class DerivedClassName(BaseClassName):子类继承父类 >>> class Parent: def hello(self): p ...

  7. Junit中AssertTrue的使用

    assertTrue public static void assertTrue(String message, boolean condition) Asserts that a condition ...

  8. ODAC(V9.5.15) 学习笔记(七)TOraUpdateSQL

    名称 类型 说明 DataSet 指向需要执行更新操作的数据集 DeleteObject 当执行删除操作时,通过该属性执行另外一个数据集,由后者来执行更多的删除动作 DeleteSQL TString ...

  9. P3521 [POI2011]ROT-Tree Rotations

    思路 发现每个子树内的交换情况不会对子树外造成影响,所以可以利用贪心的思想,线段树合并找出当前子树的合并的最小值直接累加给答案即可 我脑补的线段树合并貌似不太优秀的样子...每次都要新建节点,学习了直 ...

  10. HIHOcoder 1403 后缀数组一·重复旋律

    思路 后缀数组的板子题,注意后缀数组的rank[]数组是通过位置找到对应排名的,sa[]是通过排名找到位置的,height[i]记录的是sa[i]和sa[i+1]之间的lcp 不要写错了就行了 代码 ...