【思维导图】java
学习计划:将目前已经学的知识点串成一个思维导图。在往后的学习过程中,不断往思维导图里补充,形成自己整个知识体系。对于思维导图里的每个技术知识,自己用简洁的话概括出来, 训练自己的表达能力。
面向对象三大特性
封装
封装就是使用private修饰属性或方法,这样类的对象就没法直接访问或修改属性,只能通过get/set方法进行访问或修改。
封装的好处:降低代码的耦合度,利于维护;通过get/set方法访问属性的时候,可以增加一些额外的逻辑,这是单独访问属性无法做到的。
继承
继承就是子类继承父类,子类继承了父类所有的方法和属性。并且子类还可以增加一些自己的属性和方法。
继承的好处是提高代码的复用性,比如说一个类想要拥有另一个类的属性和方法,就可以采用继承的方式实现。
多态
多态就是父类引用指向子类的实例,多态只有在运行时才能确定调用的是哪个类的方法。
多态的好处是提高代码的复用性,比如说使用一个方法时将参数设置为父类的引用,来接收各种各样的子类实例。这样写一个方法就可以有各种效果。
面向对象的理解
面向对象就是万事万物抽象为对象,将一些行为、特点抽象为方法和属性。
面向对象的好处就是使代码的耦合度降低,我们要实现什么功能时直接调用对象的方法即可。比如说要实现开门这个动作,面向对象的思路就是先抽象出door这个对象,然后再抽象出door的一些特征作为属性,比如说门的大小、颜色。然后抽象出door的开门、关门的方法。我们如果想要实现开门动作的话就直接调对象的这个方法即可。
重载与重写的区别
重载就是在同一个类中的多个方法,方法名相同,但是方法参数类型或参数个数不同。在编译期间就可以确定是调用哪个方法。
重写就是子类重写父类的方法。
重载算多态的体现吗
不算,重载是编译期间就确定要调用的方法,而多态是要在运行时才确定要调用的方法。
反射机制
反射就是获取类在运行时的大Class实例,只有获取了这个实例才能获取有关这个类的各种信息比如方法、属性。原理是因为jvm在加载类时都会为这个类在堆中生成大class实例,并且指向方法区中有关这个类的各种信息。
泛型
泛型就是规定一种类型。比如说我们创建一个list,我们就可以使用泛型规定list里的每个元素的参数类型。
另一方面,当方法的形参类型不确定的时候,也可以使用泛型,这样就可以提高方法的可复用性。方法放进去的是时候,取出来的就是什么。相较于多态,可以避免强制类型转换的异常。
序列化与反序列化
序列化就是将对象转换为字节流或者json文本格式的过程,反序列化就是由字节流或json文本格式转换为对象的过程。
对象只有序列化后才能进行传输和存储。
比如说当我们想要将对象存进redis中的value里,我们可以使用json序列化器,但是由于序列化为json后会多存储一个类路径,浪费空间。因此我们会选择String序列化器,首先将对象手动转变为json格式的字符串,将字符串转换为字节流传输。
String、StringBuilder、StringBuffer的区别
1、可变性
String是不可变的,因为String底层是一个private final修饰的字符数组。final意味这个字符数组的地址值不能改变,并不意味着字符数组里的内容不能改变,String真正不可变的原因在于这个private。由于是private修饰的,并且String没有提供修改这个字符数组的方法,因此没有任何渠道能修改这个字符数组,因此String是不可变的。
而StringBuilder和StringBuffer底层就只是字符数组,因此是可变的。
2、线程安全性
String是不可变的,因此String是线程安全的。
由于StringBuilder底层方法没有加锁,因此是线程不安全的,而StringBuffer底层方法是加了synchronized锁的,因此是线程安全的。
3、性能
对于字符串的拼接,如果String类型的变量使用“+”来拼接,底层会新创建一个String对象,而原来那个String对象就变成了无引用,使得堆中垃圾变多,gc时间变多,自然影响性能。而对于StringBuilder类型与StringBuffer类型使用append方法,不会新创建对象,效率更高,而StringBuilder性能又会比StringBuffer高,因为底层没有加锁。
hashCode() & equals()
hashCode方法就是获取对象的哈希码。而哈希码主要用于确定对象在哈希表中的下标位置。比如说就有用在HashMap、HashSet中。
hashCode方法在HashMap或HashSet中经常配合equals方法使用,因为hashCode存在哈希碰撞问题,所以不同对象的哈希码可能相同,那么就需要使用equals进一步判断对象是否相同。另外,如果没有hashCode方法只有equals方法时,就需要一个一个对象的进行比较,效率很低,所以hashCode的作用使得查找比较的效率提高。
clone()
浅拷贝与深拷贝:
子类直接调用父类(也就是Object类)的clone的方法,就是浅拷贝。浅拷贝会在堆上创建新的对象,但是如果对象内部的属性是引用类型的话,浅拷贝只会复制这个内部对象的引用地址,浅拷贝后的对象与原对象共享这个内部对象。
深拷贝就是需要重写clone方法,手动进行深拷贝。深拷贝就是不仅会在堆上创建新对象,也会创建新的内部对象。
wait() & notify()
共同点:这两个方法都可以让线程暂停执行。让线程变成等待态。
不同点:
1、sleep方法时间到了,线程会自动变成运行态;而wait方法需要等待其他线程调用同一个对象的notify方法后,线程才会变成运行态。
2、wait方法会使线程释放锁,而sleep方法不会使线程释放锁。
3、wait方法是在Object类里的方法,而sleep方法是在Thread类里的方法。
为什么wait方法是在object类的?
因为wait方法需要释放当前线程所占有的锁,又因为这个锁是对象锁,因此wait操作的应该是对象,而不是线程。
集合框架图
ArrayList
ArrayList & LinkedList 区别
ArrayList底层是一个数组,因此随机访问元素的速度很快,但是插入和删除的速度就很慢,时间复杂度是O(n)级别的。
LinkedList底层是一个双向链表,插入和删除速度快,但是随机访问元素的速度就很慢,需要依次遍历。
ArrayList初始化
如果在new ArrayList的时候没有指定集合容量,那么底层就会初始化一个数组大小为0的空数组,当第一次add元素时就会将数组的长度扩容到默认长度10的大小。
启发:当我们初始化ArrayList的时候,就应该指定好数组容量,否则当容量不够时就需要扩容和复制,和带来一定的性能损耗。
ArrayList添加元素/扩容机制
当ArrayList add元素时,首先会先确保数组长度是足够的,因此会将数组长度与list中已经存储的元素个数+1进行比较,如果数组长度不够,那么就需要进行扩容。扩容就是将数组长度扩容为原来的1.5倍,然后再将原数组中的元素复制到新数组中。
启发:扩容为原来的1.5倍,底层源码是通过位运算进行计算,比如,假设oldCapacity=13,二进制数是1101,1101 >> 1 = 0110 = 6,6+13=19。扩容后的长度就是19。使用位运算速度更快。
ArrayList怎么实现复制?如何自己实现?
有三种方法,可以使用ArrayList类里的clone方法,这是一个浅拷贝;还可以使用ArrayList类里的addAll方法,这也是一个浅拷贝;还可以使用构造器,将原list作为参数装进构造器里就会得到一个新的list,这也是一个浅拷贝方法。
自己实现的话,首先创建一个新的ArrayList对象,然后依次遍历原ArrayList中的每个元素,将其添加进新ArrayList对象中。在这个过程中还可以手动实现深拷贝。
ArrayList是线程安全的吗?
ArrayList是线程不安全的。举个例子,当调用ArrayList里的add方法时,在多线程的环境下,可能有多个线程拿到同一个size,那么就会将各自的元素添加进数组的同一个位置中,这样就出现了数据覆盖问题,从而导致了线程不安全。
HashMap
HashMap初始化过程
当new一个HashMap时,table数组不会被初始化,只有等第一次put元素时,table数组才会被new出来,如果没有指定哈希表大小的话,则默认table数组长度为16。如果指定了哈希表大小,则会按大于该指定值的2的n次方进行分配。
HashMap put元素过程
首先会根据元素的key通过hashcode方法计算出哈希值,再由哈希值计算出哈希槽的索引位置。
接着判断这个索引位置上是否有元素,如果没有元素则直接我们的新元素插入;
如果这个索引位置上有元素,判断这个元素是否为树结点,
如果是树结点,则走树逻辑;
如果不是,则依次遍历这个索引位置上的链表结点,通过hashcode方法和equals方法判断两个元素的key是否相等。
如果判断出链表上的结点的key与新增元素的key是相等的,则用e指针记录这个重复结点,最后再用新增元素的value替换这 个重复元素的value。
而如果遍历完链表里的所有结点发现都没有重复的,那么就直接在链表结尾插入这个新增元素。
新增完元素后还需要判断哈希表里的元素是否超过阈值,阈值就是哈希表容量*负载因子。如果超过了需要进行扩容。
HashMap扩容过程
根据哈希表容量*负载因子可以得到扩容的阈值。如果哈希表里的元素个数超过了阈值,那么就会进行扩容。扩容是扩容为原来哈希表大小的两倍。然后在将原哈希表上的所有元素重新计算哈希值尾插法迁移至新的哈希表中。
由于都是两倍两倍的扩容,因此我们的哈希表大小一定都是2的n次方。这是为了方便使用位运算计算哈希码对应的数组索引位置。
jdk1.7的HashMap出现的死链问题
死链问题是扩容迁移过程中的头插法导致的。头插法会使链表中元素倒序插入到新表中。如果两个线程同时执行迁移操作,同时执行遍历到某个哈希槽的第一个位置,其中一个线程使得table数组的链表变成倒序,然后另一个线程接着正常执行,那么就会出现指针指回前面的结点,从而出现循环链表。
HashMap出现的线程不安全问题
1、当新增元素时可能出现线程不安全问题
如果两个线程同时执行put元素操作,且都计算出元素所对应的索引下标是同一个位置,然后同时判断出这个索引位置没有元素或者同时循环遍历到链表为尾部,那么就会出现元素覆盖问题,从而导致数据丢失。
2、扩容迁移过程出现的线程不安全问题
情况1:当一个线程执行扩容迁移的过程中,其他线程仍然可以在原表中进行新增元素,如果新增元素落在原表已遍历过的哈希槽上的话,迁移遍历完成后,当table数组引用指向新表时,在原表中新增的元素就会丢失。
情况2:当多个线程都在各自内存中扩容迁移,也就是说它们各自都含有一个新表,当线程迁移完成后,会将新表赋值给共享的table数组,因此就会出现在新表中插入元素被覆盖的问题。
相关文章:

【思维导图】java
学习计划:将目前已经学的知识点串成一个思维导图。在往后的学习过程中,不断往思维导图里补充,形成自己整个知识体系。对于思维导图里的每个技术知识,自己用简洁的话概括出来, 训练自己的表达能力。 面向对象三大特性 …...

Redis脑裂问题详解及解决方案
Redis是一种高性能的内存数据库,广泛应用于缓存、消息队列等场景。然而,在分布式Redis集群中,脑裂问题(Split-Brain)是一个需要特别关注的复杂问题。本文将详细介绍Redis脑裂问题的成因、影响及解决方案。 一、什么是…...

玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱
系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...

【Windows Server实战】生产环境云和NPS快速搭建
前置条件 本文假定你已达成以下前提条件: 有域控DC。有证书服务器(AD CS)。已使用Microsoft Intune或者GPO为客户机申请证书。服务器上至少有两张网卡(如果用虚拟机做的测试环境,可以用一张HostOnly网卡做测试&#…...

[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置
2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方,在空白处鼠标右键选择通过Code打开 打开Vscode,点击platformIO图标,选择PIO Home下的open,最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…...

【NLP251】Transformer精讲 残差链接与层归一化
精讲部分,主要是对Transformer的深度理解方便日后从底层逻辑进行创新,对于仅应用需求的小伙伴可以跳过这一部分,不影响正常学习。 1. 残差模块 何凯明在2015年提出的残差网络(ResNet),Transformer在2016年…...

康德哲学与自组织思想的渊源:从《判断力批判》到系统论的桥梁
康德哲学与自组织思想的渊源:从《判断力批判》到系统论的桥梁 第一节:康德哲学中的自然目的论与自组织思想 核心内容: 康德哲学中的自然目的论和反思判断力概念,为现代系统论中的自组织思想提供了哲学基础,预见了复…...

SpringBoot 整合 SpringMVC:SpringMVC的注解管理
分类: 中央转发器(DispatcherServlet)控制器视图解析器静态资源访问消息转化器格式化静态资源管理 中央转发器: 中央转发器被 SpringBoot 自动接管,不需要我们在 web.xml 中配置: <servlet><servlet-name>chapter2&l…...

松灵机器人 scout ros2 驱动 安装
必须使用 ubuntu22 必须使用 链接的humble版本 #打开can 口 sudo modprobe gs_usbsudo ip link set can0 up type can bitrate 500000sudo ip link set can0 up type can bitrate 500000sudo apt install can-utilscandump can0mkdir -p ~/ros2_ws/srccd ~/ros2_ws/src git cl…...

使用 Numpy 自定义数据集,使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
1. 导入必要的库 首先,导入我们需要的库:Numpy、Pytorch 和相关工具包。 import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import accuracy_score, recall_score, f1_score2. 自定义数据集 …...

MapReduce简单应用(一)——WordCount
目录 1. 执行过程1.1 分割1.2 Map1.3 Combine1.4 Reduce 2. 代码和结果2.1 pom.xml中依赖配置2.2 工具类util2.3 WordCount2.4 结果 参考 1. 执行过程 假设WordCount的两个输入文本text1.txt和text2.txt如下。 Hello World Bye WorldHello Hadoop Bye Hadoop1.1 分割 将每个文…...

c语言(关键字)
前言: 感谢b站鹏哥c语言 内容: 栈区(存放局部变量) 堆区 静态区(存放静态变量) rigister关键字 寄存器,cpu优先从寄存器里边读取数据 #include <stdio.h>//typedef,类型…...

蓝桥杯思维训练营(一)
文章目录 题目总览题目详解翻之一起做很甜的梦 蓝桥杯的前几题用到的算法较少,大部分考察的都是思维能力,方法比较巧妙,所以我们要积累对应的题目,多训练 题目总览 翻之 一起做很甜的梦 题目详解 翻之 思维分析:一开…...

【C语言】结构体对齐规则
文章目录 一、内存对齐规则二、结构体的整体对齐: 一、内存对齐规则 1.第一个数据成员:结构体的第一个数据成员总是放置在其起始地址处,即偏移量为0的位置。 2.其他数据成员的对齐:每个后续成员的存储地址必须是其有效对齐值的整…...

2025-工具集合整理
科技趋势 github-rank 🕷️Github China/Global User Ranking, Global Warehouse Star Ranking (Github Action is automatically updated daily). 科技爱好者周刊 制图工具 D2 D2 A modern diagram scripting language that turns text to diagrams 文档帮助 …...

快速提升网站收录:利用网站用户反馈机制
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/59.html 利用网站用户反馈机制是快速提升网站收录的有效策略之一。以下是一些具体的实施步骤和建议: 一、建立用户反馈机制 多样化反馈渠道: 设立在线反馈表、邮件…...

图漾相机——Sample_V1示例程序
文章目录 1.SDK支持的平台类型1.1 Windows 平台1.2 Linux平台 2.SDK基本知识2.1 SDK目录结构2.2 设备组件简介2.3 设备组件属性2.4 设备的帧数据管理机制2.5 SDK中的坐标系变换 3.Sample_V1示例程序3.1 DeviceStorage3.2 DumpCalibInfo3.3 NetStatistic3.4 SimpleView_SaveLoad…...

如何使用C#的using语句释放资源?什么是IDisposable接口?与垃圾回收有什么关系?
在 C# 中,using语句用于自动释放实现了IDisposable接口的对象所占用的非托管资源,如文件句柄、数据库连接、图形句柄等。其使用方式如下: 基础用法 声明并初始化资源对象:在using关键字后的括号内声明并初始化一个实现了IDisposable接口的对象。使用资源:在using语句块内…...

HTML 字符实体
HTML 字符实体 在HTML中,字符实体是一种特殊的表示方式,用于在文档中插入那些无法直接通过键盘输入的字符。字符实体在网页设计和文档编写中扮演着重要的角色,尤其是在处理特殊字符、符号和数学公式时。以下是关于HTML字符实体的详细解析。 字符实体概述 HTML字符实体是一…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_strerror_init()函数
目录 ngx_strerror_init()函数声明 ngx_int_t 类型声明定义 intptr_t 类型 ngx_strerror_init()函数实现 NGX_HAVE_STRERRORDESC_NP ngx_strerror_init()函数声明 在 nginx.c 的开头引入了: #include <ngx_core.h> 在 ngx_core.h 中引入了 #include <ngx_er…...

【c++】类与对象详解
目录 面向过程思想和面向对象思想类的定义引入类的关键字类定义的两种方式类的访问限定符类的作用域类大小的计算封装 this指针类的6个默认成员函数构造函数初步理解构造函数深入理解构造函数初始化列表单参数构造函数引发的隐式类型转换 析构函数拷贝构造函数赋值运算符重载运…...

nginx目录结构和配置文件
nginx目录结构 [rootlocalhost ~]# tree /usr/local/nginx /usr/local/nginx ├── client_body_temp # POST 大文件暂存目录 ├── conf # Nginx所有配置文件的目录 │ ├── fastcgi.conf # fastcgi相关参…...

MacBook Pro(M1芯片)Qt环境配置
MacBook Pro(M1芯片)Qt环境配置 1、准备 试图写一个跨平台的桌面应用,此时想到了使用Qt,于是开始了搭建开发环境~ 在M1芯片的电脑上安装,使用brew工具比较方便 Apple Silicon(ARM/M1…...

Kotlin 使用 Springboot 反射执行方法并自动传参
在使用反射的时候,执行方法的时候在想如果Springboot 能对需要执行的反射方法的参数自动注入就好了。所以就有了下文。 知识点 获取上下文通过上下文获取 Bean通过上下文创建一个对象,该对象所需的参数由 Springboot 自己注入 创建参数 因为需要对反…...

网络安全技术简介
网络安全技术简介 随着信息技术的迅猛发展,互联网已经成为人们日常生活和工作中不可或缺的一部分。与此同时,网络安全问题也日益凸显,成为全球关注的焦点。无论是个人隐私泄露、企业数据被盗取还是国家信息安全受到威胁,都与网络…...

nginx 报错404
404:服务器无法正常解析页面,大多是配置问题(路径配置错误)、或访问页面不存在 如果你也是用nginx来转接服务的话,那你有可能碰到过这种情况,当你启动服务后,在本地打开页面,发现404,然后你找遍…...

【1.安装ubuntu22.04】
目录 参考文章链接电脑参数安装过程准备查看/更改引导方式查看/更改磁盘的分区格式关闭BitLocker加密压缩分区关闭独显直连制作Ubuntu安装盘下载镜像制作启动盘 进入BIOS模式进行设置Secure Boot引导项顺序try or install ubuntu 进入安装分区启动引导器个人信息和重启 参考文章…...

【设计模式-行为型】备忘录模式
一、什么是备忘录模式 来到备忘录模式了,这个模式我感觉相对简单一些,就是备份,或者快照。跟前面一样为了加深理解,我们引入一个电影情结来说明啥是备忘录模式,以来加深大家对备忘录模式的认识。那么,在电影…...

Linux环境下的Java项目部署技巧:安装 Mysql
查看 myslq 是否安装: rpm -qa|grep mysql 如果已经安装,可执行命令来删除软件包: rpm -e --nodeps 包名 下载 repo 源: http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 执行命令安装 rpm 源(根据下载的…...

云原生(五十三) | SQL查询操作
文章目录 SQL查询操作 一、数据库DDL操作 1、登陆数据库 2、创建DB数据库 二、数据表DDL操作 1、创建数据表 2、RDS中SQL查询操作 三、SQL查询操作 1、RDS中SQL查询操作 SQL查询操作 一、数据库DDL操作 1、登陆数据库 2、创建DB数据库 创建一个普通账号,…...