Java基础

1.Java 中 java.util.Date 与 java.sql.Date 有什么区别?

java.sql.Date 是针对 SQL 语句使用的,它只包含日期而没有时间部分,它们都有 getTime 方法返回毫秒数,自然就可以直接构建。java.util.Date 是 java.sql.Date 的父类,前者是常用的表示时间的类,我们通常格式化或者得到当前时间都是用他,后者之后在读写数据库的时候用他,因为 PreparedStament 的 setDate()的第 2 参数和 ResultSet 的 getDate()方法的第 2 个参数都是 java.sql.Date。

2.JRE、JDK、JVM 及 JIT 之间有什么不同?

>>JRE 代表 Java 运行时(Java run-time),是运行 Java 应用所必须的。JDK 代表 Java 开发工具(Java development kit),是 Java 程序的开发工具,如 Java 编译器,它也包含 JRE。JVM 代表 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。
>>JIT 代表即时编译(Just In Time compilation),当代码执行的次数超过一定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提高 Java 应用的性能。

3.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

finally 一定会执行,即使是 catch 中 return 了,catch 中的 return 会等 finally 中的代码执行完之后,才会执行。

4.请说明一下 final、finally、finalize 的区别

参考回答:
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

5.请解释为什么会出现 4.0-3.6=0.40000001 这种现象?

参考回答:二进制的小数无法精确的表达十进制小数,计算机在计算十进制小数的过程中要先转换为二进制进行计算,这个过程中出现了误差.

请说明一下,在 Java 中如何跳出当前的多重嵌套循环?

参考回答:在最外层循环前加一个标记如 A,然后用 break A;可以跳出多重循环。(Java 中支持带标签的 break 和 continue 语句,作用有点类似于 C 和 C++中的 goto 语句,但是就像要避免使用 goto 一样,应该避免使用带标签的 break 和 continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道更好),根本不能进行字符串的 equals 比较,否则会产生 NullPointerException 异常。

说一下 JVM 有哪些垃圾回收算法?

标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。
标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。

Java 中的 LinkedList 是单向链表还是双向链表?

是双向链表,你可以检查 JDK 的源码。在 Eclipse,你可以使用快捷键 Ctrl + T,直接在编辑器中打开该类。

如果客户端禁止 cookie 能实现 session 还能用吗?

可以用,session 只是依赖 cookie 存储 sessionid,如果 cookie 被禁用了,可以使用 url 中添加 sessionid 的方式保证 session 能正常使用。

Java 中,Serializable 与 Externalizable 的区别?

Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱而且不安全。
Externalizable 允许你控制整个序列化过程,指定特定的二进制格式,增加安全机制。

synchronized 的原理

1.java 虚拟机中的同步是用 monitor 的进入和退出来实现的。
任何对象都有一个 monitor 与之关联。当且仅当一个 monitor 被持有后,这个对象才会处于锁定状态。
2.monitor 的进入实现锁定
当 objectref(引用类型数据)的 monitor 的进入计数器为 0,那么线程可以成功进入 monitor,并且将计数器的值设置为 1,当前线程就是 monitor 的所有者.
如果当前线程已经拥有了 monitor,那么可以重新进入这个 monitor,并且计数器值+1.
如果其他线程已经持有了 monitor,那么当前线程将被阻塞,直到 monitor 的进入计数器变为 0,才能重新尝试获取 monitor 的所有权.
3.monitor 的退出实现解锁
线程把 monitor 的进入计数器值-1,如果-1 之后计数器的值为 0,那么线程退出 monitor,当前线程不在是这个 monitor 的持有者,其他被 monitor 阻塞的线程可以尝试获取 monitor 的所有权
4.方法同步使用隐式同步
方法级的同步是隐式的,它实现在方法调用(invokevirtual 等)指令、返回(ireturn 等)、athrow 指令之中。
虚拟机在调用方法前,先从方法常量池中的方法表结构(method_info structure)中找到 ACC_SYNCHRONIZED,根据此访问标志来判断一个方法是否是同步方法。
如果此标志设置了被调用的方法为同步方法,方法调用指令则会尝试进入 monitor 对象。
当方法执行完毕,在调用退出指令时,则调用返回指令来执行 monitor 的退出。
如果方法执行过程中,遇到异常,则会执行 athrow 异常指令来执行 monitor 的退出。
5.代码块使用显示同步
对于代码块的同步,jvm 使用 monitorenter 指令来执行 monitor 的进入,使用 monitorexit 指令来执行 monitor 的退出
对于同步代码块的异常情况,编译器会自动产生一个异常处理器,异常处理器中会执行 monitorexit 指令,保证 monitor 的退出

请简单介绍一下 hashSet 的原理

hashset 是单列集合,特点是不重复,没有索引,存取无序。
jdk1.7 以前底层是链表加数组,8 版本以后当链表的长度大于等于 8 时,自动转为红黑树

说一下 HashMap 的实现原理?

HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱鱼的可爱喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值