用最高效的方式计算2*8的结果?
2 <<< 3
//
&&和&的区别?
&&是逻辑运算符,有短路效果。
&是位运算符,也可以用来做逻辑运算,没有短路效果。
//
循环和迭代遍历的区别?(for和foreach的区别)
迭代遍历(foreach)只能正向、不可逆、依次访问元素。
迭代遍历(foreach)速度比循环快。
//
什么是面向对象(OO)?
利用封装、继承、多态特性,实现程序的维护性、扩展性、灵活性。
//
方法的重载(overload)和方法的重写(override)的区别?
方法的重载(overload):方法名称相同,形参列表的数量或类型不同。
方法的重写(override):派生类中覆盖超类的方法。
//
抽象类和接口的异同点?
相同点:都不能被实例化
都可以有抽象方法
实现类都必须实现所有抽象方法
不同点:抽象类可以有实现方法,接口只能有抽象方法
实现类只能继承一个抽象超类,可以实现多个接口
//
final、finally、finallize的区别?
final 是修饰符:修饰常量
修饰方法表示该方法不能被重写
修饰类表示该类不能被继承
finally 是异常处理中,无论是否捕获到异常最终都会执行的指令段,不会受try或catch指令段中return关键字的影响。
finallize 是Object类中的方法,析构方法,对象销毁时会自动调用的方法。
//
Java访问修饰符有哪些?
public 公开的 任何范围都能访问
protected 受保护的 类内部、派生类内部、相同包类外部可以访问,不同包类外部不能访问
[default] 默认的 相同包中可以访问、不同包中不可以访问
private 私有的 类内部可以访问,其他都不能访问
//
== 和 equals() 的区别?
== 是运算符,判断值是否相等。
equals()是Object类中的方法,使用==运算符实现,派生类可以重写Object.equals()方法,实现相等判定的方式。
重写equals()方法要遵循的规则:
使用==操作符检查参数是否为这个对象的引用
使用instanceof操作符检查参数是否为正确的类型
如果两个对象相同(equals()方法返回true),那么它们的hashCode值一定要相同
重写equals()方法时总是要重写hashCode()方法
一致性、对称性、传递性
//
异常Exception的分类?请分别列举?
运行时异常 RuntimeException:JVM会自动处理的异常
ArithmeticException、OutOfBoundsException、NullPointerException、NumberFormatException
检查异常 CheckedException:JVM不会自动处理的异常
ClassNotFoundException、IOException、FileNotFoundException、SQLException、InterruptedException
//
集合类中XXX与XXX的区别?(详见:附件-集合类特性汇总.xls)
//
Collection和Collections的区别?
Collection 是集合类接口。
Collections 是类,封装了 Collection 类型数据的常用方法。
//
String、StringBuilder、StringBuffer的区别?
String基于固定数组实现,修改值时会重新创建一个对象。
StringBuilder基于动态数组实现,修改值时不会重新创建一个对象,非线程安全。
StringBuffer是StringBuilder的线程安全版,但效率低于StringBuilder。
//
int和Integer的区别?(其他原始类型和封装类型的区别)
int是Java原始类型,属于值类型,不能为null。
Integer是int的封装类型,属于引用类型,可以为null。
//
Java实现多线程编程的方式有几种?那种比较好?
1:继承Thread超类,重写run()方法
2:实现Runnable接口,实现run()方法
第2种方式比较好,因为实现类只能继承一个超类,但是可以实现多个接口。
//
Thread.yield()、Thread.sleep()、Thread.join()的区别?
这三个都是线程礼让(让步)CPU使用权的方法。
Thread.yield()只会让步给优先级高于自己的其他线程,不会产生InterruptedException异常。
Thread.sleep()会让步给所有优先级的其他线程,会产生InterruptedException异常。
Thread.join()让步给指定的其他线程,会产生InterruptedException异常。一般用来合并线程。
//
Object.wait()、Object.notify()、Object.notifyAll()的区别?
这三个都是线程通讯的方法。
Object.wait() 让当前拥有Object对象锁的线程,释放对象锁,并且进入对象锁等待池。
Object.notify() 让Object对象锁等待池中的一个随机线程,进入到对象锁池中。
Object.notifyAll() 让Object对象锁等待池中的所有线程,进入到对象锁池中。
//
使用过哪些JSon解析工具?
JSonLib、GSon……
//
XML解析方式有哪些?使用过哪些XML解析工具?
Dom解析方式:预先加载整篇XML文档,初始化速度慢,后期访问速度快。
Sax解析方式:不预先加载整篇XML文档,初始化速度快,后期访问速度慢。
Dom4j等解析工具……
//
简述Java的反射机制(Reflect)?
反射:解刨类型
让功能适用于所有类型(现有的类型、未来扩展的类型)
//
简述面向对象设计原则?
1:单一职责原则:一个类应该有且仅有一个调用的需求存在。
2:开闭原则(开放-封闭原则):对扩展是开放的,对修改是封闭的。只允许以增量的方式来扩展应用程序。
3:迪米特法则(最少知识法则):如果两个类型没有必要的联系,它们就不用相互认识。尽量少与其他类相互作用。
4:李氏替换法则:适用于超类的场景,必须适用于该超类的所有派生类。
5:依赖倒置原则:实现中尽量依赖抽象,而不依赖细节。
6:接口隔离原则:提供尽可能小的单独接口,而不是庞大的总接口。
7:组合/聚合复用原则:优先考虑组合关系和聚合关系,而不是继承关系。
//
简述单例模式(Singleton)?
单例模式:保证一个类只有一个实例。
饿汉单例模式:类型加载时实例化对象。
懒汉单例模式:调用者获取实例时,实例化对象。
线程安全的懒汉单例模式:判断实例是否存在时加同步锁。
线程安全的懒汉单例模式——乐观锁实现方式:双重判断。
//
JVM内存分布?
方法区:用于存储类结构信息的地方,包括常量池、静态变量、构造函数等。
java堆:存储java实例或者对象的地方。这块是GC的主要区域。方法区和堆是被所有java线程共享的。
java栈:用于存储局部变量表、操作栈、方法返回值等。
本地方法栈:和java栈的作用差不多,只不过是为JVM使用到的native方法服务的。
程序计数器:分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
//
简述Java的垃圾回收机制(GC)?
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用。