Java中常见的面试题总结_摘自牛客网

  • 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”
  • JDK和JRE的区别是什么?
  • static关键字是什么意思?Java中是否可以覆盖(override)一个private或者static方法
  • 是否可以在static环境中访问非static变量?
  • java支持的数据类型有哪些?什么是自动拆装箱?
    • 八大数据类型:byte/short/int/long/double/float/boolean/char
    • 自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化,例如将int转化成Integer为自动装箱。反之为自动拆箱。
    • JVM中虚拟栈中存的是对象的地址,创建的对象实质在堆中。通过地址来找到堆中对象的过程叫做引用类型
  • Java中的方法覆盖(Overridong)和方法重载(Overloading)是什么意思?
    • 方法重载是发生在通一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。
    • 方法覆盖必须有相同的方法名,参数列表和返回类型。是子类重新定义父类方法。覆盖者可能不会限制它所覆盖的方法访问。
  • Java中什么是构造方法?什么是复制构造方法?
    • 当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法,在程序员没有给类提供构造方法的时候,Java编译器会自动添加该类的默认构造方法。
    • Java不支持像C++中那样的复制构造方法,这个不同点是因为如果你自己不写构造方法的情况下,Java不会创建默认的复制构造方法。
  • Java支持多继承么?
    • Java中类不支持多继承,一个类只能有一个父类。但是Java接口支持多继承,即一个子接口可以有多个父接口。
  • 接口和抽象类的区别:
    • 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
    • 抽象类中的成员变量可以是各种类型的,而接口的成员变量只能是public static final类型
    • 抽象类中可以有静态代码块与静态方法,而接口没有。
    • 一个类可以实现多个接口,一个类只能继承一个抽象类
  • Java中值传递和引用传递的区别?
    • int b = a;a将值传给了b
    • Object objTest = obj;这个是址传递,将obj栈中指向堆中的对象地址赋值给了objectTest
  • Java中进程和线程之间的区别?
    • 开启了一个qq相当于开启了一个进程,开启了一个迅雷,相当于开启了一个进程。QQ中弹出消息对话框,相当于开启了一个线程。进程是爹,管理着多个线程儿子。
    • 两者的区别在于,进程间相互独立。线程上下文切换比进程上下文切换要快得多
  • 创建线程有几种不同的方式?你喜欢哪一种?为什么?
    • 继承Thread类
    • 实现Runnable接口
    • 应用程序可以使用Executor框架来创建线程池
    • 实现Callable接口
      • 实现Runnable接口方式更受欢迎,因为不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承,但是Java不支持多继承,只能实现接口。
  • 同步方法和同步代码块的区别是什么?
    • 同步方法默认用this或者当前类class对象作为锁;
    • 同步代码块可以选择以什么来加锁,比同步方法更要细颗粒度,我们可以选择只会发生同步问题的部分代码而不是整个方法。
    • 同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用   synchronized(object){代码内容}进行修饰;
  • 在监视器内部是如何做线程同步的?程序应该做哪种级别的同步?
    • 监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码块。
  • 什么是死锁?
    • 所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都无法向前推进。
    • 死锁产生的四个必要条件:
      • 互斥条件
        • 进程要求对分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源只能等待。
      • 不剥夺条件
        • 进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,只能主动释放
      • 请求和保持条件
        • 进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程所占有,此时请求进程被阻塞,但对自己获得的资源保持不放。
      • 循环等待条件
        • 存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一进程所请求。
  • 如何确保N个线程可以访问N个资源同时又不导致死锁?
    • 指定获取锁的顺序,并强制线程按照指定的顺序获取锁,因此,所有与的线程以同样的顺序加锁和释放锁,就不会出现死锁了。
  • Java集合类框架的基本接口有哪些?
    • Collection:代表一组对象,每一个对象都是它的子元素。
    • Set:不包含重复元素的Collection
    • List:有顺序的collection,并且可以包含重复元素
    • Map:可以把键映射到值的对象,键不能重复。
  • 为什么集合类没有实现Cloneable和Serializable接口?
    • 克隆或者是序列化的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。
  • 什么是迭代器?
    • Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove,可以通过迭代器的remove方法删除
  • Iterator和ListIterator的区别是什么?
    • Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List
    • Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
    • ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引。
  • 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
    • Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。
    • Java-util包下面所有的集合类都是快速失败的,而Java.util.concurrent包下面的所有的类都是安全失败的。
  • Java中HashMap的工作原理、
    • HashMap的底层是用hash数组和单向链表实现的,当调用put方法时,首先计算key的hashcode,定位到合适的数组索引,然后再在该索引上的单向链表进行循环遍历用equals比较key是否存在,如果存在则用新的value覆盖原值,如果没有则插入单向链表的头部。
    • get的时候,先定位到数组元素,再遍历该元素处的链表。
    • HashMap的一些重要特性是它的容量(capacity)16,负载因子(load factor)0.75,和扩容极限(threshold resizing)
    • 当元素容量大于capacity*loadfactor时,容器会进行扩容resize为2n,在初始化HashMap时,可以对两个值进行修改,负载因子0.75被证明为是性能比较好的取值,通常不会修改,一般只会修改capacity。
  • HashMap和Hashtable有什么区别?
    • HashMap允许键和值是null,而Hashtable不允许键和值为null。
    • HashTable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而HashTable适合于多线程环境
    • HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举。
  • Array和ArrayList的区别:
    • Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
    • Array大小是固定的,ArrayList的大小是动态变化的。
    • ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
    • 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式比较慢。
  • Java优先级队列
    • PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。
  • 你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?
    • 一个程序的渐进运行时间复杂度的上界。
  • 如何权衡使用无序的数组还是有序的数组?
    • 有序数组的最大好处在于查找时间复杂度是O(log n),而无序数组是O(n).有序数组的缺点是插入操作的时间复杂度是O(n),因为原来的元素要个新元素腾出位置。相反无需数组的插入时间复杂度是常量O(1)
  • Enumeration接口和Iterator接口的区别有哪些?
    • Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration更加安全,因为其他线程不能够修改正在被Iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素。而Enumeration则不行。
  • HashSet和TreeSet有什么区别?
    • HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1);
    • TreeSet是由一个属性的结构来实现的,它里面的元素是有序的。与其相对应的方法为O(log n)
  • 垃圾回收有什么目的?什么时候进行垃圾回收?
    • 垃圾回收是在内存中存在没有引用的对象或超过作用域的对象时进行
    • 垃圾回收的目的是识别并且丢弃应用不在适用的对象来释放和重用资源。
  • finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
    • 垃圾回收器决定回收某对象时,就会运行该对象的finalize()方法
    • 它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。
  • Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?
    • JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动时被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
  • 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?
    • 吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用就足够了。
  • 在Java中,对象什么时候可以被垃圾回收?
    • 当对象对当前使用这个对象的应用程序变得触不可及的时候这个对象就可以被回收了。
  • Java的永久代中会发生垃圾回收么?
    • 垃圾回收不会发生在永久代,如果永久代满了或者是超过临界值,会触发完全垃圾回收。如果你仔细查看垃圾收集器的输出信息就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免完全回收的重要原因
  • Java中的两种异常类型是什么?他们有什么区别?
    • 受检查的异常(checked)
      • 必须要用throws语句在方法或者是构造函数上声明
      • 这些异常是必须蒸锅捕捉检查处理的
    • 不受检查的异常(unchecked)
      • 不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面。
      • 一般是由程序的逻辑不恰当引起的
  • Java中Exception和Error有什么区别?
    • Exception和Error都是Throwable的子类。Exception用于用户程序可以捕捉的异常情况。
      • 程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常
    • Error定义了不期望被用户程序捕获的异常。
      • 一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
  • Throw和throws有什么区别?
    • Throw用于方法内部,Throws用于方法声明上。
    • Throws后跟异常对象,Throws后跟异常类型。
    • Throw后只能跟一个异常,Throws后可以一次声明多种异常类型。
  • 异常处理完毕后,Exception对象会发生什么变化?
    • Exception 对象会在下一个垃圾回收过程中被回收掉。
  • 什么是Applet?
    • Java applet是能够被包含在HTML页面中并且能被启用了Java的客户端浏览器执行的程序。applet主要用来创建动态交互的web应用程序。
  • Applet的生命周期
    • Init:每次被载入的时候都会被初始化
    • Start:开始执行applet
    • Stop:结束执行applet
    • Destory:卸载applet之前,做最后的清理工作
  • Applet被载入的时候会发生什么?
    • 首先创建applet控制类的实例,然后初始化applet,最后开始运行。
  • Applet和普通的Java应用程序有什么区别?
    • applet是运行在启用了Java的浏览器中,Java应用程序可以是在Java浏览器中独立的Java程序。Java应用程序需要一个特定的方法签名的main函数来开启进程。Java applet不需要这样的函数。最后Java applet一般会使用很严格的安全策略,Java应用一般使用比较宽松的安全策略。
  • Java applet有哪些限制条件?
    • 主要由于安全的原因,给applet施加了一下的限制:
      • applet不能够载入类库或者定义本地方法
      • applet不能砸宿主机上读写文件
      • applet不能读取特定的系统属性
      • applet不能发起网络链接,除非是跟宿主机
      • applet不能够开启宿主机上的其他程序。
  • 什么是不受信任的applet?
    • 不受信任的applet是不能访问或是执行本地系统文件的Java applet,默认情况下,所有载入的applet都是不受信任的。
  • 哪些Swing的方法是线程安全的?
    • repaint()
    • revalidate()
    • invaliadte()
  • 三种支持重绘的组件
    • canvas
    • frame
    • panel
    • applet
  • 什么是JDBC?
    • JDBC是允许用户在不同数据库之间做选择的一个抽象层。JDBC允许开发者用JAVA数据库应用程序,而不需要关心底层特定的数据库的细节。
  • 驱动(Driver)在JDBC中的角色
    • JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供Java.sql包下面这些类的实现:Connection Statement,PreparedStatement,CallableStatement,ResultSethe Drive
  • Class.froName()方法有什么作用?
    • 初始化参数指定的类,并且返回此类对应的Class对象
  • PreparedStatement比Statement有什么优势?
    • 前者是通过预编译的,因此性能会更好。同时,不同的查询参数值,前者可以重用
  • EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
  • JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
  • JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
  • JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
  • JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
  • RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

你可能感兴趣的:(Java的自我进阶)