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

【思维导图】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的注解管理

分类&#xff1a; 中央转发器(DispatcherServlet)控制器视图解析器静态资源访问消息转化器格式化静态资源管理 中央转发器&#xff1a; 中央转发器被 SpringBoot 自动接管&#xff0c;不需要我们在 web.xml 中配置&#xff1a; <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. 导入必要的库 首先&#xff0c;导入我们需要的库&#xff1a;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语言(关键字)

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

蓝桥杯思维训练营(一)

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

【C语言】结构体对齐规则

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

2025-工具集合整理

科技趋势 github-rank &#x1f577;️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 文档帮助 …...

快速提升网站收录:利用网站用户反馈机制

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

图漾相机——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…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...