发布于 

Java基础复习

IDEA常用快捷

1、自动导包、自动删包

image-20230403094653183

1

2.if快速生成

1
2
3
4
5
6
7
//flag.if
if(flag){

}
//flag.else
if(!flag){
}

3、循环

1
2
3
4
//fori
for(int i=0;i<10;i++){
}
//flag.while

4、变量

1
new String().var

基础面试

image-20230419160613282

Java基础复习

已看

尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)

P64

P79 P80 P81

P107 p108

java面试

选择题

以下关于HashMap的说法正确的是()

A HashMap类的key可以重复

B HashMap类的key可以为null

C HashMap类的value不可以为null值

D HashMap类的value可以包含null值,并且只能有1个

key和value可以为null,但key只能存在一个null,位于组数的0位置:因为hash(key)方法,当key=null ,返回0。存储对象时,存储为key的对象需要重写equals()方法。

为使对象可以保存到磁盘上或在网络上传输,需要首先经过如下什么操作( )将对象转换成字节数组

序列化

char类型占( )个字节 2

在java中,char占用2个字节。Java中,只要是字符,不管是数字还是英文还是汉字,都占两个字节。原因:Java编译器默认使用Unicode编码,因此2字节可以表示所有字符。

byte是 Java基本类型中的一个 是 1个字节

hashCode()

在Java中,我们所讲的本地接口书写程序或者本地方法接口指的是

JNI,JNI是Java Native Interface的缩写

java标识符需要遵循哪些规则

标识符必须以字母(包括汉字)、下划线、美元符($)开头

识符的其他部分可以是字母、下划线、数字、美元符的任意组合

Java标识符大小写敏感,且无长度限制

java跨平台原理

Java 源代码经过编译,生成字节码文件,交由 Java 虚拟机来执行,不同得系统有不同得JVM,借助JVM 实现跨平台。

以下哪些关键字与Java面向对象的概念相关

A override

B throws

C extends

D implements

ACD override是重写,也可以算吧,是实现接口

Java IO体系中,通常情况下以下哪个类可用来读取文件且产生的系统调用可能是最少的

A、RandomAccessFile
B、FileInputStream
C、BufferedReader
D、InputStreamReader

C

对于方法sleep()和wait()

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

这两个方法来自不同的类分别是Thread和Object,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方,任何时候被任何线程使用(使用范围) sleep必须捕获异常,而wait notify和notifyAll不需要捕获异常。

Java中的基本数据类型

官方解析:基本数据类型有:byte,short,int,long,char,boolean,float,double

String不算基础数据类型

string字符串

new string()、+和substring得到的字符串不会在字符串常量池中,而是存储在堆中。

注意:使用加号时字面量+字面量的结果还是存在常量池。

1
2
3
String c = "ab";
String d = "a"+"b";
System.out.println(c==d);//true

但是一旦有变量,就会存在堆中,

1
2
3
4
5
String a = "a";
String b = "b";
String c = "ab";
String d = a+b;
System.out.println(c==d);//false

“xxxxx”字符串字面量的东西才能放到字符串常量池里。

但是我们可以new string().intern手动放到常量池里面。

多线程

线程创建方式

1、继承Thread类,java是单继承,这种实现方法不太好

2、实现Runnable,无返回值

3、实现Callable,可以拿到返回值

4、线程池,节省线程创建和销毁的开销

底层都是Runnable的实现方式。

线程池有哪些状态

1、running 表示线程池正常运行,既能接受新任务,也会正常处理队列中的任务

2、shutdown 当调用线程池的shutdown方法时,线程池就进入shutdown状态,表示线程池处于正在关闭状态,此状态下线程池不会接受新任务,但是会继续把队列中的任务处理完

3、stop 既不会接收新任务,也不会处理队列中的任务,并且正在运行的线程也会被中断。

4、tidying 如果所有任务都终止了,有效线程数为0,线程池进入该状态后会调用terminated()

5、terminated 完全结束

线程池的核心线程数应该如何设置?

CPU密集型的服务,线程数等于CPU核心数。

IO密集型,(工作时间+休息时间)*CPU核心数/工作时间。目的是为了充分使用时间,比如一个人送快递,工作8小时,休息4小时,那么车就有4小时是空闲的,那么需要另外一个人(cpu)来利用。

最大线程数

(非核心线程数=最大线程数-核心线程数)

image-20230411111936404

拒绝策略

image-20230411113102174

当核心线程满了,阻塞队列也满了,非核心线程也满了,就需要执行拒绝策略。

根据业务来走

1、直接抛异常

2、让询问的线程自己去做这个任务(会对询问的线程有影响)

3、将阻塞队列排最前的直接扔了

4、不执行,不反馈,不抛异常,啥也不做{}

Sychronized 和ReentrantLock有什么不同?

java内存划分

将内存区域划分成5个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区。

与目前数组相关的内存结构:

image-20230403194634891

虚拟机栈:用于存放方法中声明的局部变量

堆:用于存放数组的实体(即数组的所有元素)

一维数组

image-20230403201649860

放int数据类型的情况

image-20230403195118755

放对象数组的情况

image-20230403195137437

二维数组

image-20230403201102384

多态

以父类声明的子类对象,只能使用父类中的方法。

方法的重载

参数列表不同:1、参数个数不同 2、参数类型不同 3、参数顺序不同

与形参名、修饰符、返回值类型无关。

可变形参

1
(参数类型 ... 参数名)

可变形参需要放最后。

注意:这种是不能共存的

image-20230403181100503

java 访问权限

img

一个类必须有且仅有一个公共类

(子包不能访问父包的default)

单例设计模式

image-20230404105847181

image-20230404110320407

饿汉式:立即加载;

优点:写法简单,使用更快,更方便,已在内存中加载

缺点:内存占用时间较长

image-20230404110721793

懒汉式:延迟加载

优点:节省内存空间

缺点:线程不安全

image-20230404111244552

代码块

image-20230404142821835

静态代码块:随着类的加载而执行,类的加载只会执行一次,进而静态代码块的执行,也只会执行一次;静态代码块的执行会先于非静态代码块的执行。

非静态代码块:随着对象的创建而执行。

image-20230404144837442

接口与抽象类

包含抽象方法的类,必须是抽象类。抽象类不能创建对象

一个类只能继承一个抽象类,而一个类却可以实现多个接口。

接口的数据成员(public static final,全局常量)都是静态的且必须初始化,数据成员必须是静态常量。

接口的方法可以是抽象方法、私有方法、静态方法、默认方法。

image-20230404150059342

反射

动态性

lambda表达式

-> lambda操作符

-> 左边lambda形参列表,对应着要重写的接口中的抽象方法的形参列表。

-> 的右边lambda体,对应着接口要实现类要重写方法的方法体。

image-20230404163935459

使用lambda表达式:

image-20230404163958200

线程池

1.降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。

2.提高响应速度:任务到达时,无需等待线程创建即可立即执行(如果有空闲的线程)。
3.提高线程的可管理性:线程是稀缺资源,如果无限制创建,个仅会泪R系沉贡源,贮云公为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。
4.提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行。