• java面试题总结4


    什么是java的序列化,具体怎么使用?

    (1)java的序列化是将Java对象转换成字节流的过程。当java对象需要在网络上传输或者持久化存储到文件中,就需要对Java对象进行序列化处理。
    (2)序列化的表现:类实现Serializable这个接口,这个接口没有需要实现的方法。实现Serializable接口是为了告诉jvm这个类的对象可以被序列化。
    (3)注意事项:某个类可以被序列化,则其子类也可以被序列化。声明为static和transient的成员变量,不能被序列化。static成员变量时描述类级别的属性,transient表示临时数据。反序列化读取序列化对象的顺序要保持一致。

    Java序列化中如果有些字段不想进行序列化,怎么办?

    对于不想序列化的变量,使用transient关键字修饰。
    transient关键字的作用是:阻止实例中那些用此关键字修饰的变量序列化,当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。

    说说java中的io流

    java中的io流分为几种?
    (1)按照流的流向分,可以分为输入流和输出流;
    (2)按照操作单元分,可以划分为字节流和字符流;
    (3)按照流的角色划分为节点流和处理流。
    java IO流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系,Java IO流的40多个类都是从如下4个抽象类基类中派生出来的:
    (1)InputStream/Reader:所有的输入流的基类,前者是字节输入流,后者是字符输入流。
    (2)OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。

    Java IO与NIO的区别

    NIO即New IO,这个库是在JDK1.4中才引入的。NIO与IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高的多。在Java API中提供了两套NIO,一套是针对标准输入输出的NIO,另一套就是网络编程NIO。

    Java反射的作用与原理

    1.定义:
    反射机制就是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能调用它的任意一个方法。在java中,只要给定类的名字,就可以通过反射机制获取类的所有信息。
    这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

    2.哪里会用到这种反射机制?
    jdbc就是典型的反射机制
    Class.forName(‘com.mysql.jdbc.Driver.class’); //加载MySQL的驱动类
    这就是反射。如hibernate、struts等框架使用反射机制实现的。

    3.反射的实现方式:
    (1)Class.forName(“类的路径”);
    (2)类名.class
    (3)对象名.getClass()
    (4)基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象

    4.实现Java反射的类:
    (1)Class:表示正在运行的Java应用程序中的类和接口 注意:所有获取对象的信息都需要Class类来实现。
    (2)Filed:提供有关类和接口的属性信息,以及对它的动态访问权限。
    (3)Constructor:提供关于类的单个构造方法的信息以及它的访问权限
    (4)Method:提供类或接口中的某个方法的信息

    5.反射机制的优缺点:
    优点:
    (1)能够运行时动态获取类的实例,提高灵活性
    (2)与动态编译结合
    缺点:
    (1)使用反射性能较低,需要解析字节码,将内存中的对象进行解析。解决方案:1.通过setAccessible(true)关闭JDK的安全检查来提升反射速度;
    2.多次创建一个类的实例时,有缓存会快很多
    3.ReflectASM工具类,通过字节码生成的方式加快反射速度
    (2)相对不安全,破坏了封装性(因为通过反射可以获得私有方法和属性)

    说说List,Set,Map三者的区别:

    List(对付顺序的好帮手):List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象
    Set(注重独一无二的性质):不允许重复的集合。不会有多个元素引用相同的对象
    Map(用Key来搜索的专家):使用键值对存储。Map会维护与Key有关联的值。两个key可以引用相同的对象,但key不能重复,典型的Key是String类型,但也可以是任何对象。

    Object有哪些常用方法?大致说一下每个方法的含义

    java.lang.Object
    (1)clone方法
    保护方法,实现对象的浅复制(被复制对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象),只有实现了Colneable接口才可使调用该方法,否则抛出CloneNotSupportedException异常,深拷贝也需要实现Cloneable,同时其成员变量为引用类型的也需要实现Cloneable,然后重写clone方法。
    (2)finalize方法
    该方法和垃圾收集器有关系,判断一个对象是否可以被回收的最后一步就是判断是否重写了此方法。
    (3)equals
    该方法的使用频率非常高。一般equals和==是不一样的,但在Object中是一样的,子类一般都需要重写这个方法。
    (4)hashCode方法
    该方法用于哈希查找,重写了equals方法一般都需要重写hashCode方法,这个方法在一些具有哈希功能的Coleection中用到。
    (5)wait方法
    配合synchronized使用,wait方法就是使用当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果没有在规定时间内获得锁就返回。
    调用该方法后当前线程进入睡眠状态,直到以下事件发生:
    (1)其他线程调用了该对象的notify方法。
    (2)其他线程调用了该对象的notifyAll方法。
    (3)其他线程调用了interupt中断该线程。
    (4)时间间隔到了。
    此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
    (6)notify方法
    配合synchronized使用,该方法唤醒在该对象上等待队列中某个线程(同步队列中的线程是给抢占cpu的线程,等待队列中的线程指的是等待唤醒的线程)。
    (7)notifyAll方法
    配合synchronized使用,该方法唤醒在该对象上等待队列中的所有线程。

    有数组了为什么还要使用ArrayList呢?

    通常我们在使用的时候,如果在不明确要插入多少数据的情况下,普通数组就很尴尬了,因为你不知道初始化数组需要大小为多少,而ArrayList可以使用默认的大小,当元素个数打到一定程度后,会自动扩容。
    可以这么理解:我们常说的数组是定死的数组,ArrayList却是动态数组。

    说说什么是fail-fast?

    fail-fast机制是Java集合(Collection)中的一种错误机制。当多个线程对同一个集合操作时,就有可能产生fail-fast事件。
    例如:当某一个线程A通过iterator去遍历集合过程中,若该集合的内容被其他线程所改变了,那么线程A访问集合时,就会抛出ConcurrentModificationException(并发修改异常),产生fail-fast事件。这里的操作主要是指add、remove和clear,对集合元素个数进行修改。

    解决方法:建议使用"java.util.concurrent包下的类去取代"java.util"包下的类。
    可以这么理解:在遍历之前,把modCount记下来expectModCount,后面expectModCount去和modCount进行比较,如果不相等了,证明已经并发了,被修改了,于是抛出ConcurrentModificationException异常。

    说说Hashtable与HashMap的区别

    1.出生的版本不一样,HashTable出生于Java发布的第一版本JDK1.0,HashMap出生于JDK1.2。
    2.都实现了Map、Cloneable、Seriallizable(当前JDK 版本1.8)。
    3.HashMap继承地是是AbstractMap,并且AbstarctMap也实现了Map接口。Hashtable继承自Dictionary。
    4.Hashtable中大部分public修饰普通方法都是synchronized字段修饰的,是线程安全的,而HashMap是非线程安全的。
    5.Hashtable的key不能为null,value也不能为null,这个可以从Hashtable源码中的put方法看到,判断如果value为null就直接抛出空指针异常,在put方法中计算key的hash值之前并没有判断key为null的情况,那说明,这时候如果key为空,照样会抛出空指针异常。
    6.HashMap的key和value都可以为null。在计算hash值的时候,有判断,如果key==null,则其hash=0;至于value是否为null,根本没有判断过。
    7.Hshtable直接使用对象向的hash值。hash值是jdk根据对象的地址或者字符串或数字算出来的int类型的数值。然后在使用除留余数法来获取最终的位置。然而除法运算是非常耗时的,效率很低。HashMap为了提高计算机效率,将哈希表的大小固定为了2的幂,这样在取模预算时不需要做触发,只需要做位运算。位运算比触发的效率要高很多。
    8. Hashtable、HashMap 都使用了 Iterator。而由于历史原因,Hashtable 还使用了
    Enumeration 的方式。
    9.默认情况下,初试容量不同,Hashtable的初始长度是11,之后每次扩充容量变为之前的2n+1(n为上一次的长度)而HashMap的初试长度为16,之后每次扩充为原来的两倍。
    另外在Hashtable源码注释中有这么一句话:
    在这里插入图片描述
    大致意思为:Hashtable是线程安全的,推荐使用HashMap代替Hashtable;如果需要线程安全高并发的话,推荐使用ConcurrentHashMap代替Hashtable。

  • 相关阅读:
    Top 8 免费 iOS 系统恢复软件榜单
    【安卓】开发跳过广告app,具备“李跳跳”app的部分功能
    手把手教你解决ArrayIndexOutOfBoundsException数组越界异常
    机器人过程自动化(RPA)入门 2. 录制播放
    Hotel Manager 酒店管理系统
    电池故障估计:Realistic fault detection of li-ion battery via dynamical deep learning
    怎么把录音转换成mp3格式?
    TCP协议之《Pacing功能》
    网络编程——基础知识
    基于Android的手机通讯录设计
  • 原文地址:https://blog.csdn.net/weixin_49131718/article/details/127654207