这是基础面试题之第二部分,因为题目比较多,所以有写就没展开讲,供大家巩固和参考。如果答案有什么疑问或者本人有理解错的地方,欢迎大家批评指正。
16.说说HaspMap底层原理?再说说它跟HaspTable和ConcurrentHashMap他们之间的相同点和不同点?ConcurrentHashMap怎么做到线程安全
参见
HashMap的原理详见 HashMap深度分析疑问
ConcurrentHashMap的原理详见ConcurrentHashMap深度分析疑问
17.http 默认端口,https 默认端口,HTTP状态码(最好结合使用场景,比如在缓存命中时使用哪个)
http:80,https:443,http的状态码:200,301(重定向),401(未授权),403(服务器拒绝请求),500(内部错误)
18.DNS 你知道是干嘛的吗?说说怎么工作的
dns域名解析。
找缓存
找本机的hosts文件
找DNS服务器(递归查找)
19.git rebase 和 merge 有什么区别?
两个命令都是将一个分支合并到另一个分支上去。merge是会保留所有的提交历史,只解决一次冲突。而rebase的话,则有可能会解决多次冲突,提交历史只会有一份,比较简洁
20.fail-fast 与 fail-safe 机制有什么区别,Fail-Fast机制是多线程原因造成的吗?
快速失效与安全失效. java.util包下所有集合都是用fail-fast的,而java.util. concurrent都是fail-safe。fail-fast会抛出ConcurrentModificationException。fail-fast机制不是多线程原因造成的
fail-fast产生的条件
(1)集合创建的时候,遍历集合时,修改了结构
(2)当一个线程在遍历这个集合时,另一个集合在修改集合
只有当维护的mode=expectedModeCount时,才不会抛异常
fail-safe机制有两个问题
(1)需要复制集合,产生大量的无效对象,开销大
(2)无法保证读取的数据是目前原始数据结构中的数据。
fail-fast与fail-self
21.Java 11/Java 8 / 为我们提供了什么新功能
java8
lambada表达式(Lambda Expressions)。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
方法引用(Method references)与lambda联合使用,可以使语言的构造更紧凑简洁,减少冗余代码。
默认方法(Default methods)。默认方法允许将新功能添加到库的接口中,并确保兼容实现老版本接口的旧有代码。
Stream API 。新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。Stream API集成到了Collections API里。
HashMap改进,在键值哈希冲突时能有更好表现。
Date Time API。加强对日期和时间的处理。
java.util 包下的改进,提供了几个实用的工具类。
并行数组排序。
标准的Base64编解码。
支持无符号运算。
java.util.concurrent 包下增加了新的类和方法。
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.ForkJoinPool类新增了方法以支持 common pool。
新增了java.util.concurrent.locks.StampedLock类,为控制读/写访问提供了一个基于性能的锁,且有三种模式可供选择。
HotSpot
删除了 永久代(PermGen).
方法调用的字节码指令支持默认方法。
java11
支持Unicode 10.0,在jdk10中是8.0。
标准化HTTP Client
编译器线程的延迟分配。添加了新的命令-XX:+UseDynamicNumberOfCompilerThreads动态控制编译器线程的数量。
新的垃圾收集器—ZGC。一种可伸缩的低延迟垃圾收集器(实验性)。
Epsilon。一款新的实验性无操作垃圾收集器。Epsilon GC 只负责内存分配,不实现任何内存回收机制。这对于性能测试非常有用,可用于与其他GC对比成本和收益。
Lambda参数的局部变量语法。java10中引入的var字段得到了增强,现在可以用在lambda表达式的声明中。如果lambda表达式的其中一个形式参数使用了var,那所有的参数都必须使用var
22.什么是 Web Service(Web服务)
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的Web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发式的互操作的应用程序。
Web service技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。依据Web service规范实施的应用之间,
无论它们所使用的语言、平台或者内部协议是是什么,都可以相互交换数据。
23.一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制
这个是可以的,但是只能有一个public类,并且类名与文件名一样。如果有两个pulic的类,或者public类名与文件名不一样,就会导致报错
24.什么是finalize()方法?finalize()方法什么时候被调用;final 和 finalize 的区别
finalize()方法是Object类的一个protected方法,所以所有的类都可以调用Object类的finalize()方法,也可以自己去重写finalize()方法。
1.只有重写了finalize()方法的类的对象的finalize()方法才会在第一次扫描的时候被执行 2.由于Finalizer线程优先级低,所以即使重写了finalize()方法,GC也不保证对象的finalize()方法会被及时执行以及执行成功,哪怕经历多次GC
3.一个对象的finalize()方法只会被执行一次,这里说的一次指的是虚拟机自己调用,自己代码中手动调用想调几次调几次
4.finalize()方法是对象逃离被回收最后的机会,如果对在finalize()方法执行之后没有变成可达,将彻底被回收
5.但是由于finalize()方法被调用的不确定性,强烈建议大家不要使用这个方法
final和finalize方法其实没有任何关联,要说区别的变化,final可以修饰,类,方法,变量。finalize方法是虚拟机调用进行gc用的,调用存在不确定性
25.inal 与 static 关键字可以用于哪里?它们的作用是什么?使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
static是java中非常重要的一个关键字
用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;
静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。
final关键字是我们经常使用的关键字之一
用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值,对于引用对象来说,使用final修饰,只是它的引用不会发生变化,引用对象的值还是可以改变的
用来修饰方法参数,表示在变量的生存期中它的值不能被改变;
修饰方法,表示该方法无法被重写;
修饰类,表示该类无法被继承。
使用final修饰一个变量时,时引用不能变,引用的对象还是可以变的
26.能否在运行时向 static final 类型的赋值
可以,如果用反射,就可以做到在运行时,对final类型的变量赋值
27.transient变量有什么特点
1、transient只能修饰成员变量,不能修饰局部变量、方法和类。
2、用户自定义的类变量,需要实现 Serilizable 接口才能被 transient 修饰。
3、被 transient 关键字修饰的变量不再能被序列化,一个静态变量不管是否被 transient 修饰,均不能被序列化。
4、一旦变量被 transient 修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
28 .简述九种基本数据类型的大小,以及他们的封装类
1.封装类是引用类型,基本类型在传递参数的时候都是按值传递,而封装类型是按引用传递的(其实引用也是按值传递的,但是传递的是对象的地址)
java 九种数据类型对照表
2.它们的默认值不同基础数据类型是0和封装类型是null,基本数据类型都是final修饰的,不能继承扩展新的类和方法
3.基本类型在内存中存储在栈中,引用类型的引用(值的地址)存储在栈中,而实际的对象(值)是存在堆中
4.byte->short->int->long->float->double 反方向要求必须强制数据类型转换
29.int 和 Integer 哪个会占用更多的内存? int 和 Integer 有什么区别?parseInt()函数在什么时候使用到
Integer会占用更多的内存,以下为int和Integer的区别:
Integer是int的包装类,int则是java的一种基本数据类型
Integer变量必须实例化后才能使用,而int变量不需要
Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
Integer的默认值是null,int的默认值是0
parseInt()将字符串转为整数的时候,radix:可选,表示要解析的熟悉的基数
30 float和double的默认值是多少?
它们的默认值都是0.0
网友评论