Java基础问题

1. 说⼀下final关键字和final的4种⽤法?
final表示不可修改。1.可以用来修饰一个类表示不可继承。2.可以修饰一个方法表示不可重写。3.可以修饰一个变量表示不可修改。4.可以修饰一个参数表示此参数不允许修改。

2. public 、protected和private区别?private能被继承吗?
public(公有)可以被当前项目中的所有类访问,protected(保护)可以被同一包下的类访问,以及被子类访问,private(私有)只可被当前类访问。

private不能被继承。

3. switch 和 if 的区别

1.if和switch判断条件的数据类型不同,if是布尔类型,switch可以是int,char,String,byte,枚举。

2.if相较与switch更加实用,switch在分支很多的情况下会更高效,其他情况一般用if。

4.讲下多态

多态就是父类引用子类对象的时候调用同一个方法会表现出多种不同的结果,原因就是子类对于父类方法的重写。多态可以降低类型间的耦合度,使代码拥有更好的维护性和拓展性。

5.重写与重载的区别

重载是定义相同的方法名,参数要有不同的地方,要能清楚的知道你调用的是那个方法,重写是子类重写父类的方法,参数必须相同。

重载的返回值没有限制,重写的返回值必须小于等于父类(即返回值与父类返回值相同或为子类)。
重载是在一个类中,重写是子类与父类之间的。

6. 如何实现⼀个不可变类

  1. 将类声明为final,所以它不能被继承。
  2. 将所有的成员声明为私有的,这样就不允许直接访问这些成员。
  3. 对变量不要提供setter方法。
  4. 将所有可变的成员声明为final,这样只能对它们赋值一次。
  5. 通过构造器初始化所有成员,进行深拷贝。
  6. 在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝。

7. 怎么判断两个整数是否相等
使用equals或==判断,如果是基本数据类型,==会直接比较他们的值,如果是引用数据类型,==会比较他们的地址,equals也是使用==来判断的,不过一些类会对equals进行重写,让他去比较引用数据类型的值(如String)。

8. String类可不可以继承
不能,String有final修饰符修饰,不能被继承。

9. equals和hashcode的区别
hashcode会比较对象的哈希值,哈希值不同的对象一定不同,但哈希值相同的对象也不一定相同,这时候就需要equals来做最终的判断。

不过相较于equals,hashcode使用起来更加轻便,所以可以使用他进行排除,排除掉那些一定不相同的,再用equals来做判断,这样会更有效率。

10. hashcode的作⽤

相较于equals,hashcode使用起来更加轻便,所以可以使用他进行排除,排除掉那些一定不相同的,再用equals来做判断,这样会更有效率。
11. int和Integer的区别?为什么要有包装类?

数据类型不同:int 是基本数据类型,而 Integer 是包装数据类型。
默认值不同:int 的默认值是 0,而 Integer 的默认值是 null。
内存中存储的方式不同:int 在内存中直接存储的是值,而 Integer 实际存储的是对象引用。
实例化方式不同:Integer 必须实例化才可以使用,而 int 不需要。
变量的比较方式不同:int 可以使用 == 来对比两个变量是否相等,而 Integer 一定要使用 equals 来比较两个变量是否相等。
Java的设计理念是一切皆对象,而基本数据类型不符合这一点,所以要有包装类。

12. ==和equals⽐较的区别

如果是基本数据类型,==会直接比较他们的值,如果是引用数据类型,==会比较他们的地址,equals也是使用==来判断的,不过一些类会对equals进行重写,让他去比较引用数据类型的值(如String)。
13. 抽象类和接⼝的区别

一个类可以实现多个接口,但只能继承一个类。

抽象类中可以有具体的方法,接口在jdk1.8之前只能有抽象方法。

接口没有构造方法,抽象类可以有构造方法。

抽象类中可以有变量,接口中只能有静态常量。

14. Object类的原⽣⽅法有哪些?
1、实现对象的浅复制的clone方法;2、获得运行时类型的getclass方法;3、释放资源的finalize方法;4、用于哈希查找的hashCode方法;5、使当前线程等待该对象的锁wait方法。

15.java泛型

保证类型安全,消除强制类型转换,避免了不必要的装箱、拆箱,提高了性能。

16. String/StringBuffer/StringBuilder 区别

String不可改变,另外两个可以改变。

StringBuffer是线程安全的,效率相对较低,不需要考虑线程安全的时候一般使用StringBuilder。
17. java的static关键字有什么⽤
被static关键字修饰的方法或者变量成为了类方法或类变量,生命周期与类相同,不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。

18. Java基本类型与引⽤类型的区别
基本数据类型变量的具体内容是存储在栈中的。只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址

传递参数时基本数据类型传递的是值,而引用数据类型传递的是地址。

19. super和this的区别

1、代表的对象不同;this:本身调用这个对象;super:调用的是父类对象。

2、前提不同;this:没有继承也可以使用;super:只能在继承条件下才可以使用。

3、构造方法;this() 本类的构造;super() 父类的构造。

20. ArrayList LinkedList区别

ArrayList是基于数组的,LinkedList是基于链表的。

ArrayList随机访问效率更高,LinkedList对中间进行增加和删除是更有效率。

LinkedList实现了Deque接口,可以用于创建队列之类的。

21. Set如何保证不重复?
1.根据对象的哈希值计算存储位置如果当前位置没有元素则直接存入如果当前位置有元素存在,则进入第二步。
2.当前元素的元素和已经存在的元素比较哈希值如果哈希值不同,则将当前元素进行存储如果哈希值相同,则进入第三步通过equals()方法比较两个元素的内容。
3.如果内容不相同,则将当前元素进行存储,如果内容相同,则不存储当前元素。
22. map熟悉吗?说⼀下,哈希冲突有哪些好的解决办法

1. 开放地址法
(1)线性探测再散列
放入元素,如果发生冲突,就往后找没有元素的位置;
(2)平方探测再散列
如果发生冲突,放到(冲突+1平方)的位置,如果还发生冲突,就放到(冲突-1平方)的位置;如果还有人就放到(冲突+2平方)的位置,以此类推,要是负数就倒序数。

2. 拉链法
如果发生冲突,就继续往前一个元素上链接,形成一个链表,Java的hashmap就是这种方法。
3. 再哈希
如果发生冲突,就用另一个方法计算hashcode,两次结果值不一样就不会发生hash冲突;

4. 建立公共溢出区
将哈希表分为基本表和溢出表两部分,与基本表发生冲突的元素,一律填入溢出表。

23. HashMap 有⼏种遍历的⽅法?推荐使⽤哪种?
1.EntrySet 遍历2.KeySet 遍历3.EntrySet 迭代器遍历4.KeySet 迭代器遍历5.Lambda 遍历6. Stream 单线程遍历7. Stream 多线程遍历 答案不固定。

24. hashmap的底层实现


hashmap基于数组、链表+红黑树。插入时通过哈希算法和与运算计算下标,若当前下标没有值,封装后直接插入,若有值则比较key,key不同使用尾插法插入链表中,相同替换value。尾插法时会遍历链表,若长度大于8则转变为红黑树。

25. hashmap扩容机制
hashmap在插入时会判断是否超过阈值,若超过则会扩容,长度为原数组的两倍,原来时链表的会直接计算下标之后放入新数组,原来是红黑树的计算时会统计下标的数量,8以上生成红黑树,以下是链表,结束后指向新数组,扩容就完成了。
26. hashmap和hashtable的区别
hashmap基于数组、链表+红黑树,hashtable基于数组、链表。
hashmap线程不安全,hashtable线程安全。
hashmap键值可以为空,hashtable不可以。
hashmap初始容量为16,hashtable初始容量为11。
hashmap扩容机制为当前容量翻倍,hashtable扩容机制为当前容量翻倍+1。
27. ConcurrentHashMap
他与hashmap的区别在于是线程安全的,在扩容时可以使用多线程,每个线程负责一部分。
28. Java反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,这种功能叫做反射机制。
29. 内部类和静态类的本质区别是什么?
静态内部类不需要有指向外部类的引用;非静态内部类需要持有对外部类的引用
静态内部类可以有静态方法、属性;非静态内部类则不能有静态方法、属性
静态内部类只能访问外部类的静态成员,不能访问外部类的非静态成员;非静态内部类能够访问外部类的静态和非静态成员
静态内部类不依赖于外部类的实例,直接实例化内部类对象;非静态内部类通过外部类的对象实例生成内部类对象
30.BIO,AIO和NIO的区别?
BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 
NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 
AIO:异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
31.get 和post区别

post采用隐式传参,get采用显示传参。get传输数据有长度的限制,而post没有长度的限制。get常用来获取数据,post常用来提交数据。get请求会被浏览器主动缓存,post请求不会被浏览器主动缓存,可手动设置缓存。get请求只支持url编码,post请求支持多种编码方式

32.对象new过程

首先判断类是否被加载,若没有被加载,先进行类加载,加载、验证、准备、解析、初始化。

类加载完成后进行分配内存空间、实例变量赋默认值、设置对象头、执行初始化方法。

33.同步IO和异步IO的区别?

同步的意思是在要做的事情完成前一直等结果。

异步则是等结果出来后收到通知,不会一直等结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值