🧮java基础之23个知识点
00 分钟
2021-7-2
2024-8-13
type
status
date
slug
summary
tags
category
icon
password

1.1.1.1 Java 语言“编译与解释并存

1.1.1.2 Java关键字

notion image

1.1.1.3 自增自减运算符,符号在前就先加/减,符号在后就后加/减

1.1.1.4 /是取模,就是3/2=1,%是取余,就是2%3=2

1.1.1.5 Java 中有三种移位运算符

notion image

1.1.1.6 Java 中有 8 种基本数据类型

notion image

1.1.1.7 重载和重写

重写:发生在运行期,父子类的继承发生重写,方法名和参数列表相同,子类方法返回值类型应比父类方法返回值类型更小或相等,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类(重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变。)
方法的重写要遵循“两同两小一大”
“两同”即方法名相同、形参列表相同;
“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。
重载:同一个类中只有方法名相同,其他都不同,调用时根据参数列表选择不同的方法进行加载(重载就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理)
notion image

1.1.1.8 构造方法

如果一个类没有声明构造方法,该程序能正确执行吗?
构造方法是一种特殊的方法,主要作用是完成对象的初始化工作
如果一个类没有声明构造方法,也可以执行!因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。如果我们自己添加了类的构造方法(无论是否有参),Java 就不会添加默认的无参数的构造方法了。
我们一直在不知不觉地使用构造方法,这也是为什么我们在创建对象的时候后面要加一个括号(因为要调用无参的构造方法)。如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为这可以帮助我们在创建对象的时候少踩坑。
构造方法有哪些特点?是否可被 override?
构造方法具有以下特点:
名称与类名相同:构造方法的名称必须与类名完全一致。
没有返回值:构造方法没有返回类型,且不能使用 void 声明。
自动执行:在生成类的对象时,构造方法会自动执行,无需显式调用。
构造方法不能被重写(override),但可以被重载(overload)。因此,一个类中可以有多个构造方法,这些构造方法可以具有不同的参数列表,以提供不同的对象初始化方式。

1.1.1.9 接口和抽象类

notion image

1.1.1.10 深拷贝、浅拷贝、引用拷贝

notion image

1.1.1.11 ==和equals的区别

==比较的是值,对于基本数据类型,比较的是值,对于引用数据类型,比较的是引用地址;
equals有两种情况,一种是重写了equals方法的对象,比较的就是对象的值,如果是没有重写equals方法,使用的就是Object类中的equals方法,这里默认是用的==比较两个对象,比较的就是两个对象的引用地址

1.1.1.12 关于hashCode()

notion image
notion image
notion image

1.1.1.13 项目中自定义异常

1.1.1.14 泛型:泛型类、泛型接口、泛型方法

1.1.1.15 反射


1.1.1.16 注解

注解的本质就是继承了Annotation的特殊接口

1.1.1.17 SPI和API的区别

notion image

1.1.1.18 Java序列化

什么场景用到序列化
  • 对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
  • 将对象存储到文件之前需要进行序列化,将对象从文件中读取出来需要进行反序列化;
  • 将对象存储到数据库(如 Redis)之前需要用到序列化,将对象从缓存数据库中读取出来需要反序列化;
  • 将对象存储到内存之前需要进行序列化,从内存中读取出来之后需要进行反序列化。
(网络传输和存储)
序列化:将数据结构或对象转换成二进制流的过程
反序列化:和上面的相反,将序列化生成的二进制流转换成数据结构或对象的过程
序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。
notion image

1.1.1.19 serialVersionUID 有什么作用?

序列化号 serialVersionUID 属于版本控制的作用。反序列化时,会检查 serialVersionUID 是否和当前类的 serialVersionUID 一致。如果 serialVersionUID 不一致则会抛出 InvalidClassException 异常。强烈推荐每个序列化类都手动指定其 serialVersionUID,如果不手动指定,那么编译器会动态生成默认的 serialVersionUID。
serialVersionUID只是用来被 JVM 识别,实际并没有被序列化。
如果有些字段不想进行序列化怎么办?
对于不想进行序列化的变量,可以使用 transient 关键字修饰。
transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。
关于 transient 还有几点注意:
transient 只能修饰变量,不能修饰类和方法。
transient 修饰的变量,在反序列化后变量值将会被置成类型的默认值。例如,如果是修饰 int 类型,那么反序列后结果就是 0。
static 变量因为不属于任何对象(Object),所以无论有没有 transient 关键字修饰,均不会被序列化。

1.1.1.20 I/O流

1.1.1.21 Java 中将实参传递给方法(或函数)的方式是 值传递:

如果参数是基本类型的话,很简单,传递的就是基本类型的字面量值的拷贝,会创建副本。
如果参数是引用类型,传递的就是实参所引用的对象在堆中地址值的拷贝,同样也会创建副本。

1.1.1.22 Java代理模式

代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。
静态代理
接口已经有了实现类,想要对这个实现类做一个功能扩充,这个时候可以将这个实现类作为一个对象引入到静态代理类里面,在静态代理类里面进行调用方法,在调用方法前后进行功能的扩充。
动态代理
分为:JDK动态代理和CGLIB动态代理
JDK 动态代理类使用步骤
1、定义一个接口及其实现类;
2、自定义 InvocationHandler 并重写invoke方法,在 invoke 方法中我们会调用原生方法(被代理类的方法)并自定义一些处理逻辑;
3、通过 Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 方法创建代理对象;

1.1.1.23 java里面new BigDecimal(0.1f)和BigDecimal.valueOf(0.1f)相等吗

notion image
在 Java 中,`BigDecimal` 是一个用于高精度计算的类,通常用于金融和其他需要精确计算的场景。而浮点数 (`float` 和 `double`) 在计算机内部是用二进制近似表示的,这可能导致精度问题。
`new BigDecimal(0.1f)`
当你使用 `new BigDecimal(0.1f)` 时:
  • `0.1f` 是一个 `float` 类型的数字。
  • `float` 类型在计算机内部是用二进制表示的,而 `0.1f` 实际上并不能被精确表示为二进制,这意味着它的实际存储值是一个非常接近但不等于 `0.1` 的数字,具体为 `0.10000000149011612`。
  • `new BigDecimal(0.1f)` 使用这个 `float` 值的二进制表示构造一个 `BigDecimal` 对象。因此,最终生成的 `BigDecimal` 的值是 `0.100000001490116119384765625`(这是 `float` 转换为 `BigDecimal` 后的精确表示)。
`BigDecimal.valueOf(0.1f)`
当你使用 `BigDecimal.valueOf(0.1f)` 时:
  • `BigDecimal.valueOf` 有两个重载版本,一个是接收 `long` 类型的参数,另一个是接收 `double` 类型的参数。由于 `0.1f` 是 `float` 类型,会先被提升为 `double` 类型再传入方法。
  • `0.1f` 被提升为 `double` 后,仍然不精确,实际值是 `0.10000000149011612`。因此,`BigDecimal.valueOf(0.1f)` 创建的 `BigDecimal` 对象的值是 `0.10000000149011612`。
比较结果
现在来看这两个 `BigDecimal` 对象是否相等:
结论
  • 不相等:`new BigDecimal(0.1f)` 和 `BigDecimal.valueOf(0.1f)` 生成的 `BigDecimal` 对象不相等。
  • 原因:`new BigDecimal(0.1f)` 直接使用 `float` 的二进制表示构造,而 `BigDecimal.valueOf(0.1f)` 则使用 `float` 被提升为 `double` 后的值来构造,导致两者的精度略有不同。
因此,在需要精确数值时,建议直接使用字符串构造 `BigDecimal`,例如 `new BigDecimal("0.1")`,以避免浮点数带来的精度问题。
notion image
 

文章参考:

 
 
 
上一篇
java集合
下一篇
java集合源码解析