当前位置: 首页 > news >正文

Java基础回顾(1)

目录

基本类型:

包装器类型:

128陷阱:

现象描述:

示例代码:

原因分析:

Integer缓存机制:

对象比较:

解决方法:

String

关键字

抽象类和接口

Object类

反射

代理


基本类型:

整型:int short byte long——长度不同,精度不同
浮点型:float double
boolean
char

包装器类型:

每一个基本类型都有对应的包装类型
Integer——自动装箱、拆箱:javac编译器会帮助我们自动装箱,拆箱
自动装箱:Java编译器会自动将基本数据类型转换为对应的包装类型。
自动拆箱:Java编译器会自动将包装类型转换为对应的基本数据类型。

128陷阱:

现象描述:

当使用==比较两个Integer对象时,如果这两个对象的值在-128到127之间(包括-128和127),则比较结果为true。
如果这两个对象的值超出这个范围,则比较结果为false,即使它们的数值相同。

示例代码:

public class IntegerTrap { public static void main(String[] args) { Integer num1 = 127; Integer num2 = 127; System.out.println(num1 == num2); // 输出 true Integer num3 = 128; Integer num4 = 128; System.out.println(num3 == num4); // 输出 false } }

原因分析:

Integer缓存机制:
Integer类型在Java中有一个缓存机制,该机制会缓存-128到127之间的所有Integer对象。
当在这个范围内进行自动装箱时,Java会直接使用缓存中的对象,而不是创建一个新的对象。
对象比较:
使用==比较两个对象时,实际上是在比较它们的内存地址(即引用)。
在-128到127范围内,由于使用了缓存机制,两个相同的数值会被包装到同一个对象中,因此它们的内存地址相同,比较结果为true。
超出这个范围时,每次自动装箱都会创建一个新的Integer对象,因此即使数值相同,它们的内存地址也不同,比较结果为false。

解决方法:

为了避免128陷阱,建议在使用==比较Integer对象时,改为使用equals()方法。因为equals()方法会比较两个对象的值是否相等,而不是它们的内存地址。
Integer num3 = 128; Integer num4 = 128; System.out.println(num3.equals(num4)); // 输出 true

String

常用的String方法
.split()分割
.toUpperCase()转大写
.toLowerCase()转小写
.indexOf()返回下标
.charAt()分割为单个字符
.subString()截取字符
.startWith()返回boolean值,判断是否为..开头
.trim()去除前后空格
string不可变
  • 类被final修饰——不可被继承
  • 存数据的char数组被final修饰——不会指向新的数据
  • 类内无修改char数组内容的方法——不会被修改

关键字

static:只执行一次
方法——为所有对象共享可由类直接调用,只能访问静态变量,不能访问实例变量,不能用 this 或 super 关键字,主函数是静态的。
变量——为所有对象共享,归类所有,随类加载存在于方法区静态区,JVM 只分配一次内存,可通过类名或对象调用。
类——静态类只有静态内部类。非静态内部类不能声明静态成员或方法,静态内部类可以;非静态内部类可任意访问外部类成员,静态内部类只能访问外部类静态成员;创建非静态内部类实例需绑定外部类,静态内部类实例无需绑定。
代码块——随类调用或实例创建执行且仅一次,先于主函数执行,用于初始化类,所有父类子类中静态代码块优先级最高,且对后面静态变量可赋值不可访问。
final:
方法——不能被重写,指令不能被重新排序
类——类不能被集成
变量——不能被重新赋值
super:
调用父类方法,或者属性
调用父类构造函数,仅当在当前构造函数第一行时才为有效代码
this:
调用当前类的属性或者方法
调用当前类构造函数,仅当在当前构造函数第一行时才为有效代码
extend
implement
权限
public
private:当前类内能访问
protected:不仅能被同一包内的所有类访问,也能被不同包内的子类访问
default:当前包可访问

抽象类和接口

1、类是单继承,而接口是多实现
2、抽象类更偏向于本质,接口更偏向于行为功能
3、抽象类中可以有属性,构造函数,方法。但接口中只能存在

Object类

toString()
equals()——判断两个对象是否一致(区别于==)
equals()
默认行为:继承自Object类的equals()方法等同于==(比较内存地址)。
重写后的行为:大多数类(如StringInteger等)会重写equals()方法,改为比较对象的内容是否相等。
重写equals()必须重写hashcode
hashcode:描述对象的状态码——一组特性

反射

动态获取类信息 类内容 类组成的能力
获取类信息的三种方式:
class.forName()
对象.getClass()
类名.class
MVC框架
扫描类信息——>获得该类的全限定名称——>借助反射 Class.forName(className)把这个类加载进来——>检查该类是否含有注解@Controller@RequestMapping,检查每一个方法上面的@RequestMapping值,把这些信息放置到我们的HashMap中去

代理

静态代理
对于代理类对某个被代理类进行增强,实现简单。当被代理类增多时出现类爆炸。
动态代理
通过创建子类进行代理CGLB
通过实现接口进行动态代理JDK
http://www.lryc.cn/news/582905.html

相关文章:

  • 【无标题】导出pdf
  • Spring Boot 企业项目技术选型
  • Splunk练习 Boss of the SOC V1
  • JVM本地内存的使用监控情况
  • JVM 为什么使用元空间(Metaspace)替换了永久代(PermGen)?——深入理解 Java 方法区与类元数据存储的演进
  • 征程 6|工具链量化简介与代码实操
  • Redis 缓存进阶篇,缓存真实数据和缓存文件指针最佳实现?如何选择?
  • 当Powerbi遇到quickbi,性能优化方式对比
  • 玩具语音方案选型决策OTP vs Flash 的成本功耗与灵活性
  • BERT代码简单笔记
  • 台式电脑如何连wifi 快速连接方法
  • 无缝高清矩阵与画面分割器的区别
  • numpy数据分析知识总结
  • Web前端:not(否定伪类选择器)
  • boost中boost::noncopyalbe和boost::ignore_unused的使用详解和实战示例
  • 网络--初级
  • NestJS 系列教程(四):中间件、中断器与异常过滤器详解
  • 17-C#的socket通信TCP-1
  • 【python】 time_str = time_str.strip() 与 time_str = str(time_str).strip() 的区别
  • Spring Batch终极指南:原理、实战与性能优化
  • 开源 python 应用 开发(四)python文件和系统综合应用
  • ${project.basedir}延申出来的Maven内置的一些常用属性
  • Linux 第一个系统程序 - 进度条
  • 基于springboot的物流配货系统
  • 内网服务器怎么设置公网远程访问? windows桌面连接和Linux自带SSH外网异地跨网用完整步骤教程
  • JK触发器Multisim电路仿真——硬件工程师笔记
  • 【读论文】GLM-4.1V-Thinking 解读:用强化学习解锁 VLM 的通用推理能力
  • 进程于线程 -1
  • 小架构step系列08:logback.xml的配置
  • 数据提取之lxml模块与xpath工具