Java|Java面试题答案参考

Java|Java面试题答案参考

1.简单说一下面向对象的特征和六大原则:
①面向对象的特征:
封装、继承、多态
1)封装:将信息隐藏 , 利用抽象数据 , 将一段逻辑以及数据保护起来 , 并且对外开放接口
2)继承:个性对共性属性与方法的接受 , 并加入个性特有的属性和方法 。
3)多态:程序中定义的引用变量 , 所指向的具体类型和具体调用方法 , 在编译期不能确定 , 而是在程序运行期确定 。
②六大原则:
1)单一职责原则:一个类只负责一项职责
2)里氏替换原则:只要弗雷出现的地方 , 子类也可出现
3)依赖倒置原则:程序依赖抽象 , 而不依赖具体实现 , 减少程序间的耦合性
4)接口隔离原则:客户端不应该依赖他不需要的接口 , 一个类对另一个类的依赖     应建立在最小接口上
5)迪米特原则:一个对象应该对其他对象保持最小的了解
6)开闭原则:类、实体、模块应该对扩展开放 , 对修改关闭
2.谈谈final、finally、finalize的区别:
①final:一种修饰词 , 用来修饰类、方法、变量
final修饰的类 , 不可继承
final修饰的方法 , 不可重写
final修饰的变量 , 不可修改
②finally:Java关键字 , 用于Java异常捕捉中 , 与try-catch同用 , 表示    在捕获异常时 , 无论如何都会执行的代码块 , 大多用于释放资源 ,   保证解锁等工作
③finalize:一个方法 , 属于Object类 , 属于GC运行机制中的一部分 , 当    GC清除他所从属的对象时被调用的 , 如果执行它的过程中跑出    无法捕获的异常 , GC将终止对该对象的清理 , 并且该异常会被    忽略 , 知道下次GC开始清理这个对象 , 该方法会再次被调用
3.Java中的==、equals与hashCode的区别和联系:
①==:用于比较两个数据是否相等
1)若对比的为基本数据类型 , 比较的是数值的大小
2)若对比的引用数据类型 , 比较的是引用地址是否相等 , 即两个对象  是否为同个对象
3)若为Integer类的对比 , 若数值在[-128127
区间 , 可用来对比 , 因为在此区间创建Integer对象时jvm会进行缓存 , 因此是同一个  对象 , 所以Integer要用equals方法进行对比
②equals:存在于Object的方法 , 用于两个对象按用户定义的方法判断是   否相等 , 若是类中未重写此方法 , 则与==用法相同
③hashcode:存在于Object的方法 , 用于提高查找的快捷性 , 因为hashCode   也是在Object对象中就有的 , 所以所有Java对象都有hashCode ,  在HashTable和HashMap这一类的散列结构中 , 都是用HashCode来   查找在散列表中的位置的
P.S:如果两个对象equals , 他们的hashCode必定相等
如果两个对象hashCode相等 , equals不一定会相等
4.谈谈Java容器ArrayList、LinkedList、HashMap、HashSet的理解:
①ArrayList:
ArrayList是一个数组队列 , 相当于动态数组 。 与Java中的数组相比 , 它的容量能动态增长 。 它继承于AbstractList , 实现了List , RandomAccess , Cloneable , java.io.Serializable这些接口 。
ArrayList继承了AbstractList , 实现了List 。 它是一个数组队列 , 提供了相关的添加、删除、修改、遍历等功能 。
ArrayList实现了RandmoAccess接口 , 即提供了随机访问的功能 。 RandmoAccess是java中用来被List实现 , 为List提供快速访问功能的 。 在ArrayList中 , 我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问 。
ArrayList实现了Cloneable接口 , 即覆盖了函数clone() , 能被克隆 。
ArrayList实现了java.io.Serializable接口 , 这意味着ArrayList支持序列化 , 能通过序列化去传输 。
②LinkedList:
LinkedList 是一个继承于AbstractSequentialList的双向链表 。 它也可以被当作堆栈、队列或双端队列进行操作 。
LinkedList 实现 List 接口 , 能对它进行队列操作 。
LinkedList 实现 Deque 接口 , 即能将LinkedList当作双端队列使用 。
LinkedList 实现了Cloneable接口 , 即覆盖了函数clone() , 能克隆 。
LinkedList 实现java.io.Serializable接口 , 这意味着LinkedList支持序列化 , 能通过序列化去传输 。
LinkedList 是非同步的 。
③HashMap:
HashMap是用于存储Key-Value键值对的集合(每一个键值对也叫做一个Entry)(无顺序) 。
HashMap是根据键的hashCode值存储数据 , 大多数情况下可以直接定位到它的值 。
HashMap是键key为null的记录至多只允许一条 , 值value为null的记录可以有多条 。
HashMap是非线程安全 。
HashMap是由数组+链表+红黑树实现的 。
④HashSet:
HashSet 是一个没有重复元素的集合 。
它是由HashMap实现的 , 不保证元素的顺序 , 而且HashSet允许使用 null 元素 。
HashSet是非同步的 。 如果多个线程同时访问一个哈希 set , 而其中至少一个线程修改了该 set , 那么它必须保持外部同步 。 这通常是通过对自然封装该 set 的对象执行同步操作来完成的 。 如果不存在这样的对象 , 则应该使用 Collections.synchronizedSet 方法来“包装” set 。
5.谈谈线程的基本状态 , 其中的wait()、sleep()、yield()方法的区别:
①线程的基本状态:
1)新建状态(New):当线程对象对创建后 , 即进入了新建状态
如:Thread t = new MyThread();
2)就绪状态(Runnable):当调用线程对象的start()方法(t.start();) , 线程即进入就绪状态 。 处于就绪状态的线程 , 只是说明此线程已经  做好了准备 , 随时等待CPU调度执行 , 并不是说执行了t.start()  此线程立即就会执行;
3)运行状态(Running):当CPU开始调度处于就绪状态的线程时 , 此时  线程才得以真正执行 , 即进入到运行状态 。 注:就     绪状态是  进入到运行状态的唯一入口 , 也就是说 , 线程要想进入运行状态执  行 , 首先必须处于就绪状态中;
4)阻塞状态(Blocked):处于运行状态中的线程由于某种原因 , 暂时放  弃对CPU的使用权 , 停止执行 , 此时进入阻塞状态 , 直到其进入到  就绪状态 , 才 有机会再次被CPU调用以进入到运行状态 。 根据阻塞  产生的原因不同 , 阻塞状态又可以分为三种:
4.1)等待阻塞:运行状态中的线程执行wait()方法 , 使本线程进入  到等待阻塞状态;
4.2)同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被  其它线程所占用) , 它会进入同步阻塞状态;
4.3)其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O  请求时 , 线程会进入到阻塞状态 。 当sleep()状态超时、join()  等待线程终止或者超时、或者I/O处理完毕时 , 线程重新转入就  绪状态 。
5)死亡状态(Dead):线程执行完了或者因异常退出了run()方法 , 该   线程结束生命周期 。
6.JVM性能调优的监控工具有哪些:
①jps
②jstack
③jmap
④jstat
【Java|Java面试题答案参考】


    推荐阅读