Java面试八股文

目录

Java基础

1、Hashmap底层原理

2、如何解决哈希冲突

2.1你知道HahsMap死循环问题吗 ?

3、Concurrenthashmap 为什么是线程安全的?

TreeMap,HashMap,LinkedHashMap 的区别?

4、super和this的共同点的区别

5、final关键字

6、集合

6.1、map

6.2、set

6.3List

6.4、Queu

6.5、Stack

7、ArrayList,Vector, LinkedList 的存储性能和特性?

8、内存泄漏和溢出

9、int和Integer的区别

10、String、StringBuilder、StringBuffer区别

11、hashtable和hashmap的区别

12、方法重载的规则?

13、方法的重写的规则

14、thow和thows的区别

15.、抽象(abstract)类和接口的区别?

16、Java的基本类型和字节大小

17、访问修饰符的区别访问级别?

18、HashSet 的底层实现是什么?

19、为什么重写 equals 时必须重写 hashCode 方法?

20、HashSet 和 TreeSet 有什么区别?

21、Java 中的四大引用分别是什么?

22、数组在内存中如何分配

23、Java 中怎么创建一个不可变对象?

24、Java 中++操作符是线程安全的吗?

25、==与equals()区别

26、final,finalize 和 finally 的不同之处?

27、Java 的多态是什么,表现在哪里?**

28、static类型有什么特点

29、Java 创建对象的几种方式?

30、&和&&的区别?

31、在 java 源文件中可以有多个类吗内部类除外?

32.如何正确的退出多层嵌套循环?

33.内部类有什么作用?

34、深拷贝和浅拷贝的区别

35、值传递和引用传递

36、成员变量和局部变量的区别有哪些?

37、静态方法和实例方法有何不同?

38、多态的优点?

39、Java 面向对象的特征有哪些方面?

40、什么是反射

41、反射的作用

42、break 和 continue 的区别?

43、Collection 和 Collections 的区别?

44、Error 和 Exception 有什么区别?

45、Comparable 和 Comparator 接口的区别?

46、switch 能否作用在 byte,long,String 上?

47、什么是迭代器(Iterator)?

48、Iterator 和 ListIterator 的区别是什么?

49、Enumeration 接口和 Iterator 接口的区别有哪些?

50、字符串常量池到底存在于内存空间的哪里?

51、Java 中的编译期常量是什么,使用它又什么风险?

52、用哪两种方式来实现集合的排序?

53、说出一些 JDK1.8 的新特性?


Java基础

1、Hashmap底层原理

它的底层是数组、链表、因此在JDK1.8之后,加上了红黑树
数组初始默认长度是16,加载因子为0.75,当超过16*0.75时会扩容到原来的两倍;
1、通过hash算法计算出当前的hashcode值,跟据数组长度取余,跟据获得的余数存储到相应的数组中。
2、通过下标存储键值时,如果当前数组下标没有其他键直接存入,如果数组中存有其他键值时则会发生hash碰撞。
3、发生哈希碰撞后,会继续比较该下标处所有的key值,如果equals返回true,进行覆盖操作,false,就在最后一个键值对后面进行追加操作,形成单向链表。
4、如果链表长度>=8,数组长度<64就进行扩容操作,并且会重新排序,若>=64则会形成红黑树。
5、当调用remove方法时,会删除元素,当红黑树剩余的键值对个数<=6时,会重新还原成单向链表。
​

2、如何解决哈希冲突

1、拉链法(用的)
2、在哈希法
3、创建公共溢出区
4、开放寻址法:
    (1)线性探测法
    (2)平方探测法

2.1你知道HahsMap死循环问题吗 ?

HashMap在扩容数组的时候,会将旧数据迁徙到新数组中,这个操作会将原来链表中的数据颠倒,比如a->b->null,转换成b->a->null这个过程单线程是没有问题的,但是在多线程环境,就可,能会出现a->b->a->b....,这就是死循环
​
在JDK1.8后,做了改进保证了转换后链表顺序一致,死循环问题得到了解决。但还是会出现高并发时数据丢失的问题,因此在多线程情况下还是建议使用ConcurrentHashMap来保证线程安全问题

3、Concurrenthashmap 为什么是线程安全的?

TreeMap,HashMap,LinkedHashMap 的区别?

LinkedHashMap 可以保证 HashMap 集合有序。存入的顺序和取出的顺序一致。
TreeMap 实现SortMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。
HashMap 不保证顺序,即为无序的,具有很快的访问速度。

4、super和this的共同点的区别

this引用当前对象的实例变量或方法,帮助区分同名的局部变量和成员变量。
而 super引用父类的成员变量或方法,通常用来调用父类的方法或构造函数。
this 和 super 的共同点在于它们都用于访问对象的属性或方法,但 this 指向当前实例,而 super 指向父类。

5、final关键字

被final修饰的类不能被继承,修饰方法不能被重写,修饰的变量不能改变。

6、集合

6.1、map

键值对,键值key是不能重复的,value可以,一个key对应一个value
treemap有序,hashmap无序

6.2、set

不可重复的集合,只能用iterator实现单项遍历

6.3List

有序可重复,用 Iterator 实现单向遍历,用ListIterator 实现双向遍历

6.4、Queu

先进先出,offer()来添加元素,使用 poll()来移除元素

6.5、Stack

遵从后进先出原则,

7、ArrayList,Vector, LinkedList 的存储性能和特性?

ArrayList 和 Vector 都是使用数组方式存储数据,Vector用了synchronized方法(线程安全)改查快,而 LinkedList 使用双向链表实现存储,增删快

8、内存泄漏和溢出

泄露是应用程序在申请内存后,无法释放已经申请的内存空间,及时关闭流和数据库链接释放
溢出是申请内存时,没有足够的内存空间供其使用,分批提交。

9、int和Integer的区别

Integer是int的包装类,int是基本类型,直接存储数值;Integer是对象,里面有方法

10、String、StringBuilder、StringBuffer区别

String字符串常量,不可变,使用字符串拼接时是不同的 2 个空间
StringBuffer字符串变量,可变,线程安全,字符串拼接直接在字符串后追加
StringBuilder字符串变量,可变,非线程安全,字符串拼接直接在字符串后追加

11、hashtable和hashmap的区别

hashtable是线程安全的,不允许key和value值为null,多一个elements方法
hashmap是非线程安全的,key和value可以为null

12、方法重载的规则?

方法名一致,参数列表中参数的顺序,类型,个数不同。
重载与方法的返回值无关,存在于父类和子类,同类中。
可以抛出不同的异常,可以有不同修饰符。

13、方法的重写的规则

参数列表、方法名、返回值类型必须完全一致,构造方法不能被重写;
final修饰的方法不可以
声明为 static 的方法不存在重写
访问权限不能比父类低,
异常抛出范围不能比父类大

14、thow和thows的区别

thow:
在方法体内,表抛出异常,由方法体内的语句处理。执行thow就是一定抛出异常
thows:
用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。表示出现异常的一种可能性,并不一定会发生这种异常。

15.、抽象(abstract)类和接口的区别?

1、接口中所有的方法都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
2、类可以实现所有的接口,但只能继承一个抽象类
3、类实现接口,必须实现接口中所有的方法,但是继承抽象类不用,不过这个类也成抽象类
4、抽象类可以在不提供接口方法实现的情况下实现接口。
5、Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。
7、接口是绝对抽象的,不可以被实例化(java 8 已支持在接口中实现默认的方法)。抽象类也不
可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。

16、Java的基本类型和字节大小

布尔型 boolean 8 位;字节型 byte 8 位; 字符型 char 16 位;
短整型 short 16 位;整形 int 32 位; 长整形 long 64 位;
浮点型 float 32 位;双精度 double 64 位;

17、访问修饰符的区别访问级别?

public:公共的,都可以访问 

protected:受保护的,只要同类中、同包下、子类中可以访问 

没有访问修饰符:只能同类中、同包下可以访问 

private:私有的,只能同类中可以访问

18、HashSet 的底层实现是什么?

底层是hashmap,hashset的值就是hashmap的key存在hashmap

19、为什么重写 equals 时必须重写 hashCode 方法?

如果两个对象相等,则hashcode一定相等,但是hashcode默认是对对堆上的对象产生独特值,如果没有重写hashcode,两个对象无论如何都不会相等

20、HashSet 和 TreeSet 有什么区别?

hashset是由一个 hash 表来实现的,因此,它的元素是无序的。O(1)
TreeSet 是由一个树形的结构来实现的,它里面的元素是有序的O(logn)

21、Java 中的四大引用分别是什么?

1、强引用 String s = "abc",只要强引用存在,则垃圾回收器就不会回收这个对象。
2、软引用 如果内存足够,不回收,如果内存不足,则回收
3、弱引用 一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存
4、虚引用 在任何时候都可能被垃圾回收器回收

22、数组在内存中如何分配

使用 new 关键字创建的时候,会在堆上分配内存空间,每个数组成员是一个引用(指针)
引用到栈上的空间。

23、Java 中怎么创建一个不可变对象?

1.对象的状态在构造函数之后都不能被修改,任何修改应该通过创建一个新对象来实现.
2.所有的对象属性应该都设置为 final。
3.对象创建要正确,例如:对象的应用不能在构造函数中被泄露出去
4.对象要设置为 final,确保不要继承的 Class 修改了 immutability 特性

24、Java 中++操作符是线程安全的吗?

不是线程安全的操作,它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可
能会出现多个线程交差。

25、==与equals()区别

一般用==比较基本类型,是不是指向同一个内存空间。
用equals比较对象,只有对象可以调用,默认是比较对象地址是否相同,比如 String 的 equals 是比较的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值