工作学习笔记

news2024/11/26 10:37:47

文章目录

    • 一、java基础
      • 1、Hashcode的作用
      • 2、String、String StringBuffer 和 StringBuilder 的区别是什么?
      • 3、 Java的四种引用,强弱软虚
      • 4、3*0.1 == 0.3返回值是什么
      • 5、final修饰引用数据类型
    • 二、jvm
      • 1、内存模型
      • 2、如何判断对象可以被回收
      • 3、Minor GC与Full GC分别在什么时候发生?
      • 4、
    • 三、并发
      • 1、什么是多线程中的上下文切换?
      • 2、
    • 四、Spring框架
      • 1、spring的优点

一、java基础

1、Hashcode的作用

hashCode用于获取对象的哈希码。在Object类中,hashCode()方法被定义为返回一个int类型的哈希码值。
java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在set
中插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样
的方法就会比较满。
于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域,每
个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的
哈希码就可以确定该对象应该存储的那个区域。
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理
位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如
果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相
同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

2、String、String StringBuffer 和 StringBuilder 的区别是什么?

String是一个final类型的字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生成新的String对象。
每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼
接+后面的字符。

StringBuffer和StringBuilder底层都是可变的字符数组, 另外StringBuffer 对append方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

3、 Java的四种引用,强弱软虚

强引用
强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收

String str = new String("str");

软引用
软引用在程序内存不足时,会被回收
可用场景: 创建缓存的时候,创建的对象放进缓存中,当内存不足时,JVM就会回收早先创建
的对象。

SoftReference<String> wrf = new SoftReference<String>(new String("str"));

弱引用
弱引用就是只要JVM垃圾回收器发现了它,就会将之回收
可用场景:ThreadLocalMap 中的 key 就是使用弱引用,我的理解就是,
一旦我不需要某个引用,JVM会自动帮我处理它,这样我就不需要做其它操作。

> WeakReference<String> wrf = new WeakReference<String>(str);

虚引用
**虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入 ReferenceQueue 中。**注意
哦,其它引用是被JVM回收后才被传入 ReferenceQueue 中的。由于这个机制,所以虚引用大多
被用于引用销毁前的处理工作。还有就是,虚引用创建的时候,必须带有 ReferenceQueue ,

PhantomReference<String> prf = new PhantomReference<String>(new String("str"),
new ReferenceQueue<>());

可用场景: 对象销毁前的一些操作,比如说资源释放等。 Object.finalize() 虽然也可以做这
类动作,但是这个方式即不安全又低效
上诉所说的几类引用,都是指对象本身的引用,而不是指Reference的四个子类的引用
(SoftReference等)

4、3*0.1 == 0.3返回值是什么

false ,因为有些浮点数不能完全精确的表示出来 0.1(十进制)在二进制中是一个无限循环的小数。
在Java中,使用浮点数进行计算时,可能会出现精度误差导致不精确的结果。这是因为在计算机内部,浮点数是以二进制表示的,并且某些十进制数无法准确地转换为有限长度的二进制表示形式
为了解决这个问题,可以考虑使用BigDecimal类进行精确的十进制数计算。BigDecimal类提供了高精度的数字操作,可以避免浮点数计算产生的精度误差。

5、final修饰引用数据类型

引用数据类型有数组、类、接口,以数组为例。
使用final修饰引用数据类型,值不能修改,这个值指的是引用数据类型中保存的地址值,地址指向的内容是可以修改的。
在这里插入图片描述

二、jvm

1、内存模型

在这里插入图片描述
jvm内存模型:
栈、本地方法栈、堆、程序计数器、方法区。
线程独占: 虚拟机栈、本地方法栈、程序计数器
每个线程都会有它独立的空间,随线程生命周期而创建和销毁
线程共享: 方法区、堆内存
所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁
1.栈:(JVM Stack)又称方法栈
JVM中的虚拟机栈是描述Java方法执行的内存区域,每个方法从开始调用到执行完成的过程,就是栈帧从入栈到出栈的过程。
栈的大小可以是固定的,或者是动态扩展的。如果请求的栈深度大于最大可用深度,则抛stackOverflflowError;如果栈是可动态扩展的,但没有内存空间支持扩展,则抛出OutofMemoryError。
2.本地方法栈 (Native Method Stack)
与栈类似 , 也是用来保存执行方法的信息 . 执行 Java 方法是使用栈 , 执行 Native 方法时使用本地方法栈 .
3.程序计数器 (Program Counter Register )
当同时进行的线程数超过CPU 数或其内核数时,就要通过时间片轮询分派 CPU 的时间资源,不免发生线 程切换。这时,每个线程就需要一个属于自己的计数器来记录下一条要运行的指令
保存着当前线程执行的字节码位置, 每个线程工作时都有独立的计数器 , 只为执行 Java 方法服务 , 执行Native方法时 , 程序计数器为空 .
作用
1、 字节码解释器通过改变程序计数器依次读取指令,实现代码的流程控制,如:顺序执行、选择、循环、异常处理
2、多线程情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪了
4.堆 (Java Heap)
JVM内存管理最大的一块 , 对被线程共享 , 目的是存放对象的实例。
JVM内存管理最大的一块 , 被线程共享, 存放对象实例和数组,是垃圾回收的主要区域,根据对象的存活周期不同 ,JVM 把对象进行分代管理,分为新生代和老年代。刚创建的对象在新生代的Eden区中,经过GC后进入新生代的S0 区中,再经过 GC 进入新生代的 S1 区中, 15 次 GC 后仍存在就进入老年代。这是按照一种回收机制进行划分的,不是固定的。若堆的空间不够实例分配,则OutOfMemoryError。
在这里插入图片描述注意:在Java 8及以后的版本中,已经移除了永久代(PermGen)并引入了元空间(Metaspace)。
5.方法区(1.8之后移入到了元空间):
又称非堆区, 线程共享的,用于存放被虚拟机加载的类的元数据信息,(类的元数据(Metadata)是指在Java虚拟机(JVM)中描述类的结构和属性的信息。它包括了类的名称、访问修饰符、父类、接口实现、字段、方法等相关信息。)如常量、静态变量和即时编译器编译后的代码。若要分代,算是永久代(老年代)
1.7 的永久代和1.8 的元空间都是方法区的一种实现
方法区中的信息一般需要长期存在,而且它又是堆的逻辑分区,因此用堆的划分方法,我们把方法区称为永久代.
在这里插入图片描述

2、如何判断对象可以被回收

判断对象是否存活一般有两种方式:
引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计
数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引
用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对
象。

3、Minor GC与Full GC分别在什么时候发生?

新生代内存不够用时候发生(Minor GC)MGC也叫YGC,JVM内存不够的时候发生FGC(Full GC)

4、

三、并发

1、什么是多线程中的上下文切换?

**在上下文切换过程中,CPU会停止处理当前运行的程序,并保存当前程序运行的具体位置以便之后
继续运行。**从这个角度来看,上下文切换有点像我们同时阅读几本书,在来回切换书本的同时我们
需要记住每本书当前读到的页码。
在程序中,上下文切换过程中的“页码”信息是保存在进程控制块(PCB)中的。PCB还经常被称
作“切换桢”(switchframe)。“页码”信息会一直保存到CPU的内存中,直到他们被再次使用。
上下文切换是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行。上下文切换是
多任务操作系统和多线程环境的基本特征。

2、

四、Spring框架

1、spring的优点

1、轻量级、简化开发、解耦、集成其他框架
2、aop:可以将与核心业务逻辑无关的功能(如日志记录、性能监控等)从业务逻辑中剥离出来,实现横切关注点的复用和集中管理。
3、ioc:将对象的创建、管理交由ioc容器去做。
DI:称为依赖注入(Dependency Injection),是一种实现控制反转(IOC)的机制。
4、统一的事务管理:Spring提供了强大的事务管理机制,可以在不同的数据访问技术(如JDBC、Hibernate、JPA等)上实现统一的事务控制。这样可以确保数据的一致性和完整性,简化了事务管理的复杂性。

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

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

相关文章

泊松比、泊松比范围、广义胡克定律、体积应变方程

泊松比&#xff08;Poisson’s ratio&#xff09;提供了有关不同材料在负载下如何变形的关键信息&#xff0c;将施加载荷的方向称为纵向&#xff08;longitudinal direction&#xff09;&#xff0c;将垂直方向称为横向&#xff08;lateral directions&#xff09; 当在一个方…

RK3568平台开发系列讲解(编解码篇)编解码功能介绍及体验

🚀返回专栏总目录 文章目录 一、编解码功能简介二、音频和视频播放的操作2.1、使用 gplay 播放器播放视频和音频2.2、使用 gst-launch 播放视频2.3、使用 gst-launch 播放音频2.4、使用 gst-launch 播放视频和音频沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇…

优化SQL查询实现高效数据检索(二)

大家好&#xff0c;本文将接着上文&#xff0c;继续介绍SQL查询优化的重要性以及如何优化SQL查询以实现更快的数据检索。 适当使用通配符 适当使用通配符对于优化SQL查询尤为重要&#xff0c;特别是在匹配字符串和模式方面。通配符是用于SQL查询中查找特定模式的特殊字符&…

【学生系统】基于结构体的一个训练小项目

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

Go []uint8和string的爱恨情仇

先上代码&#xff1a; package mainimport "fmt"func main() {byteSlice : []uint8{52, 44, 51} // 示例字节切片str : string(byteSlice)fmt.Printf("byteSlice:%v\r\n", str) }// 执行-输出 byteSlice:4,3 干货&#xff1a; 在Go语言中&#xff0c;[]u…

TiDB-学习笔记02

编写这个笔记&#xff0c;希望能记录下学习TiDB时候的知识点。 参考文章 目的链接&详细TiDB中文手册 Overview 面板重要监控指标详解 | PingCAP 文档中心 第二章 章节Overview 面板重要监控指标详解 | PingCAP 文档中心 认识Grafana Grafana监控TiDB 对应中文手册的【14…

如何使用 Java 代理插件在不更改应用程序代码的情况下捕获自定义指标

作者&#xff1a;Jack Shirazi Elastic APM Java 代理会自动跟踪许多指标&#xff0c;包括通过 Micrometer 或 OpenTelemetry Metrics API 生成的指标。 因此&#xff0c;如果你的应用程序&#xff08;或其包含的库&#xff09;已公开来自这些 API 之一的指标&#xff0c;则安装…

3Ds max无需插件创建逼真的草地

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 最终图像&#xff1a; 步骤-1 创建一个宽度 x 高度为 100100&#xff08;我使用厘米&#xff09;和 100100 段的平面。 步骤-2 将平面转换为“编辑多边形”并选择所有顶点&#xff08;Ctrl A&#xff09…

AI Chat 设计模式:6. 装饰模式

本文是该系列的第六篇&#xff0c;内容采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的旁白。 问题列表 Q.1 你知道装饰模式吗A.1Q.2 详细说说装饰模式的组成角色A.2Q.3 举一个装饰模式的例子吧&#xf…

Threejs加载倾斜摄影OSGB数据

个人主页&#xff1a; 左本Web3D&#xff0c;更多案例预览请点击》 在线案例 个人简介&#xff1a;专注Web3D使用ThreeJS实现3D效果技巧和学习案例 &#x1f495; &#x1f495;积跬步以至千里&#xff0c;致敬每个爱学习的你。获取模型或源码请点赞收藏加留言&#xff0c;有问…

数据库锁的12连问,抗住!

前言 金三银四很快就要来啦&#xff0c;准备了数据库锁的12连问&#xff0c;相信大家看完肯定会有帮助的。 1. 为什么需要加锁 在日常生活中&#xff0c;如果你心情不好想静静&#xff0c;不想被比别人打扰&#xff0c;你就可以把自己关进房间里&#xff0c;并且反锁。这就是生…

git基础教程(linux)

1.git简介 git 分布式版本控制 git两大特点&#xff1a; 版本控制&#xff1a;支持多人同时开发 分布式&#xff1a; 2.安装与配置 安装 sudo apt-get install git安装成功&#xff0c;运行如下命令&#xff1a; git3.创建一个版本库 (1)新建一个目录git_test&#xff0c…

网络编程7——IP协议(子网掩码,NAT机制,IPv6协议) + 以太网

文章目录 前言一、IP协议协议头格式认识IP地址格式组成子网掩码 地址管理1.动态分配2.NAT机制3.IPv6协议 路由选择 二、以太网以太网帧格式认识MTU 总结 前言 本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话&#x…

第十六章 原理篇:DETR

脑子不好使啊&#xff01;复习过的东西过几天就忘记了&#xff01; 参考教程&#xff1a; 论文地址&#xff1a;[pdf]End-to-End Object Detection with Transformer 源码地址&#xff1a;https://github.com/facebookresearch/detr 文章目录 概述the DETR modelDETR architect…

springboot篮球论坛系统

篮球论坛管理方面的任务繁琐,以至于每年都在篮球论坛管理这方面投入较多的精力却效果甚微,篮球论坛系统的目标就是为了能够缓解篮球论坛管理工作方面面临的压力,让篮球论坛管理方面的工作变得更加高效准确。 本项目在开发和设计过程中涉及到原理和技术有: B/S、java技术和MySQL…

Git❀详细使用教程

Git❀详细使用教程 一、Git简介1.1 什么是Git&#xff1f;1.2 Git的特点1.3 集中式与分布式的区别&#xff1f;1.4 Git工作流程图 二、Git安装与常用命令2.1 Git环境配置2.1.1 下载与安装2.1.2 基本配置2.1.3 为常用指令设置别名&#xff08;可选&#xff09;2.1.4 解决GitBash…

ChatGPT炒股:从上市公司招股说明书中批量提取发明专利表格

上市公司招股说明书通常会详细列明公司的发明专利&#xff0c;而通过企业的发明专利可以了解企业未来的业务布局情况&#xff0c;怎么把这些发明专利列表都批量提取出来呢? 随机打开几个上市公司的招股说明书&#xff0c;可以看到发明专利这一内容&#xff0c;共同的特征是都有…

Python的面向对象从入门到精通(简单易懂)

目录 1 初识对象 2. 成员方法 3. 类和对象 4. 构造方法 5. 其它内置方法 6. 封装 7. 继承 8. 复写 9. 类型的注解 10. 多态 1 初识对象 1. 生活中或是程序中&#xff0c;我们都可以使用设计表格、生产表格、填写表格的形式组织数据 2. 进行对比&#xff0c;在程序中&a…

进程间通信-无名管道

#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <string.h> int main(int argc, char **argv) {int pfd[2];int ret;pid_t pid;char buf[20]{0};retpipe(pfd);//创建一个无名管道if(ret<0){perror("pipe");ret…

lombok和guava工具

写在前面 本文看下如何通过使用lombok和guava来提高生产力。 1&#xff1a;lombok 我们开发程序时&#xff0c;如read method&#xff0c;write method&#xff0c;tostring&#xff0c;构造函数等&#xff0c;其写法其实都是固定和重复的&#xff0c;因此就可以考虑使用程序…