大数据开发(Java面试真题-卷二)

03-08 阅读 0评论

大数据开发(Java面试真题)

  • 1、请简要说明Java中equeals()和hashCode()的作用及区别?
  • 2、Java中的四种访问修饰符及它们之间的区别?
  • 3、请解释Java中的异常处理机制,包括checked exception和unchecked exception?
  • 4、Java线程池的核心参数有哪些?
  • 5、Java中深拷贝和浅拷贝的区别是什么?
  • 6、Java中ArrayList和LinkedList区别是什么?
  • 7、Java中ArrayList扩容过程是什么?
  • 8、Java中HashMap底层实现是什么?
  • 9、Java中ConcurrentHashMap支持多并发的原理是什么?
  • 10、JVM中一个类加载的过程是什么样子?

    1、请简要说明Java中equeals()和hashCode()的作用及区别?

    equals()方法判断两个对象是否相同,在Object类中默认比较两个对象是否为同一引用。而hashCode()方法返回对象对应的哈希码值,主要被哈希表使用

    大数据开发(Java面试真题-卷二),大数据开发(Java面试真题-卷二),词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,访问,方法,第1张
    (图片来源网络,侵删)

    作用:

    -equals():主要用户判断两个对象内容是否相同(而不是引用地址),可以根据业务需求进行重写。

    -hashCode():主要用于提高对对象的查找和存储效率,将对象映射为哈希表中的索引。

    区别:

    1. equals()和hashCode()是不同目的所使用的方法,equals()用于判断对象内容相等性,hashCode()主要用于哈希表存储。
    2. 如果两个对象调用equals()方法返回true,则它们的hashCode值应该一样,但反之则不成立。

    2、Java中的四种访问修饰符及它们之间的区别?

    Java中有四种访问修饰符:public、protected、private和default(即没有明确的修饰符)。它们用于限定类、方法和变量对其它类或子类的可见性。

    -public:可以被所有类访问。被public修饰的类、方法和变量都可以在任何地方访问。

    大数据开发(Java面试真题-卷二),大数据开发(Java面试真题-卷二),词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,访问,方法,第2张
    (图片来源网络,侵删)

    -protected:只能在声明所在类或者子类中使用。被protected修饰的方法和成员变量对于同一包内其它类也是可见的。

    -private:仅可以在声明所在类内部使用。私有对象无法从该类外部直接访问。

    -default:没有明确指定访问级别,也称为包级私有访问权限。默认情况下,只允许同一个包内的其它类进行访问。

    3、请解释Java中的异常处理机制,包括checked exception和unchecked exception?

    Java的异常处理机制适用于处理程序运行时可能出现的错误和异常情况。Java中的异常可分为两种类型:checked exception(被检查的异常)和unchecked exception(未被检查的异常)。

    -Checked Exception:这些在编译时由编译器强制要求进行捕获或声明抛出。例如,‘IOException’、'SQLException’等。如果不对这些异常进行try-catch捕获或throws声明抛出,代码将无法通过编译。

    -Unchecked Exception:这些是在运行时发生且不需要显式捕获或声明抛出。常见的Unchecked Exceptions包括"NullPointerException",'ArrauIndexOutOfBoundsException’等。

    大数据开发(Java面试真题-卷二),大数据开发(Java面试真题-卷二),词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,访问,方法,第3张
    (图片来源网络,侵删)

    对于Checked Exceptions,开发者必须根据具体情况选择合适的方式来处理它们,比如使用try-catch快来捕获并处理该类异常;而对于Unchecked Exceptions通常可以通过良好的编程实践避免其发生,或者选择适当层次向上抛出以由调用方去负责处理。

    4、Java线程池的核心参数有哪些?

    corePoolSize:线程池的基本大小,即在没有任务执行时线程池的大小,并且只有在工作队列满了的情况下,才会创建超出这个数量的线程。

    maximunPoolSize:线程池最大线程数。这是线程池可以容纳的最大线程数,超出这个数的线程会被拒绝。

    workQueue:当线程池中的线程都被使用时,新任务会被放在这个队列中等待被执行。这个参数通常是一个实现了BlockingQueue、LinkedBlockingQueue或SynchronousQueue。

    threadFactory:用于创建新线程的工厂。使用这个工厂可以自定义如何创建线程,例如设置线程的名称、优先级等。

    handler:当线程池和工作队列都满了,用于处理被拒绝的任务。常见的实现有AbortPolicy(直接抛出异常)、CallerRunsPolicy(用调用者的线程执行任务)、DiscardPolicy(静默丢弃任务)和DiscardOldestPolicy(丢弃队列中最旧的任务)。

    keepAliveTime:当线程池中的线程数量超过corePoolSize时,这是多余的空闲线程在被终止前等待新任务的最长的时间。

    timeUnit:keepAliveTime参数的时间单位,如TimeUnit.SECONDS、TimeUnit.MILLISECONDS等。

    这些参数共同决定了线程池的创建、运行和任务处理策略。

    5、Java中深拷贝和浅拷贝的区别是什么?

    在Java中,深拷贝和浅拷贝是对于对象复制的两种不同方式。

    浅拷贝:是创建一个新对象,该对象的实例变量与原对象相同,如果有引用类型的成员变量,浅拷贝仅仅复制了引用而不是创建新的对象。这意味着原对象和浅拷贝对象会共享相同的引用类型成员变量,对其中一个对象的修改会影响到另一个对象。

    深拷贝:是创建一个新对象,该对象的所有实例变量都会被复制,并且会为引用类型的成员变量创建新的对象。这意味着原对象和深拷贝对象是完全独立的,对其中一个对象的修改不会影响到另一个对象。

    在Java中,可以通过实现Cloneable接口和重写clone()方法来实现浅拷贝。对于深拷贝,可以通过实现Serializable接口并使用对象序列化和反序列化来实现,或者通过手动复制所有引用类型成员变量的值来实现。

    需要注意的是,如果引用类型成员变量也实现了Cloneable接口并进行了深拷贝,那么在进行深拷贝时需要在clone()方法中递归调用成员变量clone()方法,确保所有层级的引用类型对象都被正确复制。

    6、Java中ArrayList和LinkedList区别是什么?

    ArrayList和LInkedList是Java中两种不同的集合类,它们的区别主要体现在以下几个方面:

    1. 数据结构:ArrayList是基于动态数组实现的,通过数组实现元素的存储和访问;而LinkedList则是基于双向链表实现的,通过链表节点实现元素的存储和访问。
    2. 插入和删除操作:ArrayList在尾部进行插入和删除操作比较高效,因为它使用数组实现,可以直接在尾部进行元素的增删;而在中间或头部进行插入和删除操作时,由于需要移动元素,效率较低。而LinkedList在任意位置进行插入和删除操作效率较高,因为它只需要更改节点的指针即可。
    3. 随机访问:ArrayList支持通过下标进行随机访问,可以通过索引快速定位元素;而LinkedLisk不支持直接通过下标访问,需要从头节点或尾节点开始遍历链表,直到找到对应位置的元素。
    4. 内存访问:ArrayList在存储元素时需要预留一定的空间,当元素数超过预留空间时,需要进行动态扩容;而LinkedList则不需要进行扩容操作,但是每个节点需要存储额外的指针信息,相对于ArrayList来说占用的内存较多。

    综上所述,如果需要频繁进行插入和删除操作,并且不需要频繁随机访问元素,可以选择使用LinkedList;如果需要频繁随机访问元素,可以选择使用ArrayList。

    7、Java中ArrayList扩容过程是什么?

    1. 在创建ArrayList对象时,默认会创建一个初始容量为10的数组。
    2. 当添加新元素时,如果当前数组已满(即元素个数等于数组容量),则会触发扩容操作。
    3. 扩容操作会创建一个新的数组,新数组的容量是原数组容量的1.5倍(JDK1.4之前为原容量的2倍)。
    4. 将原数组中的元素逐个复制到新数组中。
    5. 更新ArrayList内部的引用指向新数组。
    6. 新元素添加到新数组中。

    8、Java中HashMap底层实现是什么?

    Java中HashMap底层实现是通过哈希表(HashTable)和链表(LinkedList)结合的方式来实现的。具体来说,HashMap内部维护了一个数组,数组的每个元素是一个链表的头节点。当我们往HashMap中插入键值对时,首先会根据键的哈希值计算出在数组中的位置,然后将该键值对插入到对应链表的末尾。如果发生哈希冲突,即多个键的哈希值相同时,会将新的键值对插入到链表的头部。当链表的长度超过一定阈值(默认为8),链表就会转化为红黑树,以提高查询效率。在进行查询操作时,根据键的哈希值找到对应链表或红黑树,然后再遍历链表或搜索红黑树,找到对应值。这种底层实现方式使得HashMap再插入、删除和查找操作上都具有较高的效率。

    9、Java中ConcurrentHashMap支持多并发的原理是什么?

    ConcurrentHashMap是Java中线程安全的哈希表实现,它支持多并发操作的原理主要有以下几点:

    1. 分段锁:ConcurrentHashMap内部将数据分成多个段,每个段都可以独立地进行加锁和解锁操作。这样不同的线程可以同时访问不同的段,从而提高并发能力。
    2. 锁分离:与传统的同步容器不同,ConcurrentHashMap的读操作并不需要加锁,多个线程可以同时进行读操作,只要写操作需要加锁。这样可以避免不必要的阻塞,提高了并发读的效率。
    3. CAS(比较并交换)操作:ConcurrentHashMap使用了CAS操作来保证线程安全。在并发写操作时,通过CAS操作来实现无锁的数据更新。
    4. 红黑树:ConcurrentHashMap中的每个段内部使用了红黑树来存储数据,当链表长度超过阈值时,会将链表转化为红黑树,这样可以保证在最坏的情况下仍然有较高的性能。

    10、JVM中一个类加载的过程是什么样子?

    1. 加载:类加载的第一步是加载,即通过类的全限定名找到对应的二进制字节码文件。这个过程可以通过类加载器完成,类加载器会根据类的名称定位到类文件,并将其读取到内存中。
    2. 验证:在加载完成后,JVM会对加载的类进行验证,确保类文件的字节码符合JVM规范,不会危害JVM的安全。验证的过程包括文件格式验证、元数据验证、字节码验证以及符号引用验证。
    3. 准备:在验证通过后,JVM会为类的静态成员遍历分配内存空间,并设置默认初始值。这个过程并不会为实例变量分配空间,只是为静态变量分配。
    4. 解析:解析阶段是将符号引用替换为直接引用的过程。符号引用是一种编译时的引用,直接引用是在运行时可直接指向内存地址的引用。解析过程包括将常量池中的符号引用替换为直接引用、将类、方法、字段等符号解析为具体的内存地址。
    5. 初始化:在准备阶段完成后,JVM会开始执行类的初始化过程。类初始化时会执行类的静态代码块和静态变量的赋值操作。这个过程是类加载的最后一个阶段。
    6. 使用:类加载完成后,就可以使用该类创建对象、调用方法等操作。

免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,人围观)

还没有评论,来说两句吧...

目录[+]