java知识点整理_20210728

1.面向对象的基本特征

继承:通常发生在父类与子类之间,所谓的子类对象继承父类对象的属性或方法。从而使得子类对象具有和父类对象相同的行为或特征;
封装:隐藏对象的属性活着方法的实现逻辑,对对象的访问只能通过对外公开的接口或方法,通过封装实现对对象内部数据的提供不同级别的保护;
多态:对于同一个行为,不同的子类具有不同的表现形式,多态的实现:子类继承父类》子类重写父类方法。

2.&和&&的区别

两者都是逻辑与运算符,&&具有短路性质,故实际应用中大多使用&&,比如`if(str != null && "".equals(str)){}`这段代码中就运用了短路的有点,选择使用&&,而&更多是使用在位运算中。

3.关于String

3.1)  String 是 Java 基本数据类型吗
		string不是基本数据类型,java中的数据类型有8种,分别是short,int,long,byte,boolean,char,double,float;
3.2)	String 类可以继承吗
		String不可以被继承,因为String是被final修饰的(原因参考第四条)
3.3)	String,StringBuffer,StringBuilder
		String是一个不可扩展的对象,每一次对String的修改都是创建了新的String对象;
		StringBuffer和StringBuilder是可扩展的对象,可以对值进行修改
		StringBuffer被synchronized修饰,是线程安全的,而StringBuilder是StringBuffer的非线程安全版本,没有使用synchronized修饰,具有更高的性能。

4.关于final

final修饰变量相当于常量;
final修饰的方法不能被重写;
final修饰的类不能被继承。

5.== 和 equals 的区别是什么

==:运算符,用于比较基础类型时,比较值,用于比较引用类型时比较引用地址;
equals:Object中定义的方法,等同于==,只是在实际使用中被重写,用于比较两个对象的值。

6.什么是反射

反射是指在运行状态中,对于任意一个类都能够知道它的所有属性和方法,并且可以调用它的任一方法。这种动态获取属性及动态调用方法的机制称为反射机制。

7.深拷贝和浅拷贝

深拷贝和浅拷贝的区别对引用数据类型的复制过程:浅拷贝复制地址,深拷贝复制值,并创建新对象,将值赋给新对象。

8.并发和并行的区别

字面意思:并发指间隔发生,并行同时发生

9.构造器是否可被 重写?

构造器不可以被重写,只能被重载。

10.重载(Overload)和重写(Override)的区别

重载发生在同一个类对象中,重写发生在子类与父类之间;
重载方法名一致,参数列表不一致;
重写方法名,参数列表,返回值都一致。
**不能根据返回类型来区分重载。

11.是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

必须得创建实例对象,才可以调用

12.抽象类(abstract class)和接口(interface)有什么区别?

抽象类可以同时出现抽象方法和普通方法,接口只能有抽象方法;
对于子类来说,只能继承一个抽象类,但可以实现多个接口;
抽象类中可以有成员变量,而接口不可以有成员变量;

13.try、catch、finally

	finally基础用法在return前都会先执行finally中的逻辑

14.final、finally、finalize

三者只是长得像,没有任何关系:
final参考第四条;
finally参考上一条,是异常处理的一个补充,配合try catch表示一定执行的代码块。通常用来释放资源;
finalize垃圾回收机制

15.关于线程中的方法

join():等待当前线程执行结束再执行下一步;
sleep():进入等待,等待时间自定义;
start() 方法和调用 run() 方法的区别:
	run():普通的方法调用,在主线程中执行,不会新建一个线程来执行
	start():新启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到 CPU 时间片,就开始执行 run() 方法。

16.关于锁

乐观锁:字面意思,很乐观,拿数据的时候一般认为不会对数据进行修改,所以不会直接上锁,而是等到修改的时候,才会去判断在此期间有没有别人对该文件进行更新;
悲观锁:字面意思,很悲观,拿数据的时候就会认为你会对数据进行修改,所以此时就会上锁,进入阻塞,知道拿到锁

17.关于线程池

线程池的核心属性:
	核心线程数:当线程数少于核心线程数时,有新的任务,就会创建新的线程,不去在乎有没有空闲锁。
	最大线程数:允许开启的最大线程数;
	保持存活时间:当线程超过核心线程数时,多余的线程空闲时间超过这个时间就会被终止。
线程池的优点:
	降低资源消耗,重复利用线程,降低线程创建和销毁所需要的资源;
	提高响应速度:任务开启时,不需要等待创建线程;
	方便调优和监控。
线程池的运作流程:
	1.提交任务
	2.判断线程是否达到核心线程数
	2.1:如果达到核心线程数,判断所有线程是否都被使用
	2.1.1:如果所有线程都被使用,则判断是否达到最大线程数
	2.1.1.1:如果达到最大线程数,执行拒绝策略,任务进入等待状态
	2.1.1.2:如果没有达到最大线程数,创建新的线程,执行任务
	2.1.2:如果有空闲线程,寻找空闲线程执行任务
	2.2:未达到核心线程数,创建线程,执行任务
	3.判断线程是否需要进行销毁
	4.销毁线程
	

18.List、Set、Map

List:有序存储,通过下标可以随机访问,可以存储重复对象
Set:无序存储,不支持存储重复对象
Map:键值对存储,可以通过key进行修饰,key不能重复,value可以重复

19.ArrayList 和 LinkedList

Arraylist:基于数组实现;
LinkedList:基于链表实现;
随机插入和删除:ArrayList需要移动目标节点后的所有节点,而LinkedList只需要修改目标节点的next和prev属性;

20.关于hashMap

hashMap底层实现原理:
	jdk1.7:基于数组和链表两种组成
	jdk1.8:基于数组、链表和红黑树三种类型组成
HashMap 的默认初始容量:
	16,且容量必须时2的N次方
HashMap 的put流程jdk1.8:
	1.对key的hash值重新进行hash值计算
	2.判断数组是否为空
		2.1:Y_先初始化数组,再计算索引位置
		2.2:N_计算索引的位置
	3.判断索引位置是否为空
		3.1:Y_判断key值与头节点key是否相等
			3.1.1:Y_直接覆盖
			3.1.2:N_判断时红黑树还是链表
				3.1.2.1:红黑色_找到红黑树根节点,开始遍历,是否可以找到相同key
				3.1.2.1.1:Y_覆盖
				3.1.2.1.2:N_新建节点,插入红黑色合适位置,进入红黑树平衡调整,判断是否进行扩容,结束。
			3.1.2.2:链表_遍历链表节点,并且统计节点数,是否可以找到相同的key
				3.1.2.2.1:Y_覆盖
				3.1.2.2.2:N_新建节点,放到链表尾部,	判断节点是否超过8,如果超过8进行链表转换红黑树操作。进入红黑树平衡调整,判断是否进行扩容,结束。
		3.2:N_新建节点,放到索引位置,判断是否进行扩容,结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DYS_房东的猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值