一些自己整理的java基础
这里写自定义目录标题
一:类加载
类加载器(class loader)用来加载 Java 类到 Java 虚拟机中,具体来说是加载.class文件到jvm内存。java源代码(.java文件)在经过java编译器编译(javac 指令)之后会生成一个或多个的.class文件
1:Java类加载的作用:就是在运行时加载类。
2:Java类加载器基于三个机制:委托、可见性和单一性。
委托机制是指将加载一个类的请求交给父类加载器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它。可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。
(委托机制
当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。假设你有一个应用需要的类叫作Abc.class,首先加载这个类的请求由Application类加载器委托给它的父类加载器Extension类加载器,然后再委托给Bootstrap类加载器。Bootstrap类加载器会先看看rt.jar中有没有这个类,因为并没有这个类,所以这个请求由回到Extension类加载器,它会查看jre/lib/ext目录下有没有这个类,如果这个类被Extension类加载器找到了,那么它将被加载,而Application类加载器不会加载这个类;而如果这个类没有被Extension类加载器找到,那么再由Application类加载器从classpath中寻找。记住classpath定义的是类文件的加载目录,而PATH是定义的是可执行程序如javac,java等的执行路径。)
(可见性机制
根据可见性机制,子类加载器可以看到父类加载器加载的类,而反之则不行。所以下面的例子中,当Abc.class已经被Application类加载器加载过了,然后如果想要使用Extension类加载器加载这个类,将会抛出java.lang.ClassNotFoundException异常。)
(单一性机制
根据这个机制,父加载器加载过的类不能被子加载器加载第二次。虽然重写违反委托和单一性机制的类加载器是可能的,但这样做并不可取。你写自己的类加载器的时候应该严格遵守这三条机制。)
3:什么是类加载器:类加载器是一个用来加载类文件的类。Java源代码通过javac编译器编译成类文件。然后JVM来执行类文件中的字节码来执行程序。类加载器负责加载文件系统、网络或其他来源的类文件。
4:默认三种类加载器:有三种默认使用的类加载器:Bootstrap类加载器、Extension类加载器和System类加载器(或者叫作Application类加载器)。每种类加载器都有设定好从哪里加载类。
(Bootstrap类加载器负责加载rt.jar中的JDK类文件,它是所有类加载器的父加载器。Bootstrap类加载器没有任何父类加载器,如果你调用String.class.getClassLoader(),会返回null,任何基于此的代码会抛出NUllPointerException异常。Bootstrap加载器被称为初始类加载器。
而Extension将加载类的请求先委托给它的父加载器,也就是Bootstrap,如果没有成功加载的话,再从jre/lib/ext目录下或者java.ext.dirs系统属性定义的目录下加载类。Extension加载器由sun.misc.Launcher
E
x
t
C
l
a
s
s
L
o
a
d
e
r
实
现
。
第
三
种
默
认
的
加
载
器
就
是
S
y
s
t
e
m
类
加
载
器
(
又
叫
作
A
p
p
l
i
c
a
t
i
o
n
类
加
载
器
)
了
。
它
负
责
从
c
l
a
s
s
p
a
t
h
环
境
变
量
中
加
载
某
些
应
用
相
关
的
类
,
c
l
a
s
s
p
a
t
h
环
境
变
量
通
常
由
−
c
l
a
s
s
p
a
t
h
或
−
c
p
命
令
行
选
项
来
定
义
,
或
者
是
J
A
R
中
的
M
a
n
i
f
e
s
t
的
c
l
a
s
s
p
a
t
h
属
性
。
A
p
p
l
i
c
a
t
i
o
n
类
加
载
器
是
E
x
t
e
n
s
i
o
n
类
加
载
器
的
子
加
载
器
。
通
过
s
u
n
.
m
i
s
c
.
L
a
u
n
c
h
e
r
ExtClassLoader实现。 第三种默认的加载器就是System类加载器(又叫作Application类加载器)了。它负责从classpath环境变量中加载某些应用相关的类,classpath环境变量通常由-classpath或-cp命令行选项来定义,或者是JAR中的Manifest的classpath属性。Application类加载器是Extension类加载器的子加载器。通过sun.misc.Launcher
ExtClassLoader实现。第三种默认的加载器就是System类加载器(又叫作Application类加载器)了。它负责从classpath环境变量中加载某些应用相关的类,classpath环境变量通常由−classpath或−cp命令行选项来定义,或者是JAR中的Manifest的classpath属性。Application类加载器是Extension类加载器的子加载器。通过sun.misc.LauncherAppClassLoader实现。
- Bootstrap类加载器 – JRE/lib/rt.jar
- Extension类加载器 – JRE/lib/ext或者java.ext.dirs指向的目录
- Application类加载器 – CLASSPATH环境变量, 由-classpath或-cp选项定义,或者是JAR中的Manifest的classpath属性定义.)
二:双亲委派机制:
1:双亲委派机制:当某个类加载器需要加载某个.class文件时,它他的上级类加载器,递首先把这个任务委托给归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。
BootstrapClassLoader(启动类加载器)
c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作
ExtClassLoader (标准扩展类加载器)
java编写,加载扩展库,如classpath中的jre ,javax.*或者
java.ext.dir 指定位置中的类,开发者可以直接使用标准扩展类加载器。
AppClassLoader(系统类加载器)
java编写,加载程序所在的目录,如user.dir所在的位置的class
CustomClassLoader(用户自定义类加载器)
java编写,用户自定义的类加载器,可加载指定路径的class文件
三:Java中除了new还有其他哪些方式创建对象?
1:new一个对象
2:通过克隆
3:通过反射
4:通过序列化
5:反射构造器
四:什么是深克隆,什么是浅克隆?
深克隆:克隆出来的对象内部的成员变量内存地址不相等
浅克隆:克隆出来的对象内部的成员变量内存地址相等
五:java中的static的作用,final的作用?
1:final 修饰的变量的内存地址不能被修改 ,final 修饰的类不能被继承,final 修饰的数组、map、list 可以被赋值,但是不能被修改,final 修饰方法,方法不能被重写
2:静态变量,静态代码块,静态方法,(静态导包)
六:线程的生命周期
新建状态 new Thread()
就绪状态 .start()
运行 当线程被jvm调度器调用的时候,也就是调用了run() 处于运行状态
阻塞状态 调用 sleep() wait() syncrinozed
死亡状态 线程结束
七:线程的创建方式,以及之间的区别?
继承thread 当一个类没有继承其他类的时候可用Thread
实现runnable 当一个类继承了别的类,可用runnable
实现callable 如果线程有返回值可用callable ,用callable 必须使用FutureTask,获取返回值 futrueTask.get()
线程优先级:
最小优先级为1
最大优先级为10
线程默认优先级为 5
并不是 线程优先级最高的。一定优先执行,但是概率比较大
join
让一个线程执行完毕以后,另外一个线程去执行,可以用join 方法
wait()和notity()区别
他们是object 类当中的方法
执行wait() 把当前线程放入到监视对象中的队列中,释放锁
notify() 唤醒监视对象队列中的线程。前提是跳出同步锁之后,唤醒
sleep和wait的区别
sleep:不释放锁
wait 释放锁
sleep 是Thread 类的静态方法
wait 是Object 实例方法
wait 必须加入到synchronized 代码块中
sleep 可以在方法中任何地方写入
线程中断调用的方法是 interrupt();
判断线程是否中断 的方法isInterrupted();
内部类
成员内部类,匿名内部类,静态内部类
一:类加载
类加载器(class loader)用来加载 Java 类到 Java 虚拟机中,具体来说是加载.class文件到jvm内存。java源代码(.java文件)在经过java编译器编译(javac 指令)之后会生成一个或多个的.class文件
1:Java类加载的作用:就是在运行时加载类。
2:Java类加载器基于三个机制:委托、可见性和单一性。
委托机制是指将加载一个类的请求交给父类加载器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它。可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。
(委托机制
当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。假设你有一个应用需要的类叫作Abc.class,首先加载这个类的请求由Application类加载器委托给它的父类加载器Extension类加载器,然后再委托给Bootstrap类加载器。Bootstrap类加载器会先看看rt.jar中有没有这个类,因为并没有这个类,所以这个请求由回到Extension类加载器,它会查看jre/lib/ext目录下有没有这个类,如果这个类被Extension类加载器找到了,那么它将被加载,而Application类加载器不会加载这个类;而如果这个类没有被Extension类加载器找到,那么再由Application类加载器从classpath中寻找。记住classpath定义的是类文件的加载目录,而PATH是定义的是可执行程序如javac,java等的执行路径。)
(可见性机制
根据可见性机制,子类加载器可以看到父类加载器加载的类,而反之则不行。所以下面的例子中,当Abc.class已经被Application类加载器加载过了,然后如果想要使用Extension类加载器加载这个类,将会抛出java.lang.ClassNotFoundException异常。)
(单一性机制
根据这个机制,父加载器加载过的类不能被子加载器加载第二次。虽然重写违反委托和单一性机制的类加载器是可能的,但这样做并不可取。你写自己的类加载器的时候应该严格遵守这三条机制。)
3:什么是类加载器:类加载器是一个用来加载类文件的类。Java源代码通过javac编译器编译成类文件。然后JVM来执行类文件中的字节码来执行程序。类加载器负责加载文件系统、网络或其他来源的类文件。
4:默认三种类加载器:有三种默认使用的类加载器:Bootstrap类加载器、Extension类加载器和System类加载器(或者叫作Application类加载器)。每种类加载器都有设定好从哪里加载类。
(Bootstrap类加载器负责加载rt.jar中的JDK类文件,它是所有类加载器的父加载器。Bootstrap类加载器没有任何父类加载器,如果你调用String.class.getClassLoader(),会返回null,任何基于此的代码会抛出NUllPointerException异常。Bootstrap加载器被称为初始类加载器。
而Extension将加载类的请求先委托给它的父加载器,也就是Bootstrap,如果没有成功加载的话,再从jre/lib/ext目录下或者java.ext.dirs系统属性定义的目录下加载类。Extension加载器由sun.misc.Launcher
E
x
t
C
l
a
s
s
L
o
a
d
e
r
实
现
。
第
三
种
默
认
的
加
载
器
就
是
S
y
s
t
e
m
类
加
载
器
(
又
叫
作
A
p
p
l
i
c
a
t
i
o
n
类
加
载
器
)
了
。
它
负
责
从
c
l
a
s
s
p
a
t
h
环
境
变
量
中
加
载
某
些
应
用
相
关
的
类
,
c
l
a
s
s
p
a
t
h
环
境
变
量
通
常
由
−
c
l
a
s
s
p
a
t
h
或
−
c
p
命
令
行
选
项
来
定
义
,
或
者
是
J
A
R
中
的
M
a
n
i
f
e
s
t
的
c
l
a
s
s
p
a
t
h
属
性
。
A
p
p
l
i
c
a
t
i
o
n
类
加
载
器
是
E
x
t
e
n
s
i
o
n
类
加
载
器
的
子
加
载
器
。
通
过
s
u
n
.
m
i
s
c
.
L
a
u
n
c
h
e
r
ExtClassLoader实现。 第三种默认的加载器就是System类加载器(又叫作Application类加载器)了。它负责从classpath环境变量中加载某些应用相关的类,classpath环境变量通常由-classpath或-cp命令行选项来定义,或者是JAR中的Manifest的classpath属性。Application类加载器是Extension类加载器的子加载器。通过sun.misc.Launcher
ExtClassLoader实现。第三种默认的加载器就是System类加载器(又叫作Application类加载器)了。它负责从classpath环境变量中加载某些应用相关的类,classpath环境变量通常由−classpath或−cp命令行选项来定义,或者是JAR中的Manifest的classpath属性。Application类加载器是Extension类加载器的子加载器。通过sun.misc.LauncherAppClassLoader实现。
- Bootstrap类加载器 – JRE/lib/rt.jar
- Extension类加载器 – JRE/lib/ext或者java.ext.dirs指向的目录
- Application类加载器 – CLASSPATH环境变量, 由-classpath或-cp选项定义,或者是JAR中的Manifest的classpath属性定义.)
二:双亲委派机制:
1:双亲委派机制:当某个类加载器需要加载某个.class文件时,它他的上级类加载器,递首先把这个任务委托给归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。
BootstrapClassLoader(启动类加载器)
c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作
ExtClassLoader (标准扩展类加载器)
java编写,加载扩展库,如classpath中的jre ,javax.*或者
java.ext.dir 指定位置中的类,开发者可以直接使用标准扩展类加载器。
AppClassLoader(系统类加载器)
java编写,加载程序所在的目录,如user.dir所在的位置的class
CustomClassLoader(用户自定义类加载器)
java编写,用户自定义的类加载器,可加载指定路径的class文件
三:Java中除了new还有其他哪些方式创建对象?
1:new一个对象
2:通过克隆
3:通过反射
4:通过序列化
5:反射构造器
四:什么是深克隆,什么是浅克隆?
深克隆:克隆出来的对象内部的成员变量内存地址不相等
浅克隆:克隆出来的对象内部的成员变量内存地址相等
五:java中的static的作用,final的作用?
1:final 修饰的变量的内存地址不能被修改 ,final 修饰的类不能被继承,final 修饰的数组、map、list 可以被赋值,但是不能被修改,final 修饰方法,方法不能被重写
2:静态变量,静态代码块,静态方法,(静态导包)
六:线程的生命周期
新建状态 new Thread()
就绪状态 .start()
运行 当线程被jvm调度器调用的时候,也就是调用了run() 处于运行状态
阻塞状态 调用 sleep() wait() syncrinozed
死亡状态 线程结束
七:线程的创建方式,以及之间的区别?
继承thread 当一个类没有继承其他类的时候可用Thread
实现runnable 当一个类继承了别的类,可用runnable
实现callable 如果线程有返回值可用callable ,用callable 必须使用FutureTask,获取返回值 futrueTask.get()
线程优先级:
最小优先级为1
最大优先级为10
线程默认优先级为 5
并不是 线程优先级最高的。一定优先执行,但是概率比较大
join
让一个线程执行完毕以后,另外一个线程去执行,可以用join 方法
wait()和notity()区别
他们是object 类当中的方法
执行wait() 把当前线程放入到监视对象中的队列中,释放锁
notify() 唤醒监视对象队列中的线程。前提是跳出同步锁之后,唤醒
sleep和wait的区别
sleep:不释放锁
wait 释放锁
sleep 是Thread 类的静态方法
wait 是Object 实例方法
wait 必须加入到synchronized 代码块中
sleep 可以在方法中任何地方写入
线程中断调用的方法是 interrupt();
判断线程是否中断 的方法isInterrupted();
内部类
成员内部类,匿名内部类,静态内部类
owchart.js/
本文地址:https://blog.csdn.net/weixin_52184530/article/details/109804300
上一篇: 数据结构(二叉树的层序遍历)