Java 面试基础知识 100题,java基础知识
Java 面试基础知识 100题,java基础知识
-
快速失败(fail—fast)
在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的结构进行了修改(增加、删除),则会抛出 Concurrent Modification Exception。
原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果结构
发生变化,就会改变 modCount 的值。每当迭代器使用 hashNext()/next()遍历下一个元素之前,都会检测 modCount
变量是否为 expectedmodCount 值,是的话就返回遍历;否则抛出异常,终止遍历。
注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改 modCount
值刚好又设置为了 expectedmodCount 值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编
程,这个异常只建议用于检测并发修改的 bug。
场景:java.util 包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。 -
安全失败(fail—safe)
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发 Concurrent Modification Exception。
缺点:基于拷贝内容的优点是避免了 Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后
的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
场景:java.util.concurrent 包下的容器都是安全失败,可以在多线程下并发使用,并发修改。
-
年轻代(Young Generation)、年老代(OldGeneration)和持久代(Permanent Generation)。其中持久代主要存放
的是 Java 类的类信息,与垃圾收集要收集的 Java 对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。
-
年轻代:
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生
命周期短的对象。年轻代分三个区。一个 Eden 区,两个 Survivor 区(一般而言)。大部分对象在
Eden 区中生成。当 Eden 区满时,还存活的对象将被复制到 Survivor 区(两个中的一个),当这
个 Survivor 区满时,此区的存活对象将被复制到另外一个 Survivor 区,当这个 Survivor 去也满的时候,从第一个
Survivor 区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor 的两个区是对称的,
没先后关系所以同一个区中可能同时存在从 Eden 复制过来对象,和从前一个 Survivor 复制过来的对象,而复制到年老区的
只有从第一个 Survivor 去过来的对象。而且,Survivor 区总有一个是空的。同时,根据程序需要,Survivor 区是可以配
置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。 -
年老代:
在年轻代中经历了 N 次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周
期较长的对象。 -
持久代:
进行设置。
用于存放静态文件,如今 Java 类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些
class,例如 Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大
小通过-XX:MaxPermSize=
什么是 Applet?
java applet 是能够被包含在 HTML 页面中并且能被启用了 java 的客户端浏览器执行的程序。Applet 主要用来创建动
态交互的 web 应用程序。
解释一下 Applet 的生命周期 ?
applet 可以经历下面的状态:
Init:每次被载入的时候都会被初始化。
Start:开始执行 applet。
Stop:结束执行 applet。
Destroy:卸载 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
都是不受信任的。
从网络上加载的 applet 和从本地文件系统加载的 applet 有什么区别?
当 applet 是从网络上加载的时候,applet 是由 applet 类加载器载入的,它受 applet 安全管理器的限制。
当 applet 是从客户端的本地磁盘载入的时候,applet 是由文件系统加载器载入的。
从文件系统载入的 applet 允许在客户端读文件,写文件,加载类库,并且也允许执行其他程序,但是,却通不过
字节码校验。
哪些 Swing 的方法是线程安全的?
只有 3 个线程安全的方法: repaint(), revalidate(), and invalidate()。
说出三种支持重绘(painting)的组件。
Canvas, Frame, Panel,和 Applet 支持重绘。
事件监听器接口(event-listener interface)和事件适配器(event-adapter)有什么关系?
事件监听器接口定义了对特定的事件,事件处理器必须要实现的方法。事件适配器给事件监听器接口提供了默认的实现。
GUI 组件如何来处理它自己的事件?
GUI 组件可以处理它自己的事件,只要它实现相对应的事件监听器接口,并且把自己作为事件监听器。
什么是 JDBC?
JDBC 是允许用户在不同数据库之间做选择的一个抽象层。JDBC 允许开发者用 JAVA 写数据库应用程序,而不需要关
心底层特定数据库的细节。
JDBC(Java DataBase Connectivity),是一套面向对象的应用程序接口(API),制定了统一的访问各类关系数据库
的标准接口,为各个数据库厂商提供了标准的实现。通过 JDBC 技术,开发人员可以用纯 Java 语言和标准的 SQL 语
句编写完整的数据库应用程序,并且真正地实现了软件的跨平台性。
通常情况下使用 JDBC 完成以下操作: 1.同数据库建立连接; 2.向数据库发送 SQL 语句; 3.处理从数据库返回的结果;
JDBC 具有下列优点: 1. JDBC 与 ODBC(Open Database Connectivity,即开放数据库互连)十分相似,便于软件开发人员理解; 2. JDBC 使软件开发人员从复杂的驱动程序编写工作中解脱出来,可以完全专注于业务逻辑开发; 3. JDBC 支持多种关系型数据库,大大增加了软件的可移植性; 4. JDBC API 是面向对象的,软件开发人员可以将常用的方法进行二次封装,从而提高代码的重用性;
解释下驱动(Driver)在 JDBC 中的角色?
JDBC 驱动提供了特定厂商对 JDBC API 接口类的实现,驱动必须要提供 java.sql 包下面这些类的实现:
Connection, Statement, PreparedStatement,CallableStatement, ResultSet 和 Driver。
Class.forName()方法有什么作用?
初始化参数指定的类,并且返回此类对应的 Class 对象.
PreparedStatement 比 Statement 有什么优势?
PreparedStatements 是预编译的,因此,性能会更好。同时,不同的查询参数值,PreparedStatement 可以重用。
什么时候使用 CallableStatement?用来准备 CallableStatement 的方法是什么?
CallableStatement 用来执行存储过程。存储过程是由数据库存储和提供的。存储过程可以接受输入参数,也可以有
返回结果。非常鼓励使用存储过程,因为它提供了安全性和模块化。准备一个 CallableStatement 的方法是:
CallableStatement Connection.prepareCall();
数据库连接池是什么意思?
像打开关闭数据库连接这种和数据库的交互可能是很费时的,尤其是当客户端数量增加的时候,会消耗大量的资源,成
本是非常高的。可以在应用服务器启动的时候建立很多个数据库连接并维护在一个池中。连接请求由池中的连接提供。
在连接使用完毕以后,把连接归还到池中,以用于满足将来更多的请求。
什么是 RMI?
Java 远程方法调用(Java RMI)是 Java API 对远程过程调用(RPC)提供的面向对象的等价形式,支持直接传输序列化
的 Java 对象和分布式垃圾回收。远程方法调用可以看做是激活远程正在运行的对象上的方法的步骤。RMI 对调用者是
位置透明的,因为调用者感觉方法是执行在本地运行的对象上的。看下 RMI 的一些注意事项。
RMI 体系结构的基本原则是什么?
RMI 体系结构是基于一个非常重要的行为定义和行为实现相分离的原则。RMI 允许定义行为的代码和实现行为的代码相
分离,并且运行在不同的 JVM 上。
-
是用 private 把类的细节与外界隔离起来,从而实现数据项和方法的隐藏,而要访问这些数据项和方法唯一的途径就是
通过类本身,类才有资格调用它所拥有的资源(方法,数据项属性等等)。所以第一个好处就是数据的安全性提高了。 -
是通过隐藏隔离,只允许外部对类做有限的访问,开发者可以自由的改变类的内部实现,而无需修改使用该类的那些程序。
只要那些在类外部就能被调用的方法保持其外部特征不变,内部代码就可以自由改变,各取所需,利于分工。 -
就是提高了代码的重用性,封装成工具类以后能够减少很多繁琐的步骤。
96. 多态的定义?
多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。
---
97. 继承的定义? 继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用性,也可以在不修改类的情况下给现存的类添加新特性。
抽象的定义?抽象和封装的不同点?
抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java 支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。
抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对象行为的细节。一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略。
97. 单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
98. == and equal
== 比较的是在堆内存中对的地址,或者是比较两个实例化的引用是否相同。equals 则比较的是两个值。
99. Java 如何调整可用的内存?
首先看内存的划分情况:
堆内存:保存实例化对象的内容在每一个JVM进程之中,对象在堆内存空间都由垃圾回收器来管理。
非堆内存:Eden+ Font Space +To Space
- 所有方法的全局方法区;
- 所有的static 的全局数据区
- 永生带:负责存放反射对象的操作空间而调整内存大小主要是调整对内存空间
“-Xms":初始分配大小,为内存的1/64
"-Xmx":最大分配内存,为物理内存
的1/4
"-Xmn":年轻代堆内存的的大小空间
执行命令 Java -Xms1024M -Xmx1024M -Xmn512。
100.对象克隆操作。
写代码的过程之中,很少能够见到这样的操作,复制对象在Object中提供对象克隆的方法protected native Object clone() throws CloneNotSupportedException;
protected 只能在同一个包或不同的包的子类中进行访问
Clone() 方法会抛出一个异常,如果要克隆对象所在的类没有实现Cloneable,
而这个Cloneable 中没有定义操作,只是一个标识。
---
想获取更多可以关注下公众号!
相关文章
- 暂无相关文章
用户点评