1、 接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类 (concrete class)?
答: 接口可以继承接口,而且支持多重继承。
抽象类可以实现(implements)接口。
抽象类可继承具体类也可以继承抽象类。
2、 Java 中的final关键字有哪些用法?
答:在Java中声明类、属性和方法时,可使用关键字final来修饰。
3、 Error和Exception有什么区别?
答:1.可以是可被控制(checked) 或不可控制的(unchecked) 。
2.表示一个由程序员导致的错误。
3.应该在应用程序级被处理。
4、 try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?
答:会执行,在方法返回调用前执行,准确的说是在return中间执行。
5、 Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
答:throws捕获并向外抛出异常。
throw抛出异常。
Try catch是内部捕获异常并做自定义处理。
finally是无论是否有异常都会被处理的语句,除非在finally前存在被执行的System.exit(int i)时除外。
6、 运行时异常与检查异常有何异同?
答:相同:都属于Expection。
不同:运行时异常都是RuntimeException类以及子类异常。
一般异常都是RuntimeException以外的异常,类型上都属于Exception类及其子类。
7、 列出一些你常见的运行时异常?
答: 算术异常
类转换异常
非法参数异常
下标越界异常
空指针异常
安全异常
8、 阐述final、finally、finalize的区别。
答:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可被继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
9、 阐述ArrayList、Vector、LinkedList的存储性能和特性。
答:ArrayList和Vector都是使用数组方式存储数据,索引数据快而插入数据慢。
LinkedList 使用双向链表实现存储,插入速度较快。
Vector 是线程安全的容器。
10、Collection和Collections的区别?
答: Collection是集合类的一个顶级接口,其直接继承接口有List与Set
而Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
Collection是个java.util下的接口,它是各种集合结构的父接口。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法
11、List、Map、Set三个接口存取元素时,各有什么特点?
答:Set 里面不允许有重复的元素,List表示有先后顺序的集合,Map是双列的集合。
List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存 key-value 值, value 可多值。
12、Thread 类的 sleep() 方法和对象的 wait() 方法都可以让线程暂停执行,它们有什么区别?
答: wait()是Object类的方法,sleep()方法(休眠)是线程类(Thread)的静态方法。
13、线程的sleep()方法和yield()方法有什么区别?
答:sleep()方法 使当前线程的执行挂起一段指定的时间,把cpu时间让给其他线程。时间可以由豪秒数或纳 秒数决定。
14、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
答:不能,一个对象的一个synchronized方法只能由一个线程访问。
15、请说出与线程同步以及线程调度相关的方法。
答:-notify():-notityAll(),-sleep():-wait():
16、 编写多线程程序有几种实现方式?
答:(1)继承 Thread 类,重写 run 函数。
(2)实现 Runnable 接口,重写 run 函数。
(3)实现 Callable 接口,重写 call 函数。
17、synchronized关键字的用法?
答:同步控制块,同步控制方法。
18、举例说明同步和异步。
答:所谓的同步就是指阻塞式操作,而异步就是非阻塞式操作。
19、启动一个线程是调用 run() 还是 start() 方法?
答:启动一个线程是调用 start() 方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由 JVM 调度并执行,
这并不意味着线程就会立即运行。run() 方法是线程启动后要进行回调(callback)的方法。
20、什么是线程池(thread pool)?
答:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。
线程池线程都是后台线程。
21、 简述synchronized 和java.util.concurrent.locks.Lock的异同?
答: Lock 有比 synchronized 更精确的线程语义和更好的性能。
synchronized 会自动释放锁,而 Lock 一定要求程序员手工释放,并且必须在 finally 从句中释放。
22、Statement和PreparedStatement有什么区别?哪个性能更好?
答:PreparedStatement 接口代表预编译的语句,它主要的优势在于可以减少 SQL 的编译错误并增加 SQL 的安全性(减少 SQL注入攻击的可能性);
PreparedStatement 中的 SQL 语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;
当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快。
23、事务的ACID是指什么?
答:原子性(Atomic);一致性(Consistent);隔离性(Isolated);持久性(Durable)。
24、 如何通过反射创建对象?
答: 通过Class对象调用newInstance()方法。
25、如何通过反射获取和设置对象私有字段的值?
答:可以通过类对象的getDeclaredField()方法字段(Field)对象,然后再通过字段对象的setAccessible(true) 将其设置为可以访问,接下来就可以通过get/set方法来获取/设置字段的值了。
26、如何通过反射调用对象的方法?
答: Class.getMethod();
27、简述一下你了解的设计模式。
答:总共23种,分为三大类:创建型,结构型,行为型
分别是:创建型(工厂、工厂方法、抽象工厂、单例)
结构型(包装、适配器,组合,代理)
行为型(观察者,模版,策略)
28、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
答: 对于第一种情况,会报错,对于第二种情况,则不会出错。
29、int和Integer有什么区别?
答: Int 是java 的原始数据类型,Integer 是java 为int 提供的封装类。
30、&和&&的区别?
答: 两者都表示“与”运算,但是 && 运算符第一个表达式不成立的话,后面的表达式不运算,直接返回。
而 & 对所有表达式都得判断。( & 也是位移运算符)。
31、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法
堆区:
提供所有的类实例和数组对象存储区域。
Jvm只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。
栈区:
每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中。
每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
方法区:
方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
运行时常量池都分配在java虚拟机的方法区之中。
32、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
答: Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
33、switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
答: 整数表达式可以是int基本类型或 Integer 包装类型,由于 byte,short,char 都可以隐含转换为int,所以这些类型以及这些类型的包装类型也是可以的。
显然,long和String类型都不符合switch的语法规定,并 且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
34、用最有效率的方法计算2乘以8?
答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)
35、构造器(constructor)是否可被重写(override)?
答: 构造器不能被继承,因此不能被重写,但可以被重载。
36、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答: 不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。
37、是否可以继承String类?
答: 因为Sting里边有final关键字,所以不能被继承。
38、 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递,Java 编程语言只有值传递参数。
当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。
对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
39、String和StringBuilder、StringBuffer的区别?
答:字符串常量
字符串变量(线程安全)
字符串变量(非线程安全)
40、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
答:方法重载的规则:
1.方法名一致,参数列表中参数的顺序,类型,个数不同。
2.重载与方法的返回值无关,存在于父类和子类,同类中。
3.可以抛出不同的异常,可以有不同修饰符。
41、 描述一下JVM加载class文件的原理机制?
答: 类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中、
42、抽象类(abstract class)和接口(interface)有什么异同?
答:抽象类可以包含非抽象的方法,而接口中的方法必须是抽象的、
43、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
答: 静态(static)的内部类,它可以不依赖于外部类实例被实例化。
而通常的内部类需要在外部类实例化后才能实例化。
44、Java 中会存在内存泄漏吗,请简单描述。
答:虽然 java 虚拟机中的垃圾回收机制可以自动进行内存空间的申请和释放,但还是有些不能显式地进行释放,,必须手动释放,比如关闭打开的文件和数据库连接.最后可能导致内存的可用空间越来越少,最终崩溃。
45、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被 synchronized修饰?
答:都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。
46、阐述静态变量和实例变量的区别。
答:静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不 管创建多少个对象,静态变量在内存中有且仅有一个拷贝;
实例变量必须依存于某一实例,需要先创建对 象然后通过对象才能访问到它。
47、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象 并没有被初始化。
48、如何实现对象克隆?
答:1). 实现Cloneable接口并重写Object类中的clone()方法;
2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
49、GC是什么?为什么要有GC?
答:GC:Java的垃圾回收器。
解决内存溢出的问题,不用去手动的去回收垃圾的对象。
50、String s = new String(“xyz”);创建了几个字符串对象?
答:常量池中存在“xyz”,创建了一个对象。
常量池中不存在“xyz”,创建了两个对象。