美文网首页
Java面试题

Java面试题

作者: taijielan | 来源:发表于2019-03-04 14:12 被阅读0次
    final, finally,finalize的区别:
    • final 生命属性,方法,和类,final声明的属性是常量,声明的方法不能重写,声明的类不能继承。
    • finally 用于try...catch 语句,用来捕捉异常,一定会执行。
    • finalize 是object的一个方法,在垃圾收集器工作时会调用被回收对象的的次方法,供垃圾回收时的其他资源的回收,如关闭文件等。

    java中引用有几类:
    • 强应用:强引用是最普遍的引用,如果一个对象具有强引用那么一般情况下,这个对象不会被垃圾回收掉,除非引用这个对象的引用被GC掉了,那么GC会判断这个对象不可大,那么这个对象可能会被回收。
    • 软应用:一般情况下,这个引用对象不会被销毁,除非内存不够,内存足够的情况下,这个对象能够正常使用。
      *弱引用:弱引用的对象比软应用的对象具有更短的生命周期,当GC扫描到这个对象,发现是弱引用的时候,不管内存是否充足,都有会被回收。
    • 虚引用:如果一个对象是虚引用,那么不管这个对象的生命周期是否结束,都有可能被随时回收。主要用于监控GC的到来。
    java的GC机制:

    Java程序的垃圾回收机制也就是GC机制,其作用是及时释放程序中没有使用的对象所占用的内存。

    • 问题回到如何找到哪些对象是没有使用,有俩种方法,1是引用计数算法,2是可达性分析算法
      引用计数算法的目的是找到那些对象的引用数为0的,来决定是否回收该对象,每个对象头中分配一个空间用来保存引用计数器,如果这个对象被引用计数去+1,如果程序执行完计数-1.任何对象的引用计数为0,都可以被回收。
      引用计数器的优点是执行效率高,程序受到的影响较小,缺点是如果对象相互引用,会出现内存溢出。
      可达性分析算法是为了解决对象相互引用的问题,当一个对象从垃圾回收跟(GC root)开始没有与任何引用链相连,那么这个对象就是不可达的,也就是可以回收。
      如何回收无用的对象,通过垃圾回收算法。垃圾回收算法的思想是:①标记-清除法;②复制算法;③标记整理算法;④内存模型与回收策略
      程序中什么时候开始GC,任何时候都会进行,当程序内存不足的时候,GC就会启动。最后如果还是内存不足就会内存溢出。

    ArrayList 和LinkList的区别和联系。

    • 联系:都可以用来储存对象和基本数据类型的包装类
    • 区别:ArrayList底层是基于数组结构,查询元素比较快,删除和增加效率比较慢,LinkList底层实现是双链表数据结构,查询效率比较低,但是删除和插入元素比较快。

    List,Set,Map之间的区别

    • List:用来存储无序,可重复的对象。
    • Set:无序不能重复的对象。
    • Map: 主要用来存储健值对,键不可以重复,值可以重复。
    List的实现类有3种:
    • LinkList底层是双链表数据结构,查询速度慢,但是删除和添加快。
    • ArrayList 底层是数组的数据结构,并且是非线程安全的,查询速度快,但是删除和添加慢。
    • Vector 底层数组,不过是线程安全的,查询速度慢,删除和添加也慢。
    Set的实现类有2种
    • LinkHashSet 继承自HashSet,内部通过LinkHashMap保证元素的顺序,也就是说遍历顺序和插入顺序一致。
    • HashSet 内部通过HashMap来存储数据,值存储在key中,value都是一样的,这样HashSet存储的值是唯一的。
    map的实现类有4种
    • HashMap 是非线程安全的,单线程执行效率高,多线程使用时防止并发问题。(多线程使用concurrentHashMap),健值不能重复,key只能一个为空,一个和多个key对应的value都可以为空。父类是AbstractMap实现了Map接口。扩容的方式是2的指数,默认长度16.
    • HashTable 是线程安全的,相比于HashMap效率不高,但可以在多线程中使用,key和value都不能为空,否则会报空指针,父类是Dictionary,同样实现了Map接口。扩容方式是0ld*2+1;默认长度11。
    • LinkHashMap 保持插入数据的顺序。
    • SortMap 实现类是TreeMap,保证元素的顺序,默认通过key来进行升竖排列,也可以重写comparato方法根据value来排序。

    ArrayList的扩容

    ArrayList底层是通过数组来存储数据的,ArrayList的默认数组长度是10 ,也可以根据ArrayList的构造函数指定数组的长度,正常情况下ArrayList每次扩容的长度都是上一次的1.5倍,特殊情况如果扩容1.5倍不够,那么直接扩大到需要的长度大小。

     private void grow(int minCapacity) {
            // overflow-conscious code
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    

    LinkedHashMap的原理

    LinkedHashMap继承了HashMap,数据的存储是数组和双向链表的方式实现。查询数据的顺序和你插入数据的顺序有关。通过双向链表的方式维护元素的顺序。linkedHashMap是线程不安全的
    一般在LruCache中做图片缓存。
    有俩种储存数据的方法,一种是插入顺序存储,一种是访问数据的方式存储。accessOrder为false表示插入数据的方式,accessOrder为true表示访问数据的方式,

    String的原理

    String 存取数据的方式通过一个不可变(final修饰的类)的数组来存储,数组的长度不确定,没有默认的长度,传入多少就是多少,如果进行拼接会通过new String 重新构建一个String。使用字符串常量池时,每当我们用字面量(String s =“”1)创建字符串常量的时候,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,就将该字符串对象的地址赋值给该引用”s”,如果该字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中,并且将此字符串的地址赋值给引用“s”。

    String不可变的好处

    • 如果String不可变,那么其hash值也不可变,那么在用到hash值的地方就会提高效率。
    • 为了线程安全。如果改变字符串指向对象的值,就会引起安全问题。
    • 节省了许多空间,因为只有String不可变的时候,String 常量池才可能实现。

    Java中 注解的使用
    注解可以理解为一定程度上的标签。
    注解的作用:程序中使用注解可以简化代码提高编程的效率。
    注解的原理:注解的本质是继承Annotation的特殊接口。其具体实现类似java的动态代理,通过反射获取注解时,返回的是java运行时生成的动态代理类对象。
    元注解类型

    • Retentaion:表示该注解的生命周期
      • SOURCE:表示只在源码中保留,在编译阶段就会丢掉。
      • CLass:表示会编译到.class 文件中去,并不会加载到JVM中去。
        -RunTime:注解可以保留到程序运行的时候,会加载到JVM中。程序可以通过反射的方式获取到。
    • Documented :表示是否将注解信息添加到文档中
    • Target:表示注解用到什么地方
    • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
    • ElementType.CONSTRUCTOR 可以给构造方法进行注解
    • ElementType.FIELD 可以给属性进行注解
    • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
    • ElementType.METHOD 可以给方法进行注解
    • ElementType.PACKAGE 可以给一个包进行注解
    • ElementType.PARAMETER 可以给一个方法内的参数进行注解
    • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
    • Inherited:表示该注解和子类的关系
    • Repeatable:表示可以重复声明同一个类型。

    java中Error和Exception的区别

    继承自Throwable, Error是程序中无法处理的,Exception表示在程序可以提前处理的。

    • Error 表示程序运行过程中,程序发送无法处理的错误。如OutOfMemoryError,NoClassDefFoundError.
    • Exception 可分为运行时异常和非运行时异常,程序中需要处理。否则程序可能通不过编译,或者程序会出现崩溃。运行时异常是因为代码逻辑出现问题引起的,会通过编译,这类异常继承自RuntimeException,常见的有空指针,数组下标越界,非运行异常也称编译异常,在程序编译阶段就会出现,必须处理,不然程序通不过编译,常遇见的有IO异常,Sql异常。
    Http 和https的区别:
    • Https要到ca申请证书,这种证书免费的很少,一般收费。
    • Http是超文本传输协议,使用明文传输,Https使用的具有安全性的SSL协议是加密传输协议。 、
    • Http和Https使用的是完全不同的链接方式并且使用的端口也不同,Https默认使用的是443,Http默认的是80端口。
    • Http的连接简单,是无状态的。
    • Http是使用的SSL+Http的构建的可进行加密,身份认证的网络协议。要比Http协议要安全的多。
    常用的对称加密和非对称加密,以及区别
    • 对称加密:AES,DES,RC4,RC5
    • 非对称加密:RSA,ECC(移动设备),DSA(数字签名)
    • 散列算法: MD5 ,SHA,该类的特点是单向,不可逆,对输入非常敏感,输出长度固定
      对称加密使用的同一套密钥进行加解密,非对称加密是使用公有密钥加密,使用私有密钥解密。
    使用https加密协议(结合使用对称加密和非对称加密,因为对称加密的处理效率比非对称高,但是非对称加密更加安全)
    • 客户端首先进行https请求。
    • 服务器端有一套SSL数字证书,这个证书包含一个公匙和一个密匙。服务收到请求,返回到客户端一个公匙,(公私包含的内容有,颁发机构和有效的时间)
    • 服务器传输公私到客户端
    • 客户端通过共钥证书(认证机构颁发的用来确认当前当前公匙是否是匹配的证书结构颁发的)解析公私,验证公匙是否有效。如果有效的话,就会生成一个随机数,然后通过证书来加密。(这个随机数,就是对称加解密的密匙)
    • 传输这个加密的随机值到服务端,以后服务器和客户端就是通过这个随机值来加密解密了。
    • 服务端通过私密解密到这个随机数,然后通过对称算法,将这个随机数和传输的内容加密,传输到客户端。以后其他的内容也是通过这个随机数进行加密传输。
    • 传输加密的内容
    • 客户端使用随机数私密还原被加密的内容。
    Bitmap是存放在native层还是存放在java层的?

    在android 2.3 之前的版本,图像的数据是存放在native heap的,所以在java heap读不到图像的内存数据,不过在3.0之后的版本,bitmap对象就直接分配到java层了,这样便于管理和调试,可以复用一个bitmap对象,而不必回收它,不过当前的bitmap的大小要和原来的bitmap大小相同,不过在4.4之后的版本,复用的bitmap对象的大小只要不超过原来的大小就行了。bitmap是存放在d alvik heap中的,只有这样才能解释的通为什么bitmap会导致OOM。

    Vector和ArrayList的区别?

    首先ArrayList和Vector都是链表结构的。
    Vector使用synchronized关键字,是线程安全的,ArrayList不是线程安全的,Vector比HashMap更加有效率。

    HashTable和HashMap的区别?

    HashTable是线程安全的,HashMap是线程非安全的,所以在线程多的情况下使用HashTable.

    • HashTable不允许有空值(Key和value都不允许有空值),HashMap可以有空值。
    • HashTable有contain方法,与containValue方法类似。
    • HashTable使用Enumeration,HashMap使用Iterator。
    • HashTable 的数组长度默认是12,增常是old*2+1,HashMap的默认数组长度是6,增长是2的指数
      *哈希值使用不同,HashTable使用对象的hashcode,而HashMap会重新计算哈希值。
    一个英文字母占一个字节,一个汉子占2个字节
    http请求有哪几种,有什么不同?

    http总共有2种,一种是Get,一种是Post,他们的不同点是:

    • Get 请求是将请求参数拼接在url的尾部,并且url使用ascill编码,对于请求的参数有可能是unicode编码,如汉子,需要解决编码的问题。Post没有编码的限制。
    • Post请求是将请求参数放在Request body 中的.
    • http协议并没有对请求的url有长度的限制,但是有些浏览器对url的长度有限制。
    • 从语义上来讲也是不同的,get请求是从服务器获取资源,post是向服务器提交一个修改或者添加的报文,如上传一个表单,get请求不会对服务器有多大的影响,但是post如果重复提交一个请求就会在服务器中生成多个重复的数据,
    TCP/UDP的区别
    • IP(internet protocol)是主机与主机之间的通讯协议.
    • TCP 在IP协议的基础上,完成主机间进程与进程的通信。(具体是通过进程的端口号),TCP需要经过3次握手,建立长连接,才能发送请求。(Socket是TCP的封装)。客户端发送SYN(建立连接)报文,服务端收到请求,返回一个ACK(响应)报文,客户端收到ACK报文,在返回服务的一个ACK报文。
    • UDP 不需要建立连接,也可以发送数据。
    • TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证
    • 流模式与数据报模式 ;
    • 对系统资源的要求(TCP较多,UDP少;
    CountDownLatch

    Java并发的工具类,能够使一个或者多个Thread等待其他线程执行完成后再执行。

    Java 的内存区域及存放的内容。
    • 程序计数器:程序执行的字节码指令,分支,跳转,异常处理,循环,线程恢复等功能都依赖程序计数器完成。
    • 栈:存放的是操作栈,局部变量表,动态链接,方法出口等信息。
    • 本地方法栈:如果某个虚拟机实现的本地接口连接方式是C链接模型,那么本地的方法栈就是C栈。
    • 堆:主要存放类的实体变量。
    • GC堆: 分为MInor Gc 和Full GC 采用复制算法。
    getDeclaredMethods 和getMethods方法的区别:

    getMothods返回一个类的中的所有公共方法的数组 ,这个公共方法数组包含自己的,也包含继承下来的。
    getDeclaredMethods放回一个类中所有的公开的,非公开的,私有的,和默认的方法数组,但是不包含父类继承下来的。

    String ,StringBuild,StringBuffer

    String 拼接字符串时每次都会创建新的对象,适合少量拼接使用,速度最慢
    StringBuffer 线程安全,适合多线程使用,比String快
    StringBuilder 线程不安全,适合单线程使用,速度最快

    “equals”与“==”、“hashCode”的区别和使用场景

    ==比较的是俩个对象的值是否相等,
    equals比较的是俩个对象的地址是否相同。
    默认的,Object 类的 hashCode()方法返回对象存储的内存地址的 hash值。

    Error和Exception的区别

    Error 是错误,程序中发生错误后JVM不可以处理也不可以恢复。OutOfMemoryError,NoClassDefFoundError
    Exception是异常 分为检查异常和非检查异常,检查异常可以使用try catch语句捕捉,非检查异常可以不用处理,检查异常IOException,非检查异常ArrayIndexOutOfBoundsException

    相关文章

      网友评论

          本文标题:Java面试题

          本文链接:https://www.haomeiwen.com/subject/bkjeyqtx.html