Java高级面试题及答案,
又有大批人要换工作了,这里整理了很全的java面试笔试题,希望对大家有所帮助!也可以直接在这里查看:
其实,博主还整理了,更多大厂面试题,直接下载吧
Class 文件是一组以 8 位字节为基础单位的二进制流。各个数据项严格按顺序排列。
Class 文件格式采用一种类似于 C 语言结构体的伪结构来存储数据。这样的伪结构仅仅有两种数据类型:无符号数和表。
无符号数:是基本数据类型。以 u1、u2、u4、u8 分别代表 1 个字节、2 个字节、4 个字节、8 个字节的无符号数,能够用来描写叙述数字、索引引用、数量值或者依照 UTF-8 编码构成的字符串值。
表:由多个无符号数或者其它表作为数据项构成的复合数据类型。全部表都习惯性地以 _info 结尾。
原子性:
一个原子,也就是不能再分的粒子。原子性是指一个或多个操作要么全部成功,要么全部失败。
可见性:
一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile)
有序性:
程序执行的顺序遵循代码执行的顺序。(处理器可能会重新排序指令)
Bootstrap ClassLoader(启动类加载器) Extention ClassLoader(扩展类加载器) App ClassLoader(应用类加载器)
线程调度器选择优先级最高的线程运行,但是,如果发生以下情况,就会终止线程的运行:
1、 线程体中调用了yield方法让出了对cpu的占用权利
2、 线程体中调用了sleep方法使线程进入睡眠状态
3、 线程由于IO操作受到阻塞
高级java程序员掌握技能
4、 另外一个更高优先级线程出现
5)在支持时间片的系统中,该线程的时间片用完
冒泡排序几乎是个程序员都写得出来,但是面试的时候如何写一个逼格高的冒泡排序却不是每个人都能做到,下面提供一个参考代码:
import java.util.Comparator;
/
* 排序器接口(策略模式: 将算法封装到具有共同接口的独立的类中使得它们可以相互替换)
* @author骆昊
*
*/
public interface Sorter {
  /
    * 排序
    * @param list 待排序的数组
    */
  public <T extends Comparable<T>> void sort(T[] list);
  /
    * 排序
    * @param list 待排序的数组
    * @param p 比较两个对象的比较器
    */
  public <T> void sort(T[] list, Comparator<T> p);
}
import java.util.Comparator;
/
* 冒泡排序
*
* @author骆昊
*
*/
public class BubbleSorter implements Sorter {
    @Override
    public <T extends Comparable<T>> void sort(T[] list) {
        boolean s = true;
        for (int i = 1, len = list.length; i < len && s; ++i) {
            s = false;
            for (int j = 0; j < len - i; ++j) {
                if (list[j]pareTo(list[j + 1]) > 0) {
                    T temp = list[j];
                    list[j] = list[j + 1];
                    list[j + 1] = temp;
                    s = true;
                }
            }
        }
    }
    @Override
    public <T> void sort(T[] list, Comparator<T> p) {
        boolean s = true;
        for (int i = 1, len = list.length; i < len && s; ++i) {
            s = false;
            for (int j = 0; j < len - i; ++j) {
                if (ppare(list[j], list[j + 1]) > 0) {
                    T temp = list[j];
                    list[j] = list[j + 1];
                    list[j + 1] = temp;
                    s = true;
                }
            }
        }
    }
}
对象头区域此处存储的信息包括两部分:1、对象自身的运行时数据( MarkWord ),占8字节 存储 hashCode、GC 分代年龄、锁类型标记、偏向锁线程 ID 、 CAS 锁指向线程 Lock
Record 的指针等, synconized 锁的机制与这个部分( markwork )密切相关,用 markword 中最低的三位代表锁的状态,其中一位是偏向锁位,另外两位是普通锁位。2、对象类型指针( Class Pointer ),占4字节 对象指向它的类元数据的指针、 JVM 就是通过它来确定是哪个 Class 的实例。
实例数据区域 此处存储的是对象真正有效的信息,比如对象中所有字段的内容
对齐填充区域 JVM 的实现 HostSpot 规定对象的起始地址必须是 8 字节的整数倍,换句话来说,现在 64 位的 OS 往外读取数据的时候一次性读取 64bit 整数倍的数据,也就是 8 个字节,所以 HotSpot 为了高效读取对象,就做了"对齐",如果一个对象实际占的内存大小不是 8byte 的整数倍时,就"补位"到 8byte 的整数倍。所以对齐填充区域的大小不是固定的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。