个人博客:https://totalo.top
题目来源见下方,答案整理为博主收集于互联网。
作者:牛妹
链接:https://www.nowcoder.com/discuss/161991
来源:牛客网
本文首发于csdn,同步发布在本人博客:totalo.top
一、JavaSE部分
❤1、Java基础
1、为什么重写equals还要重写hashcode
答:(1)两个对象相等,hashCode则一定相等;(2)hashCode相等,两个对象不一定相等;为了提高程序的效率,先进行hashcode的比较,如果不同,不必要进equals的比较了。如果不重写hashCode()会降低Map等集合的索引速度。
2、说一下map的分类和常见的情况
- HashMap: 线程不安全,底层采用数组 + 链表 + 红黑数组成,允许一条记录的为null。
- HashTable:线程安全,不允许键值为空
- LinkedHashMap: 保证了元素插入的顺序,即输入顺序和输出顺序一致。遍历速度只与数据多少有关系。
- TreeMap: 实现了SortMap接口,能够把保存的记录按照键排序(默认为升序)也可指定排序比较器。
在Map中插入,删除,定位元素:HashMap
要按照自定义顺序或自然顺序遍历:TreeMap
要求输入顺序和输出顺序相同:LinkedHashMap
3、Object若不重写hashCode()的话,hashCode()如何计算出来的?
将对象的内存值进行哈希运算,返回一个int类型的哈希值。
4、==比较的是什么?
对于基本数据类型来说,比较的是值,对于引用类型来说,比较的是引用指向的对象是否为同一个(即比较对象的内存地址)。
5、若对一个类不重写,它的equals()方法是如何比较的?
默认采用的Object类的equals(),而在Object类中,equals()方法的实习是采用==实现比较的。
6、java8新特性
lambda表达式:允许把函数作为一个方法的参数。
方法引用:直接引用已有的Java类或者对象(实例)的方法或构造器。
默认方法:在接口里都有一个实现方法。
Stream API: 新添加Stream API 半把真正的函数式编程风格引入Java。
DateTimeAPI:加强对于日期和时间的处理。
Optional:解决空指针异常。
Js引擎。
7、说说Lamda表达式的优缺点。
优点:
1.简洁
-
非常容易并行计算。
-
可能代表未来的编程趋势。
缺点:
-
若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势)
-
不容易调试。
-
若其他程序员没有学过 lambda 表达式,代码不容易让其他语言的程序员看懂。
8、一个十进制的数在内存中是怎么存的?
二进制补码
9、为啥有时会出现4.0-3.6=0.40000001这种现象?
在计算机中无法直接进行计算,都需要转换为二进制数进行运算,在二进制小数的计算过程中,产生了误差。
10、Java支持的数据类型有哪些?什么是自动拆装箱?
8种基本类型:byte、short、char、int、long、float、double、booblean以及引用类型包括数组、类、接口等。
自动装箱、拆箱是Java中8种基本类型与其包装类型之间的转化。装箱是基本数据类型与其包装类型的转化,拆箱是其逆过程。封装成对象能够更好的调用方法。
11、什么是值传递和引用传递?
值传递:对于基本类型而言、传递的是该变量的一个副本,改变副本不影响原变量。
引用传递:一般对于对象类型而言,传递的是该对象地址的一个副本,并不是原对象本身。
一般认为,Java中的传递都是值传递,Java中实例对象的传递是引用传递。
12、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
Array可以包含基本类型以及对象类型并且时同一数据类型,ArrayList只能包含对象类型,Object。Array大小是固定的,ArrayList的大小是动态变化的。ArrayList提供了更多方法和特性。
Array:集合长度固定、保存的对象为基础数据类型,且为同一类型。对集合进行随机的读写。
ArrayList:长度不固定,如果长度增长频繁,应考虑预设ArrayList的长度或者使用链表LinkedList代替,ArrayList每次扩容都要进行数组的拷贝。插入和删除使用其内置方法较为方便。
13、你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?
大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是一个渐进上界。O表示算法的时间或者空间复杂度上界。比如数组的插入时间复杂度为O(N),空间复杂度为O(1),链表的插入时间复杂度为O(1),空间复杂度为O(1).
14、String是最基本的数据类型吗?
不是,String是引用类型。
15、int 和 Integer 有什么区别
- Integer是int的包装类型,int的初值为0,Integer的初值为null
- Integer 和new Integer不会相等,new出来的对象存在堆中,而非new Integer存放在常量池中,内存地址不一致。
- 两个非new Integer,如果数在-128 - 127之间则为true,否则为false.因为在编译时,Integer i = x, 会转化为Integer.valueOf(x),而此函数在-128 - 127对数据进行缓存。
- 两个都是new 的话,内存地址不同,false
- int 和Integer比较,都为true,原因在于自动拆箱。
16、String 、StingBuilder和StringBuffer的区别
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
17、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
// 将str字符串从iso8859-1转化成utf8编码
res = new String (str.getBytes("iso8859-1"), "utf-8");
18、&和&&的区别?
&和&&都可以作为逻辑与的运算符,表示逻辑与,当运算符两边的表达式的结果都为true时,整个运算结果才为true。&&具有短路功能呢,如果第一个为false,即不再判断第二个表达式。&可作为位运算符。表示按位与运算。
19、在Java中,如何跳出当前的多重嵌套循环?
在最外层定义一个标号,在循环中直接break 标号就行了。
20、你能比较一下Java和JavaSciprt吗?
基于对象和面向对象:Java是一门真正面向对象的语言,Js是脚本语言,基于对象和事件驱动的编程语言。
解释和编译:Java在运行时必须先编译再解释执行,而Js是一种解释性语言。
强类型和弱类型:Java采用强类型的变量检查必须先声明后使用,而Js是一种弱类型。
代码格式不一样
Java是是静态语言亦称为“准动态语言”,可通过反射机制、字节码操作产生动态性,Js是动态语言。
21、简述正则表达式及其用途。
在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具。正则表达式就是记录文本规则的代码。
22、Java中是如何支持正则表达式操作的?
String str = "待匹配字符串";
Pattern p = Pattern.compile("正则表达式");
Matcher m = p.matcher(str);
23、请你说说Java和PHP的区别?
1、PHP适合快速开发,开发成本低。Java适合开发大型的应用系统。
2、系统技术架构的比较,PHP只能实现简单的两层或者三层的架构。Java可实现多层的网络架构。
3、PHP对于不同的数据库需要采用不同的数据库接口,Java用JDBC统一实现。
❤2、关键字
1、介绍一下Syncronized锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么?
java关键字,用来修饰代码块、实例方法、静态方法。为修饰的方法加锁,提供线程安全。修饰变量时,既可以保证可见性,又可以保证原子性。
同步方法:锁是当前对象
静态函数:锁是指引用当前类的class对象
同步方法块:锁是值synchonized括号内配置的对象。
2、介绍一下volatile?
java关键字之一,只能用来修饰变量。使用其修饰的变量会强制将修改的值写入主存,主存中值的更新会使缓存中的值失效。(非volatile变量不具备这样的特性,非volatile变量的值会被缓存,线程A更新了这个值,线程B读取这个变量的值时可能读到的并不是是线程A更新后的值)。volatile禁止指令重排。其具有可见性、有序性。
指令重排是指在程序执行过程中, 为了性能考虑, 编译器和CPU可能会对指令重新排序.
3、锁有了解嘛,说一下Synchronized和lock
1、Lock是一个接口,而synchionized是java中的关键字,synchronized是内置语言实现的。
2、synchronized在发生异常时能够自动释放占有锁,因此不会导致死锁现象发生;而Lock在发生异常时,若不是主动unLock(),有可能会早场死锁现象。
3、Lock可以让等待锁的线程响应中断;使用synchronized,等待的线程会一直等待下去,不能响应中断。
4、Lock可以判断是否成功获取锁,而synchronized无法办到。
5、Lock可以提高多个线程进行读操作的效率。
在性能上来说,竞争资源不激烈,性能差不多,资源竞争激烈时,Lock优于synchronized;
二者都是可重入锁。
Lock是可中断锁,synchronized是不可中断锁。
synchronized是非公平锁,无法保证等待的线程获取锁的顺序。
ReentrantLock和ReentrantReadWriteLock,它默认情况下是非公平锁,但是可以设置为公平锁。
4、讲一讲Java里面的final关键字怎么用的?
final修饰关键字;修饰类表示该类不能被继承,变量或者方法被final修饰表示在使用中变量值不能被修改为常量,方法不能被重写。
❤3、面向对象
1、wait方法底层原理
sleep()不释放对象锁,wait()释放对象锁。
2、Java有哪些特性,举个多态的例子。
封装、继承、多态。不同种类动物具有不一样的行为。
3、String为啥不可变?
底层final修饰
4、类和对象的区别
类市对于一类事务的描述。
对象用于表示现实中该类事务的个体。
5、请列举你所知道的Object类的方法。
clone() :创建并返回此对象的一个副本。
equals(Object obj) :指示其他某个对象是否与此对象“相等”。
getClass() :返回此 Object 的运行时类。
hashCode() :返回该对象的哈希码值。
notify() :唤醒在此对象监视器上等待的单个线程
notifyAll() :唤醒在此对象监视器上等待的所有线程。
toString() :返回该对象的字符串表示。
wait() : 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
6、重载和重写的区别?相同参数不同返回值能重载吗?
1)重写 override
- 方法名、参数、返回值相同。
- 子类方法不能缩小父类方法的访问权限。
- 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
- 存在于父类和子类之间。
- 方法被定义为
final
不能被重写。
2)重载 overload
- 参数类型、个数、顺序至少有一个不相同。
- 不能重载只有返回值不同的方法名。
- 存在于父类和子类、同类中。
7、”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
static表示静态的意思,修饰成员变量和成员函数,被static修饰的成员函数只能访问静态成员,不能风闻非静态成员。静态是随着类的加载而加载。不能。私有方法被隐式的定义为final不能被重写。静态的方法形式上是可以被重写的,即子类中可以重写父类中的静态方法,但实际上在内存的角度上静态方法是不可以被重写的
8、String能继承吗?
不能,String类为final修饰。
9、StringBuffer和StringBuilder有什么区别,底层实现上呢?
StringBuffer线程安全,StringBuilder非线程安全。两者都继承AbstractStringBuilder。StringBuffer重写了AbstractBuilder方法时使用了synchronized同步块。
10、类加载机制,双亲委派模型,好处是什么?
类加载机制 :虚拟机把描述类的数据从class文件加载到内存,并对书韩剧进行校验,转换解析和初始化。
双亲委派机制:当类受到一个类加载请求,自己不会去尝试加载这个类,而是把请求委派给父类去完成,每一层次的类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中。只有当父类加载反馈自己无法完成这个请求时,子类加载器才会尝试自己加载。
好处:比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载。这样就保证了使用不同的类加载器最终得到的都是同样一个Object对象。
11、静态变量存在哪?
全局区
12、讲讲什么是泛型?
不确定的一种数据类型。是一预编译检查类型。泛型可以将运行时异常转换城编译阶段的错误。
13、解释extends 和super 泛型限定符-上界不存下界不取
extends 指定上界限,只能传入本类和子类
super 指定下界限,只能传入本类和父类
链接:https://www.nowcoder.com/questionTerminal/5dfac75a8de64171bc763a3cb39a58f7
来源:牛客网1、extends 限定参数类型的上界 参数类型必须是T或T的子类型 super限定参数类型的下界 参数类型必须是T或T的超类型
2、extends 只能用于方法返回 告诉编译器此返参的类型的最小继承边界为T T和T的父类都能接收 但是入参类型无法确定 只能接受null的传入 super只能用于限定方法入参 告诉编译器入参只能是T或其子类型 而返参只能用Object类接收既不能用于入参也不能用于返参
14、是否可以在static环境中访问非static变量?
不可以。static变量属于类,在类加载的时候被初始化,这个时候非静态变量没有加载,故静态变量不能访问。
15、谈谈如何通过反射创建对象?
1、默认构造器通过Class的newInstance()方法获取。
// 只能默认创建无构造
Class<?> clz = Class.forName("完整包名");
Object obj = clz.newInstance();
2、通过获取构造器getConstructor(Class<?>…parameterTypes);(通过有参的构造器,参数可以指定具体类型和多个数量
Class<?> clz = Class.forName("完整包名");
Constructor<?> con = clz.getConstructor(String.class, String.class); // 这里面的参数需要是类型的.class
Object ojb = con.newInstance("",""); //与上文获取的构造方法参数类型相对应即可
16、Java支持多继承么?
普通类不支持,但是接口支持,普通类可以实现多个接口
17、接口和抽象类的区别是什么?
- 抽象类可以有构造方法,接口中不能有构造方法。
- 抽象类可以有普通成员变量,接口中没有普通成员变量。
- 抽象类可以包含静态方法,接口中不能包含静态方法。
- 一个类可以实现多个接口,但只能继承一个抽象类。
- 接口可以被多重实现,抽象类只能被单一继承。
18、Comparable和Comparator接口是干什么的?列出它们的区别。
Comparable是集合内部定义的方法实现排序。Comparator是在集合外部实现的排序。
Comparable是表示当前类支持排序;
Comparator可定义自定义比较器。
19、面向对象的特征有哪些方面
- 封装:给对象提供隐藏内部特性和行为的能力。
- 继承:给对象提供了从基类获取字段和方法的能力。
- 多态:编程语言给不同的底层数据类型做相同的接口展示一种能力。
- 抽象:把想法从具体的实例中分离出来。
20、final, finally, finalize的区别。
1、final是修饰关键字
一个类被声明为final,不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final.
变量被声明为final,可以保证在使用中不被使用,被声明为final的变量必须在声明时给定初值,而且在以后的引用中只能读取,不可修改,被声明为final的方法也同样只能使用,不能重写。
2、finally
在异常处理时,提供finally块来执行任何清楚操作,如果抛出一个异常,那么相匹配的的catch子句就会执行,最后进入fianlly语句。
在以下 4 种特殊情况下,finally块不会被执行:
- 在
finally
语句块中发生了异常。 - 在前面的代码中用了
System.exit()
退出程序。 - 程序所在的线程死亡。
- 关闭 CPU 。
3、finalize
这是一个方法,在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法时垃圾手机器在确定这个对象没有被引用时对这个对象调用的。
- 它是在 Object 类中定义的,因此所有的类都继承了它。
- 子类覆盖
finalize()
方法,以整理系统资源或者执行其他清理工作。 finalize()
方法,是在垃圾收集器删除对象之前对这个对象调用的。
21、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
1)重写 override
- 方法名、参数、返回值相同。
- 子类方法不能缩小父类方法的访问权限。
- 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
- 存在于父类和子类之间。
- 方法被定义为
final
不能被重写。
2)重载 overload
- 参数类型、个数、顺序至少有一个不相同。
- 不能重载只有返回值不同的方法名。
- 存在于父类和子类、同类中。
22、abstract class和interface有什么区别?
-
抽象类可以有构造方法,接口中不能有构造方法。
-
抽象类可以有普通成员变量,接口中没有普通成员变量。
-
抽象类可以包含静态方法,接口中不能包含静态方法。
-
一个类可以实现多个接口,但只能继承一个抽象类。
-
接口可以被多重实现,抽象类只能被单一继承。
23、Static Nested Class 和 Inner Class的不同
Static Nested Class :静态内部类,可以不依赖于外部类实例被实例化
Inner Class :内部类需要在外部类实例化后才能实例化。
24、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
值传递,在Java里面只有值传递。当Java实例对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变。但对象的引用时永远不会改变的。
Java参数不管是原始类型还是引用类型,传递的都是一个副本。
1、参数是原始类型:传递的是参数的一个副本,即参数的原始值,函数中改变副本的值不会改变原始的值;
2、参数是引用类型:传递的参数是引用参数的副本,这副本是存放的是参数的地址,若没改变副本的地址,改变了地址中的值会影响原始值。如果改变了副本的值,如new一个,那么副本指向了新位置,但是原始引用地址中的值不会发生变化。
25、Java的接口和C++的虚类的相同和不同处。
C++中的虚类相当于Java中的抽象类,所以有如下的不同;
虚类可有构造方法,接口无;
虚类只能单继承,接口可以多实现;
虚类中的方法不一定为抽象方法,可以具有方法体,接口中都是抽象方法,不能有方法体,只是方法声明;
虚类可以是public、private、protected、default,接口只有public;
虚类中的方法权限修饰符同上,接口中只能是public和default;
虚类和接口都不能被实例化;
26、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
throws:显式的声明一个异常;
throw:抛出一个异常;
try:将可能发生异常的语句包含起来,进行异常的处理;
catch:如果有异常就会执行相关的语句;
finally:不管是否发生异常都会执行;
可以。
27、内部类可以引用他包含类的成员吗?有没有什么限制?
可以,不是静态内部类,无任何限制,一个内部类对象可以访问创建他的外部类对象的成员包括私有成员。如果式静态内部类,不可以访问外部类的普通成员变量只能访问外部类的静态成员变量。
28、两个对象值相同(x.equals(y) == true),但却可有不同的hash code说法是否正确?
不正确,equals()相等。hashCode()肯定相等。hashCode()相等。equals()不一定相等。
29、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
1)重写 override
- 方法名、参数、返回值相同。
- 子类方法不能缩小父类方法的访问权限。
- 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
- 存在于父类和子类之间。
- 方法被定义为
final
不能被重写。
2)重载 overload
- 参数类型、个数、顺序至少有一个不相同。
- 不能重载只有返回值不同的方法名。
- 存在于父类和子类、同类中。
30、如何通过反射获取和设置对象私有字段的值?
getDeclaredField() //获取Field对象
setAccessible(true) //将其设置为可以访问
get/set // 通过get/set方法获取
31、谈一下面向对象的"六原则一法则"。
六原则:
(1)单一职责原则:一个类该做他该做的事;
(2)开闭原则:软件实体应对拓展开发,对于修改关闭;
(3)依赖倒置原则:面向接口编程;
(4)里氏替换原则:任何时候都可以用子类型替换掉父类型;
(5)接口隔离原则:接口要小而专,绝不能大而全;
(6)合成聚合复用原则:优先使用聚合或者合成关系服复用代码;
一法则:
迪米特法则:一个对象应当对其他对象有尽可能少的了解。
32、请问Query接口的list方法和iterate方法有什么区别?
list()返回的对象是完整的,iterate()方法只是返回对象中包含的主键值。
33、Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
重载(Overloading)
(1)方法重载是让类以统一的方法处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数(类型)。重载Override是一个类中多态性的一种表现。
(2)java的方法重载,就是在类中可以创建多个方法,他们具有相同的名字,但具有不同参数和不同的定义。调用方法时通过传递给他们不同的参数个数和参数类型来决定具体使用那个方法,这就是多态性。
(3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不同。无法以返回类型来作为重载函数的区分标准。
重写(Overriding)
(1)父类与子类的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。在java中,子类可继承父类的方法,则不需要重新编写相同的方法。但有时子类并不想原封不动继承父类的方法,而是想做一定的修改,这就采用方法重写。方法重写又称方法覆盖。
(2)若子类中的方法与父类的中的某一方法具有相同的方法名、返回类型和参数表,则新方法覆盖原有的方法。如需要父类的原有方法,可以使用super关键字,该关键字引用房钱类的父类。
(3)子类函数访问权限大于父类。
34、Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
构造函数:初始化对象
构造函数重载:对于默认构造函数的重载;
复制构造函数:Java没有拷贝构造函数的概念。
35、hashCode()和equals()方法有什么联系?
hashCode()相等,equals()不一定相等;
equals()相等,hashCode()一定相等。
❤4、集合
1、Map和ConcurrentHashMap的区别?
不知道怎么说这个;
Map是一个接口。但是ConcurrentHashMap是一个线程安全的一个类,在jdk1.7中采用segment分段锁,有点类似16个现场安全的hashtable组合而成,不同分段操作不需要上锁,对于同一分段才需要上锁,读不上锁,写才上锁。锁的粒度更加精细。在jdk1.8中,采用AQS和CAS实现。
2、hashMap内部具体如何实现的?
在jdk1.8中,hashMap底层是数组 + 链表 + 红黑树,具体可以去研究一下底层源码实现。
3、如果hashMap的key是一个自定义的类,怎么办?
必须重写equals()方法以及hashMap()方法。因为自定义类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同的两个对象,比较也是不相等。若不重写比较的是其地址。
4、ArrayList和LinkedList的区别,如果一直在list的尾部添加元素,用哪个效率高?
ArrayList基于动态数组实现,地址连续,查询速率比较高,插入和删除的效率低。
LinkedList基于链表实现,地址任意不连续,新增和删除add以及remove速度快,LinkedList适合头尾操作或插入指定的位置。
5、HashMap底层,负载因子,为啥是2^n?
负载因子默认为0.75,2^n是为了让散列更加均匀。
hash%length,计算机中直接求余效率不如位移运算,源码中做了优化hash&(length-1), hash%length==hash&(length-1)的前提是length是2的n次方; 为什么这样能均匀分布减少碰撞呢?2的n次方实际就是1后面n个0,2的n次方-1 实际就是n个1; 例如长度为9时候,3&(9-1)=0 2&(9-1)=0 ,都在0上,碰撞了; 例如长度为8时候,3&(8-1)=3 2&(8-1)=2 ,不同位置上,不碰撞; 其实就是按位“与”的时候,每一位都能 &1 ,也就是和1111……1111111进行与运算
6、ConcurrentHashMap锁加在了哪些地方?
不同的Segment,ConcurrentHashMap将数据分段,在读写的时候只加到相应的数据段上,这样在多线程的时候,可以读写其他段的数据,提高效率。
7、TreeMap底层,红黑树原理?
平衡二叉树:一棵空树或者左右子树的高度差绝对值不超过1,并且左右两个子树都一个平衡二叉树。
8、concurrenthashmap有啥优势,1.7,1.8区别?
ConcurrentHashMap是线程安全的。
jdk1.7:segment + HashEntry的方式实现;其中Segment在实现上继承了ReentrantLock,自带锁功能。
jdk1.8:Node + 数组 + synchronized来保证并发安全进行实现。
9、ArrayList是否会越界?
可能会越界,当多个线程操作同一个ArrayList的时候,两个线程同时执行Add在线程一已经将size++而线程二在读取的时候导致越界,线程在被挂起的时候,执行的位置不一样,size是个共有变量,自增是个非原子操作。
10、什么是TreeMap?
TreeMap继承AbstractMap,实现NavigableMap、Cloneable、Serializable三个接口,能按自然顺序或自定义顺序遍历。
11、ConcurrentHashMap的原理是什么?
线程安全的HashMap实现,采用锁分段技术。把数据分成一段一段的存储,然会给每一段数据进行加锁。当一个线程占用锁访问其中一个段数据。ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。
12、Java集合类框架的基本接口有哪些?
Collection
- List
- ArrrayList:有序,可重复,底层使用数组实现,查询速度快,线程不安全,扩容 = 当前 * 1.5 + 1;
- LinkedList:有序,可重复。底层使用双向循环循环链表实现,增删快,线程不安全;
- Vector:有序,底层使用数组,速度快,线程安全效率低,扩容 = 当前容量 * 2。
- Set
- HashSet:排列无序,不可重复,有去重特性。底层使用Hash表实现,存取速度快。内部是HashMap;
- TreeSet:排列无序,不可重复。底层使用二叉树实现,排序存储,内部采用TreeMap的SortedSet;
- LinkedHashSet:采用Hash表存储,并使用双向链表记录插入顺序。内部是LinkedHashMap。
- Queue:在两端出入的List,所以可以用数组或者链表来实现。
Map
- TreeMap:键不可重复,值可重复,底层为二叉树;
- HashMap:键不可重复,值可重复,底层哈希表,线程不安全,允许key值为null,value也可以为null。
- HashTable:键不可重复,值可重复,底层哈希表,线程安全,key、value都不允许为null。
13、为什么集合类没有实现Cloneable和Serializable接口?
克隆(cloning)或者序列化(serialization)的语义和含义是跟具体的实现相关的。因此应该由集合类的具体实现类来决定如何被克隆或者序列化
14、什么是迭代器?
简单来说 就是游标
15、Iterator和ListIterator的区别是什么?
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List;
Iterator对集合只能前向遍历,ListIteratorz只能遍历List;
ListIterator实现了Iterator接口,包含其他很多功能。比如增加元素,替换元素,获取前一个和后一个索引。
16、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
fail-safe允许在遍历的过程中对容器中的数据进行修改,而fail-fast则不允许。
17、HashMap和Hashtable有什么区别?
hashMap:线程不安全,允许key值为null,value也可以为null。Iterator是fail-fast迭代器。当其他线程修改其结构时,抛出异常。默认为16,扩容为2n
hashTable:线程安全,key、value都不允许为null。初始容量为11,扩容会变成2n+1
18、ArrayList和LinkedList有什么区别?
同上
19、ArrayList,Vector,LinkedList的存储性能和特性是什么?
同上
20、Collection 和 Collections的区别。
- Collection ,是集合类的上级接口,继承与他的接口主要有 Set 和List 。
- Collections ,是针对集合类的一个工具类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
21、你所知道的集合类都有哪些?主要方法?
见12
22、List、Set、Map是否继承自Collection接口?
否,详情请参考12
23、阐述ArrayList、Vector、LinkedList的存储性能和特性
见12
24、List、Map、Set三个接口存取元素时,各有什么特点?
见12
❤5、线程
1、多线程中的i++线程安全吗?为什么?
先说不是原子的,因为这个是分为三步,读值,+1,写值。在这三步任何之间都可能会有CPU调度产生,造成i的值被修改,造成脏读脏写。
接下来说volatile不能解决这个线程安全问题。因为volatile只能保证可见性,不能保证原子性。回答这个只为了让面试官晓得你考虑周全,知识面广。
接下来说可以用锁。使用synchronized或者ReentrantLock都可以解决这个问题。这里还可以比较下这两种方式的优劣。教科书式的比较结束后,来一句“我认为一般使用synchronized更好,因为JVM团队一直以来都在优先改进这个机制,可以尽早获得更好的性能,并且synchronized对大多数开发人员来说更加熟悉,方便代码的阅读”。
最后补上AtomicInteger。为什么AtomicInteger使用CAS完成?因为传统的锁机制需要陷入内核态,造成上下文切换,但是一般持有锁的时间很短,频繁的陷入内核开销太大,所以随着机器硬件支持CAS后,JAVA推出基于compare and set机制的AtomicInteger,实际上就是一个CPU循环忙等待。因为持有锁时间一般较短,所以大部分情况CAS比锁性能更优。
最初是没有CAS,只有陷入内核态的锁,这种锁当然也需要硬件的支持。后来硬件发展了,有了CAS锁,把compare 和 set 在硬件层次上做成原子的,才有了CAS锁。
转载自https://blog.csdn.net/fansunion/article/details/79625510
2、如何线程安全的实现一个计数器?
使用AtomicInteger类
3、多线程同步的方法
- 同步方法:synchronized关键字修饰的方法
- 同步代码块
- 使用特殊域变量(volatile)实现线程同步
- 使用重入锁实现线程同步
- 使用局部变量实现线程同步
4、介绍一下生产者消费者模式?
5、线程,进程,然后线程创建有很大开销,怎么优化?
6、线程池运行流程,参数,策略
7、讲一下AQS吧。
8、创建线程的方法,哪个更好,为什么?
9、Java中有几种方式启动一个线程?
10、Java中有几种线程池?
11、线程池有什么好处?
12、cyclicbarrier和countdownlatch的区别
13、如何理解Java多线程回调方法?
14、创建线程有几种不同的方式?你喜欢哪一种?为什么?
15、概括的解释下线程的几种可用状态。
16、同步方法和同步代码块的区别是什么?
17、启动线程有哪几种方式,线程池有哪几种?
18、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
19、sleep() 和 wait() 有什么区别?
20、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
21、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。使用内部类实现线程,对j增减的时候没有考虑顺序问题。
22、启动一个线程是用run()还是start()?
23、请说出你所知道的线程同步的方法
24、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
25、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
26、线程的sleep()方法和yield()方法有什么区别?
27、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
28、请说出与线程同步以及线程调度相关的方法。
29、举例说明同步和异步
30、什么是线程池(thread pool)?
31、说说线程的基本状态以及状态之间的关系?
32、如何保证线程安全?
❤6、锁
1、讲一下非公平锁和公平锁在reetrantlock里的实现。
2、讲一下synchronized,可重入怎么实现。
3、锁和同步的区别。
4、什么是死锁(deadlock)?
5、如何确保N个线程可以访问N个资源同时又不导致死锁?
6、请你简述synchronized和java.util.concurrent.locks.Lock的异同?
❤7、JDK
1、Java中的LongAdder和AtomicLong的区别
2、JDK和JRE的区别是什么?
❤8、反射
1、反射的实现与作用
?9、JVM
1、JVM回收算法和回收器,CMS采用哪种回收算法,怎么解决内存碎片问题?
2、类加载过程
3、JVM分区
4、eden区,survial区?
5、JAVA虚拟机的作用?
6、GC中如何判断对象需要被回收?
7、JAVA虚拟机中,哪些可作为ROOT对象?
8、JVM内存模型是什么?
9、jvm是如何实现线程?
10、jvm最大内存限制多少
11、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
12、描述一下JVM加载class文件的原理机制?
❤10、GC
1、java中内存泄露是啥,什么时候出现内存泄露?
2、minor gc如果运行的很频繁,可能是什么原因引起的,minor gc如果运行的很慢,可能是什么原因引起的?
3、阐述GC算法
4、GC是什么? 为什么要有GC?
5、垃圾回收的优点和原理。并考虑2种回收机制
6、java中会存在内存泄漏吗,请简单描述。
7、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?(垃圾回收)
❤11、IO和NIO、AIO
1、怎么打印日志?
2、运行时异常与一般异常有何异同?
3、error和exception有什么区别?
4、给我一个你最常见到的runtime exception
5、Java中的异常处理机制的简单原理和应用。
6、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
7、什么是java序列化,如何实现java序列化?
8、运行时异常与受检异常有什么区别?
二、JavaEE部分
❤1、Spring
1、说一下IOC和AOP?
2、介绍一下bean的生命周期
3、Spring里面注解用过没有?autowired 和resource区别?
4、@Controller和@RestController的区别?
5、依赖注入的方式有几种,哪几种?
6、springIOC原理?自己实现IOC要怎么做,哪些步骤?
7、Spring中BeanFactory和ApplicationContext的区别?、
8、什么是IoC和DI?DI是如何实现的?
9、请问Spring中Bean的作用域有哪些?
10、谈谈Spring中自动装配的方式有哪些?
11、aop的应用场景?
12、AOP的原理是什么?
13、你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?
14、Spring支持的事务管理类型有哪些?你在项目中使用哪种方式?
15、介绍一下spring?
16、Struts拦截器和Spring AOP区别?
17、spring框架的优点?
18、选择使用Spring框架的原因(Spring框架为企业级开发带来的好处有哪些)?
19、持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些?
❤2、Hibernate
1、阐述实体对象的三种状态以及转换关系。
2、Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能够共享同一个Session吗)?
3、Hibernate中Session的load和get方法的区别是什么?
4、如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?
4、简述Hibernate常见优化策略。
5、锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制。
6、Hibernate如何实现分页查询?
7、谈一谈Hibernate的一级缓存、二级缓存和查询缓存。
❤3、Struts
1、说说STRUTS的应用
❤4、Mybatis
1、解释一下MyBatis中命名空间(namespace)的作用。
2、MyBatis中的动态SQL是什么意思?
❤5、MVC
1、Spring MVC注解的优点
2、springmvc和spring-boot区别?
3、SpringMVC的运行机制,运行机制的每一部分的相关知识?
4、谈谈Spring MVC的工作原理是怎样的?
❤6、各框架对比与项目优化
1、Mybatis和Hibernate区别?
2、介绍一下你了解的Java领域的Web Service框架。
❤7、JPA
1、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。
2、EJB与JAVA BEAN的区别?
3、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
4、EJB的角色和三个对象是什么?
5、说说EJB规范规定EJB中禁止的操作有哪些?
6、EJB的激活机制是什么?
7、EJB的几种类型分别是什么
8、EJB需直接实现它的业务接口或Home接口吗,请简述理由。
三、Java web编程
❤1、web编程基础
❤2、web编程进阶
1、forward与redirect区别,说一下你知道的状态码,redirect的状态码是多少?
2、servlet生命周期,是否单例,为什么是单例。
3、说出Servlet的生命周期,并说出Servlet和CGI的区别。
4、Servlet执行时一般实现哪几个方法?
5、阐述一下阐述Servlet和CGI的区别?
6、说说Servlet接口中有哪些方法?
7、Servlet 3中的异步处理指的是什么?
8、如何在基于Java的Web项目中实现文件上传和下载?
9、服务器收到用户提交的表单数据,到底是调用Servlet的doGet()还是doPost()方法?
10、Servlet中如何获取用户提交的查询参数或表单数据?
11、Servlet中如何获取用户配置的初始化参数以及服务器上下文参数?
12、讲一下redis的主从复制怎么做的?
13、redis为什么读写速率快性能好?
14、redis为什么是单线程?
15、缓存的优点?
16、aof,rdb,优点,区别?
17、redis的List能用做什么场景?
18、说说MVC的各个部分都有那些技术来实现?如何实现?
19、什么是DAO模式?
20、请问Java Web开发的Model 1和Model 2分别指的是什么?
21、你的项目中使用过哪些JSTL标签?
22、使用标签库有什么好处?如何自定义JSP标签?(JSP标签)
❤3、web编程原理
1、get和post区别?
2、请谈谈转发和重定向的区别?
3、说说你对get和post请求,并且说说它们之间的区别?
4、cookie 和session 的区别?
5、forward 和redirect的区别
6、BS与CS的联系与区别。
7、如何设置请求的编码以及响应内容的类型?
8、什么是Web Service(Web服务)?
9、谈谈Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别?
10、大型网站在架构上应当考虑哪些问题?
11、请对J2EE中常用的名词进行解释(或简单描述)
四、JDBC编程
❤1、SQL基础
1、写SQL:找出每个城市的最新一条记录。
2、一个学生表,一个课程成绩表,怎么找出学生课程的最高分数
3、有一组合索引(A,B,C),会出现哪几种查询方式?tag:sql语句
❤2、JDBC基础
1、数据库水平切分,垂直切分
2、数据库索引介绍一下。介绍一下什么时候用Innodb什么时候用MyISAM。
3、数据库两种引擎
4、索引了解嘛,底层怎么实现的,什么时候会失效
5、问了数据库的隔离级别
6、数据库乐观锁和悲观锁
7、数据库的三范式?
8、讲一下数据库ACID的特性?
9、mysql主从复制?
10、leftjoin和rightjoin的区别?
11、数据库优化方法
12、谈一下你对继承映射的理解。
13、说出数据连接池的工作机制是什么?
14、事务的ACID是指什么?
15、JDBC中如何进行事务处理?
❤3、JDBC进阶
1、JDBC的反射,反射都是什么?
2、Jdo是什么?
3、Statement和PreparedStatement有什么区别?哪个性能更好?
4、使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?
五、XML
❤1、XML基础
1、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
❤2、Web Service
1、WEB SERVICE名词解释,JSWDL开发包的介绍,JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
2、请你谈谈对SOAP、WSDL、UDDI的了解?
3、谈谈Java规范中和Web Service相关的规范有哪些?
六、计算机网络
❤1、网络概述
1、TCP协议在哪一层?IP协议在那一层?HTTP在哪一层?
❤2、运输层
1、讲一下TCP的连接和释放连接。
2、TCP有哪些应用场景
3、tcp为什么可靠
4、tcp为什么要建立连接
5、阐述TCP的4次挥手
6、讲一下浏览器从接收到一个URL到最后展示出页面,经历了哪些过程。tag
7、http和https的区别
8、http的请求有哪些,应答码502和504有什么区别
9、http1.1和1.0的区别
10、说说ssl四次握手的过程
11、304状态码有什么含义?
❤3、网络层
1、arp协议,arp攻击
2、icmp协议
3、讲一下路由器和交换机的区别?
❤4、应用层
1、DNS寻址过程
2、负载均衡反向代理模式优点及缺点
七、操作系统
❤1、操作系统概论
1、CentOS 和 Linux的关系?
2、64位和32位的区别?
❤2、进程的描述与控制
1、怎么杀死进程?
2、线程,进程区别
3、系统线程数量上限是多少?
4、进程和线程的区别是什么?
5、解释一下LINUX下线程,GDI类。
❤3、输入输出系统
1、socket编程,BIO,NIO,epoll?
❤4、存储器管理
1、什么是页式存储?
2、操作系统里的内存碎片你怎么理解,有什么解决办法?
❤5、处理机调度与死锁
1、什么情况下会发生死锁,解决策略有哪些?
2、系统CPU比较高是什么原因?
3、系统如何提高并发性?
八、算法与数据结构
❤1、哈希
1、hashset存的数是有序的吗?
2、Object作为HashMap的key的话,对Object有什么要求吗?
3、一致性哈希算法
4、什么是hashmap?
5、Java中的HashMap的工作原理是什么?
6、hashCode()和equals()方法的重要性体现在什么地方?
❤2、树
1、说一下B+树和B-树?
2、怎么求一个二叉树的深度?手撕代码?
3、算法题:二叉树层序遍历,进一步提问:要求每层打印出一个换行符
4、二叉树任意两个节点之间路径的最大长度
5、如何实现二叉树的深度?
6、如何打印二叉树每层的节点?
7、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
❤3、遍历
1、编程题:写一个函数,找到一个文件夹下所有文件,包括子文件夹
2、二叉树 Z 字型遍历
❤4、链表
1、反转单链表
2、随机链表的复制
3、链表-奇数位升序偶数位降序-让链表变成升序
4、bucket如果用链表存储,它的缺点是什么?
5、如何判断链表检测环
❤5、数组
1、寻找一数组中前K个最大的数
2、求一个数组中连续子向量的最大和
3、找出数组中和为S的一对组合,找出一组就行
4、一个数组,除一个元素外其它都是两两相等,求那个元素?
5、算法题:将一个二维数组顺时针旋转90度,说一下思路。
❤6、排序
1、排序算法知道哪些,时间复杂度是多少,解释一下快排?
2、如何得到一个数据流中的中位数?
3、堆排序的原理是什么?
4、归并排序的原理是什么?
5、排序都有哪几种方法?请列举出来。
6、如何用java写一个冒泡排序?
❤7、堆与栈
1、堆与栈的不同是什么?
2、heap和stack有什么区别。
3、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
❤8、队列
1、什么是Java优先级队列(Priority Queue)?
❤9、高级算法
1、题目:
Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the following operations: get and put.
get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
put(key, value) - Set or insert the value if the key is not already present. When the cache reaches its capacity, it should invalidate the least frequently used item before inserting a new item. For the purpose of this problem, when there is a tie (i.e., two or more keys that have the same frequency), the least recently used key would be evicted.
Could you do both operations in O(1) time complexity?
2、id全局唯一且自增,如何实现?
3、如何设计算法压缩一段URL?
4、为什么要设计后缀表达式,有什么好处?
5、LRU算法的实现原理?
九、设计模式
❤1、结构型模式
1、java中有哪些代理模式?
2、如何实现动态代理
3、IO流熟悉吗,用的什么设计模式?
❤2、创建型模式
1、介绍一下单例模式?懒汉式的单例模式如何实现单例?
❤3、行为型模式
1、介绍一下策略模式?
2、设计模式了解哪些,手写一下观察者模式?
❤4、模式汇总
1、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2、j2ee常用的设计模式?说明工厂模式。
3、开发中都用到了那些设计模式?用在什么场合?
4、简述一下你了解的Java设计模式
十、场景题
❤1、场景题汇总
1、情景题:如果一个外卖配送单子要发布,现在有200个骑手都想要接这一单,如何保证只有一个骑手接到单子?
2、场景题:美团首页每天会从10000个商家里面推荐50个商家置顶,每个商家有一个权值,你如何来推荐?第二天怎么更新推荐的商家?
可以借鉴下stackoverflow,视频网站等等的推荐算法。
3、场景题:微信抢红包问题
悲观锁,乐观锁,存储过程放在mysql数据库中。
4、场景题:1000个任务,分给10个人做,你怎么分配,先在纸上写个最简单的版本,然后优化。
全局队列,把1000任务放在一个队列里面,然后每个人都是取,完成任务。
分为10个队列,每个人分别到自己对应的队列中去取务。
5、场景题:保证发送消息的有序性,消息处理的有序性。
6、如何把一个文件快速下发到100w个服务器
7、给每个组分配不同的IP段,怎么设计一种结构使的快速得知IP是哪个组的?
8、10亿个数,找出最大的10个。
建议一个大小为10的小根堆。
9、有几台机器存储着几亿淘宝搜索日志,你只有一台2g的电脑,怎么选出搜索热度最高的十个搜索关键词?
10、分布式集群中如何保证线程安全?
11、给个淘宝场景,怎么设计一消息队列?
12、10万个数,输出从小到大?
先划分成多个小文件,送进内存排序,然后再采用多路归并排序。
13、有十万个单词,找出重复次数最高十个?
十一、UML
❤1、UML
1、请你谈一下UML中有哪些常用的图?