JAVA面试题(8)

java基础以及多个“比较”

1.Collections.sort排序内部原理

在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java 7中,内部实现换成了TimSort,其对对象间比较的实现要求更加严格java

2.hashMap原理,java8作的改变

从结构实现来说,HashMap是数组+链表+红黑树(JDK1.8增长了红黑树部分)实现的。HashMap最多只容许一条记录的键为null,容许多条记录的值为null。HashMap非线程安全。ConcurrentHashMap线程安全。解决碰撞:当出现冲突时,运用拉链法,将关键词为同义词的结点连接在一个单链表中,散列表长m,则定义一个由m个头指针组成的指针数组T,地址为i的结点插入以T(i)为头指针的单链表中。Java8中,冲突的元素超过限制(8),用红黑树替换链表。面试

3.String 和 StringBuilder 的区别

1)可变与不可变:String不可变,每一次执行“+”都会新生成一个新对象,因此频繁改变字符串的状况中不用String,以节省内存。redis

2)是否多线程安全:StringBuilder并无对方法进行加同步锁,因此是非线程安全的。StringBuffer和String均线程安全。算法

4.Vector 与 Array 的区别

1)ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。sql

2)Vector属于线程安全级别的,可是大多数状况下不使用Vector,由于线程安全须要更大的系统开销。数据库

5.HashMap 与 Hashtable 的区别

1) 历史缘由: Hashtable继承Dictonary类, HashMap继承自abstractMap编程

2) HashMap容许空的键值对, 但最多只有一个空对象,而HashTable不容许。数组

3) HashTable同步,而HashMap非同步,效率上比HashTable要高缓存

6.ConncurrentHashMap和hashtable比较,两个线程并发访问map中同一条链,一个线程在尾部删除,一个线程在前面遍历查找,问为何前面的线程还能正确的查找到后面被另外一个线程删除的节点)

ConcurrentHashMap融合了hashtable和hashmap两者的优点。hashtable是作了同步的,即线程安全,hashmap未考虑同步。因此hashmap在单线程状况下效率较高。hashtable在的多线程状况下,同步操做能保证程序执行的正确性。可是hashtable是阻塞的,每次同步执行的时候都要锁住整个结构,ConcurrentHashMap正是为了解决这个问题而诞生的,安全

ConcurrentHashMap容许多个修改操做并发进行,其关键在于使用了锁分离技术(一个Array保存多个Object,使用这些对象的锁做为分离锁,get/put时随机使用任意一个)。它使用了多个锁来控制对hash表的不一样部分进行的修改。在JDK 1.6中,有HashEntry结构存在,每次插入将新添加节点做为链的头节点(同HashMap实现),并且每次删除一个节点时,会将删除节点以前的全部节点拷贝一份组成一个新的链,而将当前节点的上一个节点的next指向当前节点的下一个节点,从而在删除之后有两条链存 在,于是能够保证即便在同一条链中,有一个线程在删除,而另外一个线程在遍历,它们都能工做良好,由于遍历的线程能继续使用原有的链。

Java8中,采用volatile HashEntry保存数据,table元素做为锁;从table数组+单向链表加上了红黑树。红黑树是一种特别的二叉查找树,特性为:1.节点为红或者黑 2.根节点为黑 3.叶节点为黑 4.一节点为红,则叶节点为黑 5.一节点到其子孙节点全部路径上的黑节点数目相同。

7.ArrayList

与 LinkedList 的区别?

最明显的区别是
ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。LinkedList是双向链表

8.Java 中,Comparator 与

Comparable 有什么不一样?

Comparable 接口用于定义对象的天然顺序,是排序接口,而 comparator 一般用于定义用户定制的顺序,是比较接口。咱们若是须要控制某个类的次序,而该类自己不支持排序(即没有实现Comparable接口),那么咱们就能够创建一个“该类的比较器”来进行排序。Comparable 老是只有一个,可是能够有多个 comparator 来定义对象的顺序。

9.抽象类是什么?它与接口有什么区别?你为何要使用过抽象类?

抽象类是指不容许被实例化的类;一个类只能使用一次继承关系。可是,一个类却能够实现多个interface。

abstract class和interface所反映出的设计理念不一样。其实abstract class表示的是”is-a”关系,interface表示的是”like-a”关系

实现抽象类和接口的类必须实现其中的全部方法。抽象类中能够有非抽象方法。接口中则不能有实现方法。但在Java8中容许接口中有静态默认的方法。

接口中定义的变量默认是public static final 型,且必须给其初值,因此实现类中不能从新定义,也不能改变其值。抽象类中的变量默认是 friendly 型,其值能够在子类中从新定义,也能够从新赋值。
子类中实现父类中的抽象方法时,可见性能够大于等于父类中的;而接口实现类中的接口 方法的可见性只能与接口中相同(public)。
用抽象类是为了重用。减小编码量,下降耦合性。

10.描述 Java 中的重载和重写?

重载和重写都容许你用相同的名称来实现不一样的功能,可是重载是编译时活动,而重写是运行时活动。你能够在同一个类中重载方法,可是只能在子类中重写方法。重写必需要有继承

重写:一、在子类中能够根据须要对从基类中继承来的方法进行重写。二、重写的方法和被重写的方法必须具备相同方法名称、参数列表和返回类型。三、重写方法不能使用比被重写的方法更严格的访问权限。

重载的时候,方法名要同样,可是参数类型和个数不同,返回值类型能够相同也能够不相同。没法以返回型别做为重载函数的区分标准。

11.Collection与Collections的区别是什么?

Collection是Java集合框架中的基本接口;

Collections是Java集合框架提供的一个工具类,其中包含了大量用于操做或返回集合的静态方法。

12.Java中多态的实现原理

所谓多态,指的就是父类引用指向子类对象,调用方法时会调用子类的实现而不是父类的实现。多态的实现的关键在于“动态绑定”。

13.object中定义了哪些方法?

clone(), equals(), hashCode(), toString(), notify(), notifyAll(),
wait(), finalize(), getClass()

  1. Java泛型和类型擦除

泛型即参数化类型,在建立集合时,指定集合元素的类型,此集合只能传入该类型的参数。类型擦除:java编译器生成的字节码不包含泛型信息,因此在编译时擦除:1.泛型用最顶级父类替换;2.移除。

15.说出 5 个 JDK 1.8 引入的新特性?

Java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性:
Lambda 表达式;容许像对象同样传递匿名函数 Stream API,充分利用现代多核 CPU,能够写出很简洁的代码 ;Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用 扩展方法,如今,接口中能够有静态、默认方法; 重复注解,如今你能够将相同的注解在同一类型上使用屡次。

16.java中public,private,protected以及默认关键字的访问范围:

Protected可在包内及包外子类访问,default只能同一包内访问,prvate只能同一类

17. 经常使用数据结构:

集合,线性结构(数组,队列,链表和栈),树形结构,图状结构

18.Java 中的 TreeMap 是采用什么树实现的?(答案)

Java 中的 TreeMap 是使用红黑树实现的。

19. 匿名内部类是什么?如何访问在其外面定义的变量?

匿名内部类也就是没有名字的内部类,匿名内部类只能使用一次,它一般用来简化代码编写。

匿名内部类只能访问外部类的Final变量. Java 8更加智能:若是局部变量被匿名内部类访问,那么该局部变量至关于自动使用了final修饰。

20. 如何建立单例模式?说了双重检查,他说不是线程安全的。如何高效的建立一个线程安全的单例?

一种是经过枚举,一种是经过静态内部类。

21.poll() 方法和 remove() 方法的区别?

poll() 和
remove() 都是从队列中取出一个元素,可是 poll() 在获取元素失败的时候会返回空,可是 remove() 失败的时候会抛出异常。

22.写一段代码在遍历 ArrayList 时移除一个元素

使用迭代器。

Iterator itr = list.iterator();

while(itr.hasNext()) {if(…) { itr.remove();} }

JVM

1.JVM如何加载一个类的过程,双亲委派模型中有哪些方法

类加载过程:加载、验证(验证阶段做用是保证Class文件的字节流包含的信息符合JVM规范,不会给JVM形成危害)、准备(准备阶段为变量分配内存并设置类变量的初始化)、解析(解析过程是将常量池内的符号引用替换成直接引用)、初始化。

双亲委派模型中方法:双亲委派是指若是一个类收到了类加载的请求,不会本身先尝试加载,先找父类加载器去完成。当顶层启动类加载器表示没法加载这个类的时候,子类才会尝试本身去加载。当回到最开的发起者加载器还没法加载时,并不会向下找,而是抛出ClassNotFound异常。

方法:启动(Bootstrap)类加载器,标准扩展(Extension)类加载器,应用程序类加载器(Application ),上下文(Custom)类加载器。意义是防止内存中出现多份一样的字节码 。

2.GC算法(什么样的对象算是可回收对象,可达性分析),CMS收集器

jvm是如何判断一个对象已经变成了可回收的“垃圾”,通常是两个方法:引用记数法和根搜索算法。引用记数法没办法解决循环引用的问题,因此用根搜索。从一系列的”GC Roots“对象开始向下搜索,搜索走过的路径称为引用链。当一个对象到”GC Roots“之间没有引用链时,被称为引用不可达。引用不可到的对象被认为是可回收的对象。

几种垃圾收集器:1,Serial New/Serial Old(串行),2,Parrallel New (并行),3,Parrallel Scavenge,4,Parrallel Old,5,CMS(CMS收集器是一个以得到最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是Mark-sweep算法。),6,G1(是一款并行与并发收集器,而且可创建可预测的停顿时间模型,总体上是基于标记清理,局部采用复制)

3.JVM分为哪些区,每个区干嘛的?

1)方法区(method):被全部的线程共享。方法区包含全部的类信息和静态变量。

2)堆(heap):被全部的线程共享,存放对象实例以及数组,Java堆是GC的主要区域。

3)栈(stack):每一个线程包含一个栈区,栈中保存一些局部变量等。

4)程序计数器:是当前线程执行的字节码的行指示器。

4.JVM新生代,老年代,持久代,都存储哪些东西?

持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。全部新生成的对象首先都是放在年轻代的,年老代中存放的都是一些生命周期较长的对象。

5.内存溢出和内存泄漏:

内存溢出:程序申请内存时,没有足够的内存,out of memory;内存泄漏值垃圾对象没法回收,可使用memory analyzer工具查看泄漏。

6.进程与线程:

进程值运行中的程序(独立性,动态性,并发性),线程指进程中的顺序执行流。区别是:1.进程间不共享内存 2.建立进程进行资源分配的代价要大得多,因此多线程在高并发环境中效率高。

7.序列化与反序列化:

序列化指将java对象转化为字节序列,反序列化相反。主要是为了java线程间通信,实现对象传递。只有实现了Serializable或Externalizable接口类对象才可被序列化。

8.64 位 JVM 中,int 的长度是多数?

Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。

9.Java 中 WeakReference 与 SoftReference的区别?

Java中一共有四种类型的引用。StrongReference、 SoftReference、 WeakReference 以及 PhantomReference。

StrongReference 是 Java 的默认引用实现, 它会尽量长时间的存活于 JVM 内,当没有任何对象指向它时将会被GC回收

WeakReference,顾名思义, 是一个弱引用, 当所引用的对象在
JVM 内再也不有强引用时, 将被GC回收

虽然 WeakReference 与 SoftReference 都有利于提升 GC 和 内存的效率,可是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而 SoftReference 会尽量长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得
SoftReference 很是适合缓存应用

10.解释 Java 堆空间及 GC?

当经过 Java 命令启动
Java 进程的时候,会为它分配内存。内存的一部分用于建立堆空间,当程序中建立对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于未来的分配。

11.Java 中堆和栈有什么区别?

JVM 中堆和栈属于不一样的内存区域,使用目的也不一样。栈经常使用于保存方法帧和局部变量,而对象老是在堆上分配。栈一般都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的全部线程共享。

并发,锁

1.volatile关键字, Lock

并发编程中:原子性问题,可见性问题,有序性问题。

volatile关键字能保证可见性,字能禁止指令重排序,可是不能保证原子性。可见性只能保证每次读取的是最新的值,可是volatile没办法保证对变量的操做的原子性。在生成的会变语句中加入Lock关键字和内存屏障。

Lock 实现提供了比使用synchronized 方法和语句可得到的更普遍的锁定操做,它能以更优雅的方式处理线程同步问题。用sychronized修饰的方法或者语句块在代码执行完以后锁自动释放,而用Lock须要咱们手动释放锁

2.MYSQL经常使用优化(sql优化,表结构优化等)

SQL优化、表机构优化、索引优化、缓存参数优化

3.java每改一点都须要从新编译打包部署,有没有更好的方法

可使用热加载

4.进程间通讯有哪几种方式?

1)管道(Pipe),2)命名管道(named pipe),3)信号(Signal),4)消息(Message)队列,5)共享内存,6)内存映射(mapped memory),7)信号量(semaphore),8)套接口(Socket)

5.Sychronized修饰静态方法,锁定类自己而不是实例,非静态方法锁定实例。

6. 操做系统什么状况下会死锁?

所谓死锁:是指多个进程在运行过程当中因争夺资源而形成的一种僵局。产生的缘由:竞争资源:当系统中多个进程使用共享资源,而且资源不足以知足须要,会引发进程对资源的竞争而产生死锁。进程间推动的顺序非法:请求和释放资源的顺序不当,也一样会致使产生进程死锁

7.产生死锁的四个条件:

1.互斥条件(进程独占资源)2.请求与保持(进程因请求资源而阻塞时,对已得到的资源保持不放) 3.不剥夺条件(进程已得到的资源,在末使用完以前,不能强行剥夺) 4.循环等待(若干进程之间造成一种头尾相接的循环等待资源关系)

8. 如何理解分布式锁?

因为在平时的工做中,线上服务器是分布式多台部署的,常常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题。

9. 线程同步与阻塞的关系?同步必定阻塞吗?阻塞必定同步吗?

线程同步与否 跟 阻塞非阻塞不要紧,同步是个过程,阻塞是线程的一种状态。多个线程操做共享变量时可能会出现竞争。这时须要同步来防止两个以上的线程同时进入临界区内,在这个过程当中后进入临界区的线程将阻塞,等待先进入的线程走出临界区。

10. 同步和异步有什么区别?

同步和异步最大的区别就在于。一个须要等待,一个不须要等待。同步能够避免出现死锁,读脏数据的发生,通常共享某一资源的时候用,若是每一个人都有修改权限,同时修改一个文件,有可能使一我的读取另外一我的已经删除的内容,就会出错,同步就会按顺序来修改。

11. 线程池

根据系统自身的环境状况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是经过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行

12. 如何调用 wait()方法?使用 if 块仍是循环?为何?

wait() 方法应该在循环调用,由于当线程获取到 CPU 开始执行的时候,其余条件可能尚未知足,因此在处理前,循环检测条件是否知足会更好。

wait(),notify()和notifyall()方法是java.lang.Object类为线程提供的用于实现线程间通讯的同步控制方法。等待或者唤醒

13. 实现线程的几种方法

(1)继承Thread类,重写run函数 (2)实现Runnable接口,重写run函数  (3)实现Callable接口,重写call函数

14. 什么是多线程环境下的伪共享(false sharing)?

伪共享是多线程系统(每一个处理器有本身的局部缓存)中一个众所周知的性能问题。缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,通常为32-256个字节。最多见的缓存行大小是64个字节。当多线程修改互相独立的变量时,若是这些变量共享同一个缓存行,就会无心中影响彼此的性能,这就是伪共享。

网络、数据库

1.TCP如何保证可靠传输?三次握手过程?

在TCP的链接中,数据流必须以正确的顺序送达对方。TCP的可靠性是经过顺序编号和确认(ACK)来实现的。TCP 链接是经过三次握手进行初始化的。三次握手的目的是同步链接双方的序列号和确认号并交换 TCP 窗口大小信息。第一次是客户端发起链接;第二次表示服务器收到了客户端的请求;第三次表示客户端收到了服务器的反馈。

2. Linux下你经常使用的命令有哪些?

    1. cd命令用来改变所在目录。cd /  转到根目录中cd ~  转到用户目录下     2. ls命令用来查看目录的内容。    3. cp命令用来拷贝文件cp <source filename> <target filename>    4.mv命令 mv t.txt Document    把文件t.txt 移动到目录Document中。 

3. 经常使用的hash算法有哪些?

1.加法hash:所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果。

2.位运算hash:这类型Hash函数经过利用各类位运算(常见的是移位和异或)来充分的混合输入元素

3.乘法hash:33*hash + key.charAt(i)

4. 什么是一致性哈希?

设计目标是为了解决因特网中的热点(Hot spot)问题,一致性hash算法提出了在动态变化的Cache环境中,断定哈希算法好坏的四个定义:一、平衡性(Balance) 二、单调性(Monotonicity) 三、分散性(Spread) 四、负载(Load)

5. 数据库中的范式有哪些?

第一范式—-数据库中的表(全部字段值)都是不可分割的原子数据项。

第二范式—-数据库表中的每一列都和主键相关,而不能只和主键的某一部分相关。

第三范式—-数据库表中每一列数据都和主键直接相关,不能间接相关。范式是为了减少数据冗余。

6. 数据库中的索引的结构?什么状况下适合建索引?

数据库中索引的结构是一种排序的数据结构,数据库索引是经过B树和变形的B+树实现的。什么状况下不适合创建索引:1.对于在查询过程当中不多使用或参考的列;对于那些只有不多数据值的列;对于那些定义为image,text和bit数据类型的列;当修改性能远大于检索性能。

根据系统自身的环境状况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是经过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行

7. concurrent包下面,都用过什么?

java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.lock

8. 经常使用的数据库有哪些?redis用过吗?

9. 你知道的开源协议有哪些?

GPL (GNU General Public License) :GNU通用公共许可协议

LGPL (GNU Lesser General Public License) :GNU宽通用公共许可协议

BSD
(Berkeley Software Distribution)  :伯克利软件分发许可协议

MIT (Massachusetts Institute of Technology):MIT之名源自麻省理工学院

Apache (Apache License) :Apache许可协议

MPL (Mozilla Public License) :Mozilla公共许可协议

10.表单提交中,get和post区别

1.get从服务器获取信息,post向服务器传信息 2.get传送数据量比较小,post能够比较大 3.get安全性比较低

11. TCP 协议与 UDP 协议有什么区别?(answer答案)

TCP(Tranfer Control Protocol)的缩写,是一种面向链接的保证传输的协议,在传输数据流前,双方会先创建一条虚拟的通讯道。能够不多差错传输数据。

UDP(User DataGram Protocol)的缩写,是一种无链接的协议,使用UDP传输数据时,每一个数据段都是一个独立的信息,包括完整的源地址和目的地,在网络上以任何可能的 路径传到目的地,所以,可否到达目的地,以及到达目的地的时间和内容的完整性都不能保证。

因此TCP必UDP多了创建链接的时间。相对UDP而言,TCP具备更高的安全性和可靠性。

TCP协议传输的大小不限制,一旦链接被创建,双方能够按照必定的格式传输大量的数据,而UDP是一个不可靠的协议,大小有限制,每次不能超过64K。

END

历史推荐

● JAVA面试题大全(1)

● Java后台面试–常见问题大全(1)

● JAVA面试题大全(2)

● JAVA面试题大全(3)

● JAVA面试题大全(4)

● JAVA面试题大全(5)

● JAVA面试题大全(6)

● JAVA面试题大全(7)

相关文章
相关标签/搜索