java 核心知识点——基础知识

目录

数据类型

包装类与基本数据类型

为什么1000==1000为false,100==100为true。

new String("hello")创建了几个对象

String StringBuild StringBuff 区别

对象

Java对象的创建过程

深浅拷贝的区别

4种对象引用

一个空对象占多大内存

重写equals方法就一定要重写hashcode方法

其他

js与Java的区别

受检异常和非受检异常

fail-fast和fail-save区别

序列化和反序列化

spi

finally语句一定会执行吗

内存溢出和内存泄漏


基础知识-思维导图

数据类型

包装类与基本数据类型

为什么基础类型需要设计一个对应的封装类?
Java面向对象的语言,有时需要传递对象类型的数据,例如:ArrayList等集合。
隐藏实现细节对调用者更加友好,使用定义好的方法操作数据。
安全性更好,可以避免外部操作随意修改成员变量的值。
Integer与int的区别是什么?
Integer 是一个对象,用new创建,存储在堆内存 ,初始化null,可以在集合中使用ArrayList,混合计算时自动装箱和拆箱,具有方法和属性,例如,MAX_VALUE,Integer.valueOf(s)。
int 是基本数据类型,直接定义即可使用,存储在栈空间,初始值是0。

为什么1000==1000为false,100==100为true。

public static void main(String[] args) {Integer a = 100, b = 100, c = 1000, d = 1000;//给Integer 赋值的时候发生自动装箱调用Integer.valueOf方法,System.out.println("a==b " + (a==b));System.out.println("c==d " + (c==d));//从缓存里取出值等于100的Integer对象给a,b赋值,所以a,b是同一个对象// 1000不在缓存里,调用new Integer(i) 给c,d赋值,所以c,d不是同一个对象int e = a;//自动拆箱 调用intValue()Byte f = 1;//缓存范围-128~127Short g = 2;//缓存范围-128~127Long h = 3L;//缓存范围-128~127Character i = 'a';//缓存范围0~127}//注意到这里使用到了缓存public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];// 怎么计算出数组下标?i的范围在-128~127,// 这里加上一个最小值,就能计算出来下标的位置return new Integer(i);}
下面这这段代码初始化cache数组
这里high属性可以使用-XX:AutoBoxCacheMax=<size>设置
缓存的范围是-128~127 为什么使用这个范围,因为数据在这个范围内频繁使用,避免频繁创建对象消耗资源
 private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

new String("hello")创建了几个对象

1.如果hello这个字符串常量不存在,则创建2个对象,分别是hello字符串常量和new String这个实例对象。
2.如果hello 这个字符串常量存在,则只会创建String对象
vm检查字符串常量池里是否存在相同内容("hello")的String对象, 如果存在则直接返回该对象的引用,如果不存在,则在堆内存创建一个新的字符串对象,并且把他的引用保存到字符串常量池里。 new String 创建一个对象存放在堆上
为什么需要字符串常量池?提高性能和节省内存空间
字符串常量池在哪里? 堆
 

    public static void main(String[] args) {//String s = "hello".intern();//如果池中包含等于此String对象的字符串,则返回池中的字符串,// 否则,将这个String对象添加到池中,并返回此String对象的引用String a = "abc";String b = new String("abc");String c = "abc";String d = "a" + "bc";//编译期间进行了优化,拼接结果是"abc"String temp = "bc";String e = "a" + temp;//2个对象相加,把结果存放在堆上String f = "a" + new String(temp);String g = a.intern();System.out.println(a == b);//falseSystem.out.println(a == c);//trueSystem.out.println(a == d);//trueSystem.out.println(a == e);//falseSystem.out.println(e == f);//falseSystem.out.println(a == g);//true}

String StringBuild StringBuff 区别

可变性 String 不可变类 StringBuild 和 StringBuff可变
线程安全性 String 不可变类 是线程安全的 存储在字符串常量池
          StringBuff 每个方法都加了Synchronize 关键字 线程安全的 多线程环境下使用 存储在堆
          StringBuild 线程不安全 单线程环境下使用 存储在堆
性能 String 性能最差,他是不可变类每次修改都会创建新的String对象
      其次 StringBuff 有加同步锁
      最好 StringBuild 没有加锁

对象

Java对象的创建过程

1.类加载检查
目标类的加载通过类加载器实现
目标类的初始化,对静态变量、成员变量,静态代码块进行初始化。
目标类初始化之后,就可以常量池中找到对应的类元信息。
2.分配内存
有2种方法,指针碰撞,需要内存空间连续(规整)。空闲列表,内存空间不连续,记录哪些内存块是可用的,分配的时找到一个大小合适的内存块,给目标对象使用,更新记录
3.初始化零值
目标对象里普通成员变量初始化为零值,例如,int类型 初始化0,保证对象里的属性不用初始化就可以使用
4.设置对象头
对象类的元信息,对象GC分代年龄,锁标记,hash码
5.执行init方法
初始化成员变量,执行构造块,构造方法,完成对象创建。

深浅拷贝的区别

1.克隆数据之后两者是否存在关联2.改变克隆对象的属性是否会影响到源对象。
浅拷贝,复制对象本身及其引用类型成员的引用,不复制引用指向的对象本身
值类型成员变量---复制值,引用类型成员变量---复制地址
常用API,实现Cloneable接口,Arrays--copyOf.
常用工具类,Spring--BeanUtils,commons--PropertyUtils

深拷贝,递归复制源对象引用类型成员的副本,新对象是完全独立于旧对象
值类型成员变量---复制值,引用类型成员变量---复制值
常用API,重写clone方法,序列化,工厂方法、拷贝构造方法
常用工具类,JSON工具类,Apache commons--SerializationUtils.clone

4种对象引用

强引用,只要引用关系存在,对象就不会被回收
软引用,相对强引用弱一些,非必须存活的对象,vm在内存溢出前对其进行回收。用来实现内存敏感的缓存,内存还有空闲空间时,就可以暂时保留,当内存空间不足时,就会清理掉
弱引用,不管内存是否够用,下一次GC一定回收,即使存在引用关系也会被清理
虚引用,等同没有引用,对象被回收时会收到通知,必须和引用队列一起使用

一个空对象占多大内存

对象的组成,
1.对象头,markword,64位vm8字节,用来存储hashcode,GC分代年龄,锁标记
类型指针,4(压缩)或8字节,
数组长度,数组对象才会有,4个字节
2.实例数据,对象中的字段信息
3.对齐填充,补充实现java对象大小的整数倍对齐,按照8字节或者8字节的倍数对齐,避免为共享问题
一个空对象在开启压缩指针的情况下,占用16=8(对象头)+4(类型指针)+4(对齐填充)字节。
一个空对象在关闭压缩指针的情况下,占用16=8(对象头)+8(类型指针)字节。

重写equals方法就一定要重写hashcode方法

1.Object规范要求根据equals比较相等的对象,他们的hash码方法产生相同的整数结果
2.只重写equals方法,逻辑上相等对象,他们hash码不相等,因为Object对象的hash码方法返回随机整数
3.hashMap.get方法返回null,hashmap有一项优化,将与每个项相关联的散列码缓存起来,如果散列码不匹配,也不必比较对象相等性

其他

js与Java的区别

JavaScript,动态语言,浏览器解释执行,函数式编程,函数是一等公民,lambda表达式、闭包。
Java,静态语言,源码编译然后在vm运行,类是一等公民,Java8开始支持函数式编程、lambda。

受检异常和非受检异常

受检异常,在编译时必须检查的异常,需要通过catch字句捕获,或者抛出异常。除了error和runtimeException之外的异常,提高可维护性。
非受检异常,不需要显式捕获,编程错误使用运行时异常。
设计异常的原因,提高程序的可读性、可靠性、可维护性

fail-fast和fail-save区别

他们都是多线程并发操作集合时失败处理机制。
fail-fast==快速失败,在遍历集合的时候,一旦发现集合被修改了,立即抛出并发修改异常,导致遍历失败。例如,hashmap,arraylist。
fail-save==失败安全,在这种机制下,出现集合元素修改不会抛出并发修改异常,例如,copyonwriteArraylist,在遍历时,不是直接在结合上访问,而是先复制集合内容,在复制的集合上进行遍历。

序列化和反序列化

序列化,解决网络通信中对象传输问题,把vm进程里一个对象,跨网络传输到另一个vm进程里,序列化把对象转化成字节流,以便实现存储和传输。保证通信双方对于对象的可识别性,把对象转化为通用解析格式--json、xml。
反序列化,根据文件或网络上的对象的字节流,解析字节流里对象信息和状态,创建一个新的对象。
选择何种序列化技术考虑的因素,序列化后数据的大小--影响传输性能,序列化耗费的时间,跨平台、跨语言,技术的成熟度。

spi

service-provide-interface,基于接口的动态扩展机制,定义一个标准接口,然后第三方可以实现这个接口,程序运行时,根据配置信息或上下文场景,发现加载实现类,实现功能的动态扩展。例如,数据库驱动==driver。这个机制的主要思想:将装配的控制权转移到程序之外,做到标准和实现解耦,提供动态的可插拔能力。缺点,不能根据需求加载需要的扩展实现,每次都会加载所有接口的实现类。加载一些不需要的实现类造成内存资源浪费。

finally语句一定会执行吗

通常情况下,无论是否触发异常,finally块中的代码一定会执行,例外情况,程序没有进入try块之前,异常终止,在try或catch块中,执行system.exit语句。

内存溢出和内存泄漏

内存溢出,vm可用内存不足以存放一个新创建的对象。
内存泄漏,对象使用完后,对象内存空间没有释放,空间一直被占用。代码每次执行都会留下被占用内存,不被释放。反复多次执行后,就会有大量对象用完没有释放,这些不能回收的对象导致内存溢出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构大作业——家谱管理系统(超详细!完整代码!)

目录 设计思路&#xff1a; 一、项目背景 二、功能分析 查询功能流程图&#xff1a; 管理功能流程图&#xff1a; 三、设计 四、实现 代码实现&#xff1a; 头文件 结构体 函数声明及定义 创建家谱树头结点 绘制家谱树&#xff08;打印&#xff09; 建立右兄弟…

OpenHarmony通过挂载镜像来修改镜像内容,RK3566鸿蒙开发板演示

在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容&#xff0c;修改源码再编译很费时。今天为大家介绍一个便捷的方法&#xff0c;让OpenHarmony通过挂载镜像来修改镜像内容&#xff01;触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器&#xff0c;树…

Gitee上传项目代码教程(详细)

工具必备&#xff1a;Git Bash 上传步骤 1.在Gitee创建项目仓库 2.进入本地项目目录 右键打开Git Bash here 3.配置用户名和邮箱 如果之前给git配置过用户名和邮箱可跳过 查看Git是否配置成功&#xff1a;git config --list git config --global user.name "xxx"…

uni-app 资源引用(绝对路径和相对路径)方法汇总

文章目录 一、前言&#x1f343;二、绝对路径和相对路径2.1 绝对路径2.2 相对路径 三、引用组件四、引用js4.1 js 文件引入4.2 NPM支持 五、引用css六、引用json6.1 json文件引入 七、引用静态资源7.1 模板内引入静态资源7.2 css 引入静态资源7.3 js/uts 引入静态资源7.4 静态资…

Java100道面试题

1.JVM内存结构 1. 方法区&#xff08;Method Area&#xff09; 方法区是JVM内存结构的一部分&#xff0c;用于存放类的相关信息&#xff0c;包括&#xff1a; 类的结构&#xff08;字段、方法、常量池等&#xff09;。字段和方法的描述&#xff0c;如名称、类型、访问修饰符…

【优选算法 分治】深入理解分治算法:分治算法入门小专题详解

快速排序算法 (1) 快速排序法 (2) 快排前后指针 (3) 快排挖坑法 颜色分类 题目解析 算法原理 算法原理和移动零非常相似 简述移动零的算法原理 cur 在从前往后扫描的过程中&#xff0c;如果扫描的数符合 f 性质&#xff0c;就把这个数放到 dest 之…

【前端系列01】优化axios响应拦截器

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、axios响应拦截器&#xff1a;☀️☀️☀️2.1 为什么前端需要响应拦截器element ui的消息组件 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动之中。 这个系列可…

Requests聚焦爬虫-数据解析

原理:定位到对应标签,获取标签内的东西 解析三种方法: 1:正则 58二手房。获取图片列表,二进制content。展开,每个图片是一个内容,正则从头取到尾,不同之处用 .*? 替换掉。 import requests import re import os if __name__ == "__main__":# url=https://…

性能测试工具的原理与架构解析

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在软件开发与运维领域&#xff0c;性能测试是确保系统稳定、高效运行的关键环节。性能测试工具作为实现这一目标的重要工具&#xff0c;通过模拟真实用户行为和负载…

【insert 插入数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录一、前言 &#x1f343;二、插入方式 &#x1f4af;2.1 单条插入实体2.2 批量 插入实体2.3 根据字典插入2.4 根据 Dat…

记一次k8s下容器启动失败,容器无日志问题排查

问题 背景 本地开发时&#xff0c;某应用增加logback-spring.xml配置文件&#xff0c;加入必要的依赖&#xff1a; <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>8…

【PPTist】批注、选择窗格

前言&#xff1a;本篇文章研究批注和选择窗格两个小功能 一、批注 批注功能就是介个小图标 点击可以为当前页的幻灯片添加批注&#xff0c;还能删除之前的批注 如果我们增加了登录功能&#xff0c;还可以在批注上显示当前的用户名和头像&#xff0c;不过现在是写死的。 左侧…

使用Paddledetection进行模型训练【Part1:环境配置】

目录 写作目的 安装文档 环境要求 版本依赖关系 安装说明 写作目的 方便大家进行模型训练前的环境配置。 安装文档 环境要求 PaddlePaddle &#xff1e;&#xff1d;2.3.2OS 64位操作系统Python 3(3.5.1/3.6/3.7/3.8/3.9/3.10)&#xff0c;64位版本pip/pip3(9.0.1)&am…

C++ scanf

1.scanf概念解释&#xff1a; C语言兼容C语言中的基本语句语法,scanf语句是C语言中的输入语句,在C语言环境中也可以使用。对于大数据的输入使用scanf比C的输入cin效率高、速度快。 scanf称为格式输入函数,其关键字最末一个字母f即为是格式"(format)之意",其意义是按指…

数学建模入门——描述性统计分析

摘要&#xff1a;本篇博客主要讲解了数学建模入门的描述性统计分析&#xff0c;包括基本统计量的计算、数据的分布形态、数据可视化和相关性分析。 往期回顾&#xff1a; 数学建模入门——建模流程-CSDN博客 数学建模入门——数据预处理&#xff08;全&#xff09;-CSDN博客 …

30、论文阅读:基于小波的傅里叶信息交互与频率扩散调整的水下图像恢复

Wavelet-based Fourier Information Interaction with Frequency Diffusion Adjustment for Underwater Image Restoration 摘要介绍相关工作水下图像增强扩散模型 论文方法整体架构离散小波变换与傅里叶变换频率初步增强Wide Transformer BlockSpatial-Frequency Fusion Block…

Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s

前言&#xff1a;纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 官方文档…

Matlab回归预测大合集(不定期更新)-188

截至2025-1-2更新 1.BP神经网络多元回归预测&#xff08;多输入单输出&#xff09; 2.RBF神经网络多元回归预测&#xff08;多输入单输出&#xff09; 3.RF随机森林多元回归预测&#xff08;多输入单输出&#xff09; 4.CNN卷积神经网络多元回归预测&#xff08;多输入单输…

【读书与思考】历史是一个好东西

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 导言 以后《AI日记》专栏我想专注于 AI 相关的学习、成长和工作等。而与 AI 无关的一些读书、思考和闲聊&#xff0c;我打算写到这里&#xff0c;我会尽量控制自己少想和少写。 下图的一些感想…

Git使用mirror备份和恢复

Git使用mirror备份和恢复 使用到的命令总结备份1.进入指定代码仓库&#xff0c;拷贝地址2.进入要备份到的文件夹&#xff0c;右键打开git命令行&#xff0c;输入以下命令3.命令执行完成后会生成一个新文件夹 恢复1.在gitee上创建代码仓库![请添加图片描述](https://i-blog.csdn…