zoukankan      html  css  js  c++  java
  • java面试题个人总结

    1.重载和重写的区别
    重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。
    2.java特性:抽象-->对象,封装-->类

    3.String和StringBuffer、StringBuilder的区别
    可变性:
    String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。
    StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。
    线程安全性:
    String中的对象是不可变的,也就可以理解为常量,线程安全。
    AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
    性能:
    每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

    4.hashCode和equals方法的关系
    equals相等,hashcode必相等;hashcode相等,equals可能不相等。

    5.HashMap和HashTable区别
    一.HashTable的方法前面都有synchronized来同步,是线程安全的;HashMap未经同步,是非线程安全的。
    二.HashTable不允许null值(key和value都不可以) ;HashMap允许null值(key和value都可以)。
    三.HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。
    四.HashTable使用Enumeration进行遍历;HashMap使用Iterator进行遍历。
    五.HashTable中hash数组默认大小是11,增加的方式是 old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数。
    六.哈希值的使用不同,HashTable直接使用对象的hashCode; HashMap重新计算hash值,而且用与代替求模。
    6.ArrayList和vector区别
    ArrayList和 Vector都实现了List接口, 都是通过数组实现的。
    Vector是线程安全的,而ArrayList是非线程安全的。
    List第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当 List 认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。

    7.ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。
    LinkedList底层是通过双向链表实现的, LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(), peek(), poll()等方法。
    LinkedList更适合从中间插入或者删除(链表的特性)。 ArrayList更适合检索和在末尾插入或删除(数组的特性)。
    8.Java中如何实现代理机制(JDK、CGLIB)
    JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口。
    CGLIB动态代理:代理类是目标类的子类, 用到MethodInterceptor接口

    9.死锁代码:

    10.

    .Java中的NIO,BIO,AIO分别是什么

    同步阻塞IO(JAVA BIO):
        同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

    异步阻塞IO(Java NIO): 
       异步阻塞,应用程序发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,(SELECT程序监听是否有IO就 绪,有就绪的就启动线程就绪处理)这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通 过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄(如果从 UNP的角度看,select属于同步操作。因为select之后,进程还需 要读写数据),从而提高系统的并发性! 

    (Java AIO(NIO.2))异步非阻塞IO: 
       在此种模式下,用户线程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。   

    NIO,AIO,区别,NIO内核空间到用户空间,应用程序负责,AIO,数据的读取和写入有内核完成;

    可以看出,两个模式的相同点,都是对某个IO事件的事件通知(即告诉某个模块,这个IO操 作可以进行或已经完成)。在结构上,两者也有相同点:demultiplexor负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足 时,就回调handler;不同点在于,异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下 (Reactor),回调handler时,表示IO设备可以进行某个操作(can read or can write)。

    11.memcached和redis的区别
    (1)性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。
    (2)内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。
    (3)Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

  • 相关阅读:
    泛型
    java unicode补充字符带来的码点和代码单元问题
    GIT相关
    Html5 Canvas学习
    解决animate动画连续播放bug
    自定义对象级别的组件开发
    关于常用却忘记的css,jQuery
    json格式初涉
    ajax
    jquery.validation.js的自定义方法
  • 原文地址:https://www.cnblogs.com/lelouchKOP/p/5826019.html
Copyright © 2011-2022 走看看