精华内容
下载资源
问答
  • Java中级面试题

    2016-07-11 12:00:21
    Java中级面试题
  • java中级面试题整理

    2018-06-15 11:27:59
    java中级面试题整理,自身经验遇到的问题整理,希望对您有帮助
  • Java中级面试题及答案【最新版及答案,干货!!!这是一个中级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。 Java中级面试永远是程序员...

    Java中级面试题及答案【最新版及答案,干货!!!这是一个中级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。

    Java中级面试永远是程序员迈向成功的第一个门槛,想要面试成功,各种面试题的洗礼是必不可少的,下面就来看看小编精心整理的一些java高级工程师面试题及答案吧。

    如果不背 Java面试题的答案,肯定面试会挂!

    这套Java面试题大全,希望对大家有帮助哈~

    博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

    1、线程与进程的区别

    进程是系统进行资源分配和调度的一个独立单位,线程是CPU调度和分派的基本单位

    进程和线程的关系:

    1、 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

    2、 资源分配给进程,同一进程的所有线程共享该进程的所有资源。

    3、 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

    4、 线程是指进程内的一个执行单元,也是进程内的可调度实体。

    线程与进程的区别:

    1、 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。

    2、 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。

    3、 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。

    4、 系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。

    2、什么是策略模式

    定义了一系列的算法 或 逻辑 或 相同意义的操作,并将每一个算法、逻辑、操作封装起来,而且使它们还可以相互替换。(其实策略模式Java中用的非常非常广泛)

    我觉得主要是为了 简化 if...else 所带来的复杂和难以维护。

    3、什么是游标?

    游标是sql查询结果集的一个指针,与select语句相关联。

    游标关键字是cursor,主要包含两个部分:游标结果集和游标位置。

    1、 游标结果集:执行select语句后的查询结果

    2、 游标位置:一个指向游标结果集内某条记录的指针。

    游标主要有两个状态:打开和关闭。

    1、 只有当游标处于打开状态时,才能够操作结果集中的数据

    2、 当游标关闭后,查询结果集就不存在了

    4、单例模式了解吗?给我解释一下双重检验锁方式实现单例模式!”

    双重校验锁实现对象单例(线程安全)

    说明:

    双锁机制的出现是为了解决前面同步问题和性能问题,看下面的代码,简单分析下确实是解决了多线程并行进来不会出现重复new对象,而且也实现了懒加载

    public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() { } public static Singleton getUniqueInstance() { //先判断对象是否已经实例过,没有实例化过才进入加锁代码 if (uniqueInstance == null) { //类对象加锁 synchronized (Singleton.class) { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } }

    另外,需要注意 uniqueInstance 采用 volatile 关键字修饰也是很有必要。

    uniqueInstance 采用 volatile 关键字修饰也是很有必要的, uniqueInstance = new Singleton(); 这段代码其实是分为三步执行:

    1、 为 uniqueInstance 分配内存空间

    2、 初始化 uniqueInstance

    3、 将 uniqueInstance 指向分配的内存地址

    但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1->3->2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。

    使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。

    5、怎么获取 Java 程序使用的内存?堆使用的百分比?

    可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory()方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。

    6、在java中守护线程和本地线程区别?

    java中的线程分为两种:守护线程(Daemon)和用户线程(User)。

    任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。

    两者的区别

    唯一的区别是判断虚拟机(JVM)何时离开,Daemon是为其他线程提供服务,如果全部的User Thread已经撤离,Daemon 没有可服务的线程,JVM撤离。也可以理解为守护线程是JVM自动创建的线程(但不一定),用户线程是程序创建的线程;比如JVM的垃圾回收线程是一个守护线程,当所有线程已经撤离,不再产生垃圾,守护线程自然就没事可干了,当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。

    扩展

    Thread Dump打印出来的线程信息,含有daemon字样的线程即为守护进程,可能会有:服务守护进程、编译守护进程、windows下的监听Ctrl+break的守护进程、Finalizer守护进程、引用处理守护进程、GC守护进程。

    7、线程之间是如何通信的?

    当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。Object类中wait()\notify()\notifyAll()方法可以用于线程间通信关于资源的锁的状态。

    8、聚集索引与非聚集索引有什么区别?

    所有的索引都是为了更快地检索数据,索引存放在索引页中,数据存放在数据页中,索引以B(balance)树的形式存储

    聚集索引:聚集索引用于决定数据表中的物理存储顺序,一张表最多有一个聚集索引。聚集索引的字段值尽量不能修改,因为修改后,因为修改后数据表的物理顺序需要重写排序。通常主键就是聚集索引

    非聚集索引:非聚集索引的关键自是index,不会决定表的物理存储顺序,在一张表内最多可以有249个非聚集索引。

    9、说一下 ArrayList 的优缺点

    ArrayList的优点如下:

    1、 ArrayList 底层以数组实现,是一种随机访问模式。ArrayList 实现了 RandomAccess 接口,因此查找的时候非常快。

    2、 ArrayList 在顺序添加一个元素的时候非常方便。

    ArrayList 的缺点如下:

    1、 删除元素的时候,需要做一次元素复制操作。如果要复制的元素很多,那么就会比较耗费性能。

    2、 插入元素的时候,也需要做一次元素复制操作,缺点同上。

    3、 ArrayList 比较适合顺序添加、随机访问的场景。

    10、请解释StackOverflowError和OutOfMemeryError的区别?

    通过之前的分析可以发现,实际上每一块内存中都会存在有一部分的可变伸缩区,其基本流程为:如果空间内存不足,在可变范围之内扩大内存空间,当一段时间之后发现内存充足,会缩小内存空间。

    永久代(JDK 1.8后消失了)

    虽然java的版本是JDK1.8,但是java EE 的版本还是jdk1.7,永久代存在于堆内存之中

    元空间

    元空间在Jdk1.8之后才有的,器功能实际上和永久代没区别,唯一的区别在于永久代使用的是JVM的堆内存空间,元空间使用的是物理内存,所以元空间的大小受本地内存影响,一般默认在2M 左右。

    范例:设置一些参数,让元空间出错

    Java -XX:MetaspaceSize=1m

    11、请阐述Catalina的配置文件有哪些?

    Catalina包含的配置文件有:

    1、 ·policy

    2、 ·properties

    3、 ·properties

    4、 ·xml

    5、 ·xml

    6、 ·Tomcat-users.xml

    12、Java中有几种类型的流?

    字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。在http://java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。关于Java的I/O需要注意的有两点:一是两种对称性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式)。另外Java中的流不同于C#的是它只有一个维度一个方向。

    面试题 - 编程实现文件拷贝。(这个题目在笔试的时候经常出现,下面的代码给出了两种实现方案)
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    public final class MyUtil {
        private MyUtil() {
            throw new AssertionError();
        }
        public static void fileCopy(String source, String target) throws IOException {
            try (InputStream in = new FileInputStream(source)) {
                try (OutputStream out = new FileOutputStream(target)) {
                    byte[] buffer = new byte[4096];
                    int bytesToRead;
                    while ((bytesToRead = in .read(buffer)) != -1) {
                        out.write(buffer, 0, bytesToRead);
                    }
                }
            }
        }
        public static void fileCopyNIO(String source, String target) throws IOException {
            try (FileInputStream in = new FileInputStream(source)) {
                try (FileOutputStream out = new FileOutputStream(target)) {
                    FileChannel inChannel = in .getChannel();
                    FileChannel outChannel = out.getChannel();
                    ByteBuffer buffer = ByteBuffer.allocate(4096);
                    while (inChannel.read(buffer) != -1) {
                        buffer.flip();
                        outChannel.write(buffer);
                        buffer.clear();
                    }
                }
            }
        }
    }
    注意:上面用到Java 7的TWR,使用TWR后可以不用在finally中释放外部资源 ,从而让代码更加优雅。

    13、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?

    不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。

    14、什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?

    不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。详情参见答案,一步一步指导你在 Java 中创建一个不可变的类。

    15、怎么利用 JUnit 来测试一个方法的异常?

    http://javarevisited.blogspot.sg/2013/04/JUnit-tutorial-example-test-exception-thrown-by-java-method.html

    16、两个相同的对象会有不同的的 hash code 吗?

    不能,根据 hash code 的规定,这是不可能的。

    17、如果你提交任务时,线程池队列已满,这时会发生什么

    有俩种可能:

    1、 如果使用的是无界队列 LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到阻塞队列中等待执行,因为 LinkedBlockingQueue 可以近乎认为是一个无穷大的队列,可以无限存放任务

    2、 如果使用的是有界队列比如 ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue 中,ArrayBlockingQueue 满了,会根据maximumPoolSize 的值增加线程数量,如果增加了线程数量还是处理不过来,ArrayBlockingQueue 继续满,那么则会使用拒绝策略RejectedExecutionHandler 处理满了的任务,默认是 AbortPolicy

    18、GC日志的real、user、sys是什么意思?

    real 实际花费的时间,指的是从开始到结束所花费的时间。比如进程在等待I/O完成,这个阻塞时间也会被计算在内。user 指的是进程在用户态(User Mode)所花费的时间,只统计本进程所使用的时间,是指多核。sys 指的是进程在核心态(Kernel Mode)花费的CPU时间量,指的是内核中的系统调用所花费的时间,只统计本进程所使用的时间。

    这个是用来看日志用的,如果你不看日志,那不了解也无妨。不过,这三个参数的意义,在你能看到的地方,基本上都是一致的,比如操作系统。

    19、解释 Java 堆空间及 GC?

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

    20、类的实例化顺序

    比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序

    先静态、先父后子。

    先静态:父静态 > 子静态

    优先级:父类 > 子类 静态代码块 > 非静态代码块 > 构造函数

    一个类的实例化过程:

    1、 父类中的static代码块,当前类的static

    2、 顺序执行父类的普通代码块

    3、 父类的构造函数

    4、 子类普通代码块

    5、 子类(当前类)的构造函数,按顺序执行。

    6、 子类方法的执行,

    21、Spring中自动装配的方式有哪些?

    1、 no:不进行自动装配,手动设置Bean的依赖关系。

    2、 byName:根据Bean的名字进行自动装配。

    3、 byType:根据Bean的类型进行自动装配。

    4、 constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。

    5、 autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。

    22、栈帧里面包含哪些东西?

    局部变量表、操作数栈、动态连接、返回地址等

    23、你是如何调用 wait() 方法的?使用 if 块还是循环?为什么?

    处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。

    wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。下面是一段标准的使用 wait 和 notify 方法的代码:

    synchronized (monitor) { // 判断条件谓词是否得到满足 while(!locked) { // 等待唤醒 monitor.wait(); } // 处理其他的业务逻辑 }

    24、ArrayList与LinkedList有什么区别?

    1、 ArrayList与LinkedList都实现了List接口。

    2、 ArrayList是线性表,底层是使用数组实现的,它在尾端插入和访问数据时效率较高,

    3、 Linked是双向链表,他在中间插入或者头部插入时效率较高,在访问数据时效率较低

    25、Super与this表示什么?

    1、 Super表示当前类的父类对象

    2、 This表示当前类的对象

    26、简述Java的对象结构

    Java对象由三个部分组成:对象头、实例数据、对齐填充。

    对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

    实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

    对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐 )

    27、Java 虚拟机栈的作用?

    Java 虚拟机栈来描述 Java 方法的内存模型。每当有新线程创建时就会分配一个栈空间,线程结束后栈空间被回收,栈与线程拥有相同的生命周期。栈中元素用于支持虚拟机进行方法调用,每个方法在执行时都会创建一个栈帧存储方法的局部变量表、操作栈、动态链接和方法出口等信息。每个方法从调用到执行完成,就是栈帧从入栈到出栈的过程。

    有两类异常:① 线程请求的栈深度大于虚拟机允许的深度抛出 StackOverflowError。② 如果 JVM 栈容量可以动态扩展,栈扩展无法申请足够内存抛出 OutOfMemoryError(HotSpot 不可动态扩展,不存在此问题)。

    28、实际开发中应用场景哪里用到了模板方法

    其实很多框架中都有用到了模板方法模式

    例如:

    数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用等等

    29、import java和javax有什么区别

    tech.souyunku.com/EasonJim/p/…

    31、Spring中自动装配的方式有哪些?

    1、 no:不进行自动装配,手动设置Bean的依赖关系。

    2、 byName:根据Bean的名字进行自动装配。

    3、 byType:根据Bean的类型进行自动装配。

    4、 constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。

    5、 autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。

    32、栈帧里面包含哪些东西?

    局部变量表、操作数栈、动态连接、返回地址等

    33、你是如何调用 wait() 方法的?使用 if 块还是循环?为什么?

    处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。

    wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。下面是一段标准的使用 wait 和 notify 方法的代码:

    synchronized (monitor) { // 判断条件谓词是否得到满足 while(!locked) { // 等待唤醒 monitor.wait(); } // 处理其他的业务逻辑 }

    34、ArrayList与LinkedList有什么区别?

    1、 ArrayList与LinkedList都实现了List接口。

    2、 ArrayList是线性表,底层是使用数组实现的,它在尾端插入和访问数据时效率较高,

    3、 Linked是双向链表,他在中间插入或者头部插入时效率较高,在访问数据时效率较低

    35、Super与this表示什么?

    1、 Super表示当前类的父类对象

    2、 This表示当前类的对象

    36、简述Java的对象结构

    Java对象由三个部分组成:对象头、实例数据、对齐填充。

    对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

    实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

    对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐 )

    37、Java 虚拟机栈的作用?

    Java 虚拟机栈来描述 Java 方法的内存模型。每当有新线程创建时就会分配一个栈空间,线程结束后栈空间被回收,栈与线程拥有相同的生命周期。栈中元素用于支持虚拟机进行方法调用,每个方法在执行时都会创建一个栈帧存储方法的局部变量表、操作栈、动态链接和方法出口等信息。每个方法从调用到执行完成,就是栈帧从入栈到出栈的过程。

    有两类异常:① 线程请求的栈深度大于虚拟机允许的深度抛出 StackOverflowError。② 如果 JVM 栈容量可以动态扩展,栈扩展无法申请足够内存抛出 OutOfMemoryError(HotSpot 不可动态扩展,不存在此问题)。

    38、实际开发中应用场景哪里用到了模板方法

    其实很多框架中都有用到了模板方法模式

    例如:

    数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用等等

    39、import java和javax有什么区别

    tech.souyunku.com/EasonJim/p/…

    40、构造器(constructor)是否可被重写(override)?

    构造器不能被继承,因此不能被重写,但可以被重载。

    更多Java 面试题80道

    01、创建socket通讯的步骤?

    02、Java 中 sleep 方法和 wait 方法的区别?

    03、程序计数器(线程私有)

    04、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?

    05、迭代器 Iterator 是什么?

    06、线程的 sleep()方法和 yield()方法有什么区别?

    07、Java 中能创建 volatile 数组吗?

    08、java中equals方法的用法以及==的用法

    09、如何创建一个json对象?

    10、如何判断对象是否是垃圾?

    11、抽象工厂模式和原型模式之间的区别?

    12、在 Java 程序中怎么保证多线程的运行安全?

    13、volatile 修饰符的有过什么实践?

    14、Java中各种数据默认值

    15、说说Java 垃圾回收机制

    16、有没有可能两个不相等的对象有有相同的 hashcode?

    17、synchronized 和 Lock 有什么区别?

    18、什么是Vector

    19、对象的访问定位有哪几种方式?

    20、equals 和 == 的区别?#

    21、什么是ThreadPoolExecutor?

    22、invokedynamic 指令是干什么的?

    23、synchronized、volatile、CAS 比较

    24、Iterator 怎么使用?有什么特点?

    25、被引用的对象就一定能存活吗?

    26、列出一些你常见的运行时异常?

    27、Servlet生命周期内调用的方法过程?

    28、阐述静态变量和实例变量的区别。

    29、类加载器双亲委派模型机制?

    30、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?

    31、如何判断一个对象是否存活

    32、Int与integer的区别

    33、Servlet的生命周期?

    34、怎么唤醒一个阻塞的线程

    35、虚拟DOM的优劣如何?

    36、双亲委派模型是什么?

    37、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?

    38、如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

    39、JVM 出现 fullGC 很频繁,怎么去线上排查问题

    40、JVM 内存区域

    41、Parallel Old 收集器(多线程标记整理算法)

    42、对象分配内存是否线程安全?

    43、当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法?

    44、Serial 与 Parallel GC 之间的不同之处?

    45、为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里?

    46、redux异步中间件之间的优劣?

    47、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?

    48、Hibernate中Session的load和get方法的区别是什么?

    49、说一下堆内存中对象的分配的基本策略

    50、Java 中如何将字符串转换为整数?

    51、讲讲什么情况下会出现内存溢出,内存泄漏?

    52、乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

    53、线程与进程的区别?

    54、Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别?

    55、用代码演示三种代理

    56、stackoverflow错误,permgen space错误

    57、分代收集算法

    58、同步方法和同步块,哪个是更好的选择?

    69、Java 中的编译期常量是什么?使用它又什么风险?

    70、Java死锁以及如何避免?

    71、日期和时间:

    72、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

    73、依赖注入和工程模式之间有什么不同?

    74、Java 堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)

    75、如何修改tomcat的端口号?

    76、Java有没有goto?

    77、Java 内存分配与回收策率以及 Minor GC 和 Major GC

    78、简述Hibernate常见优化策略。

    79、Statement与preparedStatement区别

    80、什么是DAO模式?

    如果不背 Java面试题的答案,肯定面试会挂!

    这套Java面试题大全,希望对大家有帮助哈~

    博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

    展开全文
  • java中级面试题

    千次阅读 2021-02-28 12:10:12
    本帖最后由 唯我独赞mo 于 2015-11-12 22:47 编辑1、 java中wait和sleep有什么区别?多线程条件下如何保证数据安全?答:最大区别是等待时wait会释放锁,而sleep会一直持有锁,wait通常用于线程时交互,sleep通常被...

    本帖最后由 唯我独赞mo 于 2015-11-12 22:47 编辑

    1、 java中wait和sleep有什么区别?多线程条件下如何保证数据安全?

    答:最大区别是等待时wait会释放锁,而sleep会一直持有锁,wait通常用于线程时交互,sleep通常被用于暂停执行。

    2、java中volatile和synchronized有什么区别?

    1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。

    2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。

    3.volatile仅能实现变量的修改可见性,并不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。

    4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。

    5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。

    3、java抽象类和接口有什么区别?项目中怎么去使用它们?

    相同点:

    A. 两者都是抽象类,都不能实例化。

    B. interface实现类及abstractclass的子类都必须要实现已经声明的抽象方法。

    不同点:

    A. interface需要实现,要用implements,而abstract class需要继承,要用extends。

    B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。

    C. interface强调特定功能的实现,而abstract class强调所属关系。

    D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的 形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。

    使用:

    abstract:在既需要统一的接口,又需要实例变量或缺省的方法的情况下,使用abstract;

    interface:使用: 类与类之前需要特定的接口进行协调,而不在乎其如何实现。 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

    4、对socket熟悉?TCP通讯有几次握手?有使用过哪些socket框架?

    答:3次握手,客户端-->服务端,服务端-->客户端,客户端-->服务端,当这些过程完成之后,才真正建立起通信。java中比较有名的socket框架有:mina,netty,都是韩国小棒子写的。

    5、了解java反射机制?反射生成类,能访问私有变量?

    答:即动态生成java的实例,可以

    6、JVM内存模型是如何?垃圾回收机制有哪些?如何对JVM进行调优?

    答:由栈和堆组成,栈是运行时单位,堆内存则分为年轻代、年老代、持久代等,年轻代中的对象经过几次的回收,仍然存在则被移到年老代;持久代主要是保存class,method,filed等对象。

    sun回收机制:主要对年轻代和年老代中的存活对象进行回收,分为以下:

    年轻代串行(Serial Copying)、年轻代并行(ParNew)、年老代串行(Serial MSC),年老代并行(Parallel Mark Sweep),(Concurrent Mark-Sweep GC,即CMS)等等,目前CMS回收算法使用最广泛。

    JVM调优主要是对堆内容和回收算法进行配置,需要对jdk产生的回收日志进行观察,同时通过工具(Jconsole,jProfile,VisualVM)对堆内存不断分析,这些优化是一个过程,需要不断地进行观察和维护

    展开全文
  • 一、对象的实例化 ...Constructor的newInstance(Xxx):反射的方式,位于java.lang.reflect.Constructor 可以调用空参、带参的构造器,权限没有要求 使用clone() :不调用任何构造器,当前类需

    一、对象的实例化

    1.创建对象的方式

    • new:最常见的方式(本质是构造器)

      变形1 : Xxx的静态方法

      变形2 : XxBuilder/XxoxFactory的静态方法

    • Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public

    • Constructor的newInstance(Xxx):反射的方式,位于java.lang.reflect.Constructor 可以调用空参、带参的构造器,权限没有要求

    • 使用clone() :不调用任何构造器,当前类需要实现Cloneable接口,实现clone()

    • 使用反序列化:从文件中、从网络中获取一个对象的二进制流

    • 第三方库Objenesis

    2.创建对象的步骤

    1.判断对象对应的类是否加载、链接、初始化

    虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。( 即判断类元信息是否存在)。

    如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为Key进行查找对应的.class文件。如果没有找到文件,则抛出ClassNotFoundException异常,如果找到,则进行类加载,并生成对应的Class类对象

    2.为对象分配内存

    首先计算对象占用空间大小,接着在堆中划分一块内存给新对象。 如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小。

    • 如果内存规整,使用指针碰撞
      如果内存是规整的,那么虚拟机将采用的是指针碰撞法(BumpThePointer)来为对象分配内存。意思是所有用过的内存在一边,空闲的内存在另外一边,中间放着一个指针作为分界点的指示器,分配内存就仅仅是把指针向空闲那边挪动一段与对象大小相等的距离罢了。如果垃圾收集器选择的是Serial、ParNew这种基于压缩算法的,虚拟机采用这种分配方式。所以一般使用带有compact(整理)过程的收集器时,使用指针碰撞。
    • 如果内存不规整,虚拟机需要维护一个列表,使用空闲列表分配
      如果内存不是规整的,已使用的内存和未使用的内存相互交错,那么虛拟机将采用的是空闲列表法来为对象分配内存。意思是虚拟机维护了一个列表,记录上哪些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。这种分配方式成为“空闲列表(Free List) ”。

    说明:选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

    3.处理并发安全问题

    在分配内存空间时,另外一个问题是及时保证new对象时候的线程安全性:创建对象是非常频繁的操作,虚拟机需要解决并发问题。虚拟机采用 了两种方式解决并发问题:

    • CAS ( Compare And Swap )失败重试、区域加锁:保证指针更新操作的原子性;
    • TLAB把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲区,(TLAB ,Thread Local Allocation Buffer) 虚拟机是否使用TLAB,可以通过一XX:+/一UseTLAB参数来 设定。
    4.初始化分配到的空间

    Java给对象的属性赋值的操作有如下四种:

    • 属性的默认初始化
    • 显式初始化
    • 代码块中初始化
    • 构造器中初始化

    内存分配结束,虚拟机将分配到的内存空间都初始化为零值(不包括对象头)。这一步保证了对象的实例字段在Java代码中可以不用赋初始值就可以直接使用,程序能访问到这些字段的数据类型所对应的零值。

    5.设置对象的对象头

    将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。这个过程的具体设置方式取决于JVM实现。

    6.执行init方法进行初始化

    在Java程序的视角看来,初始化才正式开始。初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。 因此一般来说(由字节码中是否跟随有invokespecial指令所决定),new指令之 后会接着就是执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全创建出来。

    二、对象的内存布局

    1.对象头(Header)

    包含两部分

    • 运行时元数据
      • 哈希值( HashCode )
      • GC分代年龄
      • 锁状态标志
      • 线程持有的锁
      • 偏向线程ID
      • 偏向时间戳
    • 类型指针:指向类元数据的InstanceKlass,确定该对象所属的类型

    说明:如果是数组,还需记录数组的长度

    2.实例数据(Instance Data)

    说明:它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段) 规则:

    • 相同宽度的字段总被分配在一起
    • 父类中定义的变量会出现在子类之前
    • 如果CompactFields参数为true(默认为true),子类的窄变量可能插入到父类变量的空隙

    3.对齐填充(Padding)

    不是必须的,也没特别含义,仅仅起到占位符作用

    最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分

    戳这里免费领取下面所有资料

    戳这里免费领取下面所有资料

    [外链图片转存中…(img-ME8o3HTO-1625653329566)]

    展开全文
  • Java中级面试题合集

    2021-02-27 16:58:16
    Java中级面试题合集:1.弹出式选择菜单(Choice)和列表(List)有什么区别Choice是以一种紧凑的形式展示的,需要下拉才能看到所有的选项。Choice中一次只能选中一个选项。List同时可以有多个元素可见,支持选中一个或者...

    Java中级面试题合集:1.弹出式选择菜单(Choice)和列表(List)有什么区别

    Choice是以一种紧凑的形式展示的,需要下拉才能看到所有的选项。Choice中一次只能选中一个选项。List同时可以有多个元素可见,支持选中一个或者多个元素。

    2.如何确保N个线程可以访问N个资源同时又不导致死锁?

    使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

    3.如何权衡是使用无序的数组还是有序的数组?

    有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。

    4.串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?

    吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。

    5.弹出式选择菜单(Choice)和列表(List)有什么区别

    Choice是以一种紧凑的形式展示的,需要下拉才能看到所有的选项。Choice中一次只能选中一个选项。List同时可以有多个元素可见,支持选中一个或者多个元素。

    6.数据库连接池是什么意思?

    像打开关闭数据库连接这种和数据库的交互可能是很费时的,尤其是当客户端数量增加的时候,会消耗大量的资源,成本是非常高的。可以在应用服务器启动的时候建立很多个数据库连接并维护在一个池中。连接请求由池中的连接提供。在连接使用完毕以后,把连接归还到池中,以用于满足将来更多的请求。

    7.doGet()方法和doPost()方法有什么区别?

    doGet:GET方法会把名值对追加在请求的URL后面。因为URL对字符数目有限制,进而限制了用在客户端请求的参数值的数目。并且请求中的参数值是可见的,因此,敏感信息不能用这种方式传递。

    doPOST:POST方法通过把请求参数值放在请求体中来克服GET方法的限制,因此,可以发送的参数的数目是没有限制的。最后,通过POST请求传递的敏感信息对外部客户端是不可见的。

    8.HTTP响应的结构是怎么样的?

    HTTP响应由三个部分组成:

    状态码(Status Code):描述了响应的状态。可以用来检查是否成功的完成了请求。请求失败的情况下,状态码可用来找出失败的原因。如果Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.SC_OK。

    HTTP头部(HTTP Header):它们包含了更多关于响应的信息。比如:头部可以指定认为响应过期的过期日期,或者是指定用来给用户安全的传输实体内容的编码格式。如何在Serlet中检索HTTP的头部看这里。

    主体(Body):它包含了响应的内容。它可以包含HTML代码,图片,等等。主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成的。

    展开全文
  • 以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频 戳这里免费领取文中资料 [外链图片转存中…(img-DGQ6IXv7-1628077328596)] [外链图片转存中…(img-cIKj9t9X-1628077328597)] [外链图片...
  • JAVA中级面试题

    千次阅读 多人点赞 2021-12-21 17:23:00
    java中级面试题
  • 真实面试题记录 基础模块 擅长什么技术? 框架模块 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来...
  • 2020-java中级面试题

    千次阅读 2020-12-06 10:34:09
    jdk JVM、JRE、JDK之间的关系 三者的关系 JDK=JRE+其他 JRE=JVM+其他 JDK(java development kit) JDK是Java开发工具包,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。 JRE(java ...
  • NULL 博文链接:https://it-fan.iteye.com/blog/1182088
  • Java中级面试题及答案整理

    千次阅读 2019-02-08 10:45:26
    1、webservice是什么? webservice是一种跨编程语言和跨操作系统的远程调用技术,遵循SOPA/WSDL规范。 2、springCloud是什么? springcloud是一个微服务框架,并提供全套分布式...3、Java中堆和栈有什么不同? ...
  • 最常见的Java面试题及答案汇总(一)和Java高级面试题整理(附答案),值得拥有,真的值得拥有,真的值得拥有,真的值得拥有。
  • java 中级面试题及答案

    千次阅读 2020-09-25 14:28:06
    java 中级面试题及答案 1.MyBatis中,根据Id查询单个Order对象,动态SQL如何编写? A. SELECT * FROM Order WHERE ID = #{id}; B. SELECT * FROM Order WHERE ID = #{id}; C. SELECT * FROM Order WHERE ID = #{id...
  • Java中级面试题及答案解析(8)

    千次阅读 2018-04-04 16:07:16
     Javaweb练手项目源码下载常用设计模式完整系列篇100套IT类简历模板下载Java常见面试题汇总篇数据库的三大范式1 、第一范式(1NF)在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式...
  • java中级面试题(自己汇总)
  • 大厂真题之中国平安-Java中级.pdf
  • 2018java面试题

    2018-01-30 10:22:27
    压缩包里包含了面试过程中经常问到的知识点,还包含了同事面试时遇到的面试题,并且有详细的答案,各大框架的搭建步骤等等,面试必备~
  • JAVA 中级面试题 (附答案)

    万次阅读 多人点赞 2018-02-26 17:18:55
    问题大多取自点击打开链接 在网上找了一些答案,也添加了一些几乎是必问的 一、 基础知识: 1) HashMap,LinkedHashMap,TreeMap的区别 1. HashMap,LinkedHashMap,TreeMap都属于Map。 2. Map的主要作用是...
  • java中高级面试题十大总结 java中高级面试题十大总结 java中高级面试题十大总结 java中高级面试题十大总结
  • 来源微信号:Java知音专注于Java领域,每天推送全网高质量技术文章,热门开源项目,实用视频教程等。致力打造一个有实用,有情怀的Java技术文章推送平台!1、一个".java"源文件中是否可以包括多个类(不是内部类)?有...
  • Java中级面试题及答案解析(4)

    万次阅读 2018-03-14 12:38:33
    知音专栏 Javaweb练手项目源码下载常用设计模式完整系列篇100套IT类简历模板下载Java常见面试题汇总篇这里选了几道高频面试题以及一些解答。不一定全部正确,有一些是没有固定答案的,如果发现有错误的欢迎纠正,...
  • 最新中级Java面试题及答案

    千次阅读 2021-02-12 10:10:02
    1.Java的HashMap是如何工作的?HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值。HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时...
  • Java中的异常处理机制的简单原理和应用,Java的接口和C++的虚类的相同和不同处等问题,适合初学者
  • 所以接下来的面试题是我从自己和其他人的面试经历中总结出来的,可能也不是很全面,毕竟Java的技术点还是很多的,我所总结的不过是九牛一毛。希望能帮助到你。 架构原则:“4 要 1 不要” 如果你是一个架构师,你...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,469
精华内容 4,187
关键字:

java中级面试题

java 订阅