Java八股文基础篇-02

本文详细比较了Java中的String、StringBuffer、StringBuilder、ArrayList、Vector、LinkedList、Stack、List、Set、Collection、Map等类和接口,以及它们之间的异同,涉及线程安全、哈希表原理、序列化和反射等关键概念。
摘要由CSDN通过智能技术生成

42、String、StringBuffer、StringBuilder的区别

String:
  字符串对象不可变,字符串常量可以共享。
StringBufferStringBuilder:
    可变字符序列。

   StringBuffer:线程安全
   StringBuilder:线程不安全

43、ArrayList和Vector的区别

ArrayList:
    线程不安全的动态数组,数组初始化长度为0,默认扩容为1.5倍。
Vector:
    线程安全的动态数组,数组初始化长度为10,默认扩容为2倍。

44、ArrayList、Vector和LinkedList的区别

ArrayListVector:动态数组
    需要扩容。
    非末尾位置增加、删除元素,需要移动元素。
    ArrayListVector实现List接口。
    
LinkedList:双向链表    
    不需要扩容和移动元素。
    LinkedList实现ListQueueDeque接口。

45、Stack和LinkedList的区别

Stack:
    是Vector的子类,是顺序栈,底层是数组。
LinkedList:
    是链式栈,底层是双向链表。

46、List和Set的区别

List:
    元素有序:元素的存储和添加顺序一致。
    元素可重复。
Set:
    元素存储和添加顺序无关。
    元素不可重复。

47、Collection和Map的区别

Collection:
    存储一组对象
Map:
    存储键值对

48、Hashtable和HashMap的区别

Hashtable:
    线程安全的,不允许key和value为null
HashMap:
    线程不安全的,允许key和value为null

49、Hashtable和HashMap、TreeMap的底层实现

Hashtable:
    数组+链表
HashMapJDK1.8之前:数组+链表
    JDK1.8及之后:数组+链表/红黑树
TreeMap:
    红黑树

50、哈希表的底层数组长度为什么是2的n次方

因为2的n次方-1的二进制值是前面都0,后面几位都是1,这样的话,与hash进行&运算的结果就能保证在[0,table.length-1]范围内,而且是均匀的。

如果手动指定为一个非2的n次方的数组长度,HashMap是否接收呢?如果不接收怎么处理呢?

会纠正为>=手动指定的长度的最近的一个2的n次方值。

51、哈希表的数组的元素类型

java.util.Map$Entry接口类型。

JDK1.7HashMap中有内部类Entry实现Entry接口

JDK1.8HashMap中有内部类NodeTreeNode类型实现Entry接口,并且TreeNodeNode的子类。

52、哈希表的键值对如何计算存储位置

hash & table.length-1

53、哈希表要用链表或红黑树?

为了解决hash和[index]冲突问题

(1)两个不相同的key的hashCode值本身可能相同

(2)两个不相同的key的hashCode值不同,但是经过hash()运算,结果相同

(3)两个hashCode不相同的key,经过hash()运算,结果也不相同,但是通过 hash & table.length-1运算得到的[index]可能相同

那么意味着table[index]下可能需要存储多个Entry的映射关系对象,所以需要链表或红黑树

54、HashMap的数组什么时候扩容?

JDK1.7版:当要添加新Entry对象时发现(1)size达到threshold(2)table[index]!=null时,两个条件同时满足会扩容

JDK1.8版:当要添加新Entry对象时发现(1)size达到threshold(2)当table[index]下的结点个数达到8个但是table.length又没有达到64。两种情况满足其一都会导致数组扩容

而且数组一旦扩容,不管哪个版本,都会导致所有映射关系重新调整存储位置。

55、如何计算阈值threshold

threshold = table.length * loadfactor

56、loadfactor的默认值是多少

0.75

57、JDK1.8的HashMap什么时候树化?为什么要树化?

当table[index]下的结点个数达到8个但是table.length已经达到64
因为当table[index]下的结点个数超过8个后,查询效率就低下了,修改为红黑树的话,可以提高查询效率

58、JDK1.8的HashMap什么时候反树化?为什么要反树化?

当table[index]下的树结点个数少于等于6个
(1)当继续删除table[index]下的树结点,最后这个根结点的左右结点有null,或根结点的左结点的左结点为null,会反树化
(2)当重新添加新的映射关系到map中,导致了map重新扩容了,这个时候如果table[index]下面还是小于等于6的个数,那么会反树化
    
因为当table[index]下树的结点个数少于6个后,使用红黑树反而过于复杂了,此时使用链表既简洁又效率也不错

59、请问已经存储到HashMap中的key的对象属性是否可以修改?为什么?

如果该属性参与hashCode的计算,那么不要修改。因为一旦修改hashCode()已经不是原来的值。
而存储到HashMap中时,key的hashCode()-->hash()-->hash已经确定了,不会重新计算。用新的hashCode值再查询get(key)/删除remove(key)时,算的hash值与原来不一样就不找不到原来的映射关系了。

60、如何key是null,在哈希表中如何存储

会存在table[0]

61、两个字符串比较用什么方法

eqauls方法
如果要忽略大小写,用equalsIgnoreCase方法

62、TCP/UDP协议有什么区别

TCP:面向连接的可靠的基于字节流的传输控制协议
UDP:非面向连接的不可靠的基于用户数据报的协议

63、线程安全问题是什么,如何解决

当多个线程使用共享数据时,就会有线程安全问题。
可以加同步synchronized解决。
同步代码块或同步方法。
同步代码块:手动选择同步锁对象。
同步方法:静态方法的同步锁对象是当前类的Class,非静态方法的同步锁对象是this

64、IO流的四个抽象基类是什么

InputStream:字节输入流
OutputStream:字节输出流
Reader:字符输出流
Writer:字符输出流

65、如何实现对象序列化?

对象序列化需要用ObjectOutputStream的writeObject方法,对象的反序列化需要用ObjectInputStream的readObject方法。
对象的类型需要实现java.io.Serializable接口,并加序列化版本IDtransientstatic修饰的成员变量都不序列

66、Class类对象如何获取

类型名.class
对象.getClass
Class.forName(类型全名称)
类加载器对象.loadClass(类型全名称)

67、反射的作用

实现Java语言的动态性。
在运行时动态获取类信息,动态创建对象,动态操作属性,动态调用方法。

68、什么是函数式接口

只有一个抽象方法的接口,即SAM接口(Single Abstract Inteface

69、什么是Lambda表达式?

Lambda表达式是一种实现函数式接口的新语法。

70、举几个函数式接口的例子

java.lang.Runnable
java.util.Comparator
java.util.function.Consumer
java.util.function.Predicate
java.util.function.Supplier
java.util.function.Function

70、Comparable和Comparator的区别

Comparable:自然比较接口
Comparator:定制比较接口    

71、Iterable和Iterator的区别

Iterable:可迭代接口,实现它的集合就可以支持foreach循环遍历
Iterator:迭代器接口

72、sleep() 和 wait() 有什么区别?

sleep和wait都会导致当前线程进入阻塞状态,被挂起。

sleep不释放锁,睡眠时间到自动醒来,回到就绪状态
wait是会释放锁,要通过notify()notifyAll()唤醒,回到就绪状态

sleep是在Thread类中声明的一个静态方法,Thread.sleep(毫秒)
wait是在Object类中声明的非静态的方法,必须锁对象调用

73、请解释Java异常处理机制相关的5个关键字

try:尝试执行可能发生异常的代码。
catch:尝试捕获try部分发生的异常。可以存在多个catch,如果多个catch的异常类型有继承关系,那么遵循子上父下。
finally:不管是否发生异常都要执行的代码放在finally块中。
throws:方法声明时显示抛出异常,指定该方法可能抛出的异常类型列表。
throw:手动抛出异常,可以抛出系统预定异常,也可以抛出用户自定异常,而且用户自定义异常必须用throw语句抛出,可以代替return语句结束方法运行。

74、访问修饰符的作用范围由大到小,及各自的范围是什么?可以修饰什么?

修饰符的作用范围由大到小:publicprotected、缺省、private

本类本包的所有类其他包的子类其他包的非子类
private
缺省(不写)
protected
public

这些权限修饰符可以修饰的角色:

class(外部类)成员变量成员方法成员内部类
private
缺省(不写)
protected
public

75、请列出一些常用的类、接口、包,各至少5个

注意答案不固定
常用类:StringMathArrayListHashMapSystem,ArraysLocalDateThreadHashSetLinkedList等
常用接口:ComparableComparatorRunnableSerializableCollectionMap,List,Set,IteratorConsumerPredicate等
常用包:java.lang, java.util,java.io,java.net,java.text,java.lang.reflect,java.time,java.util.function,java.math等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu-Chao Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值