1、第一阶段邪修实战总览(9.1-9.30)

把第一阶段(基础夯实期)的学习计划拆解成极具操作性的每日行动方案。这个计划充分利用我“在职学习”的特殊优势,强调“用输出倒逼输入”,确保每一分钟的学习都直接服务于面试和实战。

  • 核心目标:构建起Java后端开发的知识树主干,并能通过一个小型项目串联起所有知识点。
  • 核心策略:每天3小时雷打不动的高效学习(工作日可分散,周末集中攻坚)。

2、周目标(9.1-9.14)

Java核心+Sprig Boot破冰,能独立使用Spring搭建Web后端并提供RESTful接口。


3、分日目标与邪修技巧

3.1、Day 9.1-9.2: Java基础(变量、循环、条件分支、字符串操作)

  • 行动:安装JDK、IDE(IntelliJ IDEA),配置好环境。在菜鸟教程中学Java的变量、循环、条件分支、字符串操作这几个板块的内容,并用IDEA写一个简单的控制台程序,我这里做了一个类似的程序叫"Data_Board",这是一个用Java编写的广告数据展示程序,采用面向对象设计思想重构,能够从Excel文件读取广告数据,展示广告花费、线索数量等关键指标,并提供多日期数据对比分析功能。程序支持数据自动计算(单个线索成本、私信转化成本)和趋势分析,具备良好的可扩展性和维护性。
  • 邪修技巧:可以用TREA写项目的README,定时更新一下,这样后期我们面试之前可以仔细看看自己项目的编写流程。
  • 学习分享:这一阶段的下载安装就先不跟大家分享了,没有那么多时间写哈哈哈,如果大家有疑问想了解可以私聊我哈~这几天的程序我会综合在day5-day6中分享出来。

3.2、Day 9.3-9.4: Java面向对象(类、对象、继承、多态、接口)

  • 行动:在菜鸟教程中学Java的类、对象、继承、多态、接口这几个板块的内容,将前两天的"Data_Board"改造成面向对象风格。定义AdCampaign类,包含名称、花费、收入等属性,并封装计算方法。
  • 邪修技巧:思考为公司写的那个程序,如果用OOP思想重构,该怎么设计?把这个思考过程写在代码注释里,面试时可以聊。

3.3、Day 9.5-9.6: Java集合框架(List, Map, Set)和IO操作

  • 行动:在菜鸟教程中学Java的List、Map、Set和IO操作这几个板块的内容,编写程序从Excel文件(模拟数据源)读取广告数据,存入ArrayList或HashMap,并进行统计计算。
  • 邪修技巧:这是面试重点。每学一个集合类,就去查一下它的底层实现(比如HashMap是数组+链表/红黑树),记下一两句源码分析,面试时抛出来是巨大加分项。

3.3.1、学习分享

  • 根据前几天所学,制作了一个采用面向对象设计思想重构,能够从Excel文件读取广告数据,展示广告花费、线索数量等关键指标,并提供多日期数据对比分析功能。程序支持数据自动计算(单个线索成本、私信转化成本)和趋势分析,具备良好的可扩展性和维护性。我把具体的代码和README文档放到了github里,点击链接进入Data_Board-README文档可以查看、下载并学习。
  • 由于本人也是第一次正式使用Github来管理自己的代码,以前总是自己存储,所以现在也是仔细学了一下。给大家推荐几个博客,大家如果想仔细学一下Github的话可以借鉴一下:
    • Github入门教程,适合新手学习(非常详细),这个博客的内容比较全面,有对GitHub和Git的介绍以及使用教程,唯一缺点是比较长,适合静下心来仔细查看。
    • 【2025版】最新GitHub新手用法详解(适合新手入门)零基础入门到精通,收藏这篇就够了_github使用详解,相较于上一篇博客,针对于Github和Git的讲解少一点,但是基础使用都是有的,赶进度可以试试。
    • 如何解决:ssh: connect to host github.com port 22: Connection refused,这篇文档解决了本地机器尝试通过 SSH 协议连接 GitHub 的 22 端口时,连接被拒绝了的问题,如果你看不懂这个问题,你就切记当你碰到ssh: connect to host github.com port 22: Connection refused时,来找这个博客就行啦,别整什么防火墙、服务器之类的,就是个简单的端口问题,跟着这个博客一步步解决即可。

3.3.2、集合类分析思考

ArrayList:
  • 底层实现:基于动态数组(transient Object[] elementData),默认初始容量10,支持自动扩容。
  • 扩容机制:当添加元素导致不足时,通过grow()方法扩容,新容量为oldCapacity + (oldCapacity >>1)(即1.5倍),使用Array.copyof()复制数组元素。
    • oldCapacity + (oldCapacity >>1)是ArrayList扩容时计算“新容量”的核心公式,作用是把当前容量扩大到原来的1.5倍。
    • >> 是 Java 里的 “右移运算符”,简单说就是 把一个数在二进制里往右挪几位,效果相当于 “除以 2 的 n 次方”(n 是右移的位数)。这里用的是 oldCapacity >> 1(右移 1 位),效果就等于 oldCapacity ÷ 2(只取整数部分)。
  • 关键代码:
// 添加元素时的扩容判断
ensureCapacityInternal(size + 1);  // 确保容量足够:检查一下,现在的够不够再放 1 个新元素
elementData[size++] = e;  // 直接在数组末尾赋值:添加新元素,并记录现在的大小
// 代码分析:
// 先确认有地方放新元素(不够就扩容),然后把元素放到最后一个空位置,再更新已有的元素数量。
// ensureCapacityInternal(...):这是个 “检查容量” 的工具方法,它会做两件事:1、看看当前elementData的长度(也就是 “总抽屉数”)够不够装size + 1个元素。2、如果够(比如总抽屉数 10,要放第 10 个),就啥也不做,直接下一步;如果不够(比如总抽屉数 10,要放第 11 个),就触发 “扩容”(把抽屉数变成 15),然后再下一步。
// elementData[size] = e:往 “元素数组” 的第size个位置放新元素。因为size是 “当前已有的数量”,所以第size个位置正好是 “下一个空位置”。比如现在有 3 个元素(size=3),空位置就在索引 3 的位置,直接把新元素放进去。size++:放完之后,“已有的数量” 要加 1(比如原来 3 个,现在变成 4 个)。
LinkedList:
  • 底层实现:基于双向链表,每个节点(Node)包含prev(前驱)、next(后继)指针和实际元素item。
  • 源码关键分析:插入 / 删除效率高(无需移动元素),查询需遍历。
// 节点结构定义
private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}
}
// 添加到尾部:直接修改尾节点的next指针
void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null) first = newNode;else l.next = newNode;size++;
}
HashMap
  • 底层实现:基于数组 + 链表 + 红黑树,数组(Node<K,V>[] table)是主体,链表用于解决哈希冲突,当链表长度 > 8 且数组容量≥64 时转为红黑树。
    • 数组+链表+红黑树的底层核心结构可以想象成一个带编号的多层货架:
    • 第一层:数组(哈希表,Node<K,V>[] table)。这是最基础的“大格子”,每个格子有唯一编号(索引),默认初始容量是16(必须是2的幂次,比如16、32、64…)。每个格子里可以放“链条”或“小数”。
    • 第二层:链表(解决哈希冲突)。当多个“商品”(key-value)计算后落到同一个“大格子”里时,会像串珠子一样练成链表(每个节点Node有next指针,指向后一个节点)。
    • 第三层:红黑树(优化长链表查询)。当一个格子里的链表太长(默认超过8个节点),且整个货架的大格子数量>=64时,链表会自动转成红黑树(一种平衡二叉树)。树的查询效率比长链表高很多(从O(n)降到O(logn))。
  • 哈希计算:通过(key.hashCode() ^ (key.hashCode() >>> 16))扰动哈希值,再用(n-1) & hash计算数组索引(n 为数组容量)。
  • 哈希冲突:也叫哈希碰撞,是哈希表(如 HashMap)在存储数据时必然可能遇到的问题。根本原因是哈希函数的 “输出范围”(数组索引的数量)是有限的,但 “输入范围”(可能的 key 数量)是无限的。比如数组长度只有 16(索引 0~15),但可能的 key 可以是 “苹果”“橙子”“西瓜”…… 无数个,有限的索引必然会被无限的 key “重复占用”,冲突无法完全避免,只能尽量减少。
  • 扩容机制:容量为 2 的幂次,扩容时通过resize()方法将元素重新哈希分配,红黑树可能拆分为链表。
  • 关键代码:
// 计算哈希值(减少碰撞)
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
// 树化判断(JDK 1.8新增)
if (binCount >= TREEIFY_THRESHOLD - 1) // TREEIFY_THRESHOLD = 8treeifyBin(tab, hash);
HashSet
  • 底层实现:基于HashMap,元素存储在HashMap的key中,value固定为一个静态常量(PRESENT = new object()).
  • 特点:无序、不可重复,依赖HashMap的key去重(通过hashCode()和equals()判断)。
    • 无序:元素的存储顺序不固定,因为HashMap的key是无序的;
    • 去重:依赖HashMap的key不重复(靠hashCode()和equals()判断);
    • 线程不安全:和HashMap一样,多线程操作可能出问题;
    • 查询/增删效率高:平均时间复杂度是O(1),因为HashMap的核心操作效率高。
  • HashSet里,不同元素可能算出相同哈希值(比如“苹果”和“橙子”哈希值都是123),这是必须要再用equals()确认“到底是不是真的相同”,避免把“不同元素误判为重复”。必须同时满足两个条件:
    • a.hashCode() == b.hashCode():两个元素的哈希值相等(哈希值是元素的“数字身份证”,由hashCode()方法计算);
    • a.equals(b) == true:两个元素通过equals()方法比较,结果为“相等”。
  • 关键代码:
// 添加元素实际调用HashMap的put()
public boolean add(E e) {return map.put(e, PRESENT) == null;  // 若key不存在则添加,返回true
}
// HashMap 的 put 方法有个规则:如果 key 不存在,就新增 key-value,返回 null;如果 key 已存在,就覆盖 value,返回 “旧的 value”;
//所以 HashSet 的 add 方法:如果返回 true,说明 “元素是新的,添加成功”;如果返回 false,说明 “元素已存在,添加失败”—— 这就实现了 “去重”。

总结

  • ArrayList 添加元素时,会先通过 ensureCapacityInternal 检查容量够不够,不够就扩容;够的话直接把元素放到数组的末尾(elementData [size] 的位置),然后把元素数量 size 加 1。
  • LinkedList 底层是双向链表,每个节点存前后指针和元素。增删快(改指针即可,不用挪元素),查询慢(得从头 / 尾遍历)。适合频繁增删、少查询的场景,和 ArrayList(数组,查快增删慢)互补。
  • HashMap 靠 “数组 + 链表 + 红黑树” 的结构,结合哈希计算和动态扩容,实现了高效的键值对存储。核心特点是:查询、增删效率高(平均 O (1)),key 不重复(依赖hashCode()和equals()),线程不安全,适合频繁查询和修改的场景。
  • HashSet底层基于 HashMap 实现,把要存的元素作为 HashMap 的 key,用一个固定对象当 value,借 HashMap 的 key 去重特性实现自己的功能,特点是无序、不重复、效率高。

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

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

相关文章

XR数字融合工作站打造智能制造专业学习新范式

智能制造是工业4.0的核心发展方向&#xff0c;涵盖数字化设计、智能生产、工业机器人、数字孪生、物联网等关键技术。然而&#xff0c;传统教学模式在设备成本高、实训风险大、抽象概念难理解等方面存在诸多挑战。XR数字融合工作站,利用VR/AR/MR等技术&#xff0c;通过虚拟仿真…

基于FPGA实现数字QAM调制系统

基于FPGA实现数字QAM调制系统题目要求一、代码设计1.顶层2.分频3.m序列4.串转并5.映射6.正弦波余弦波生成ROM和7.ask二、仿真波形总结题目要求 FPGA实现数字QAM调制系统要求根据正交振幅调制原理&#xff0c;利用正弦载波信号发生器&#xff0c;实现调制信号。调制原理会利用到…

DAY 22 复习日

浙大疏锦行复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 导入需要的库 import pandas as pd # 用于数据处理和分析&#xff0c;…

biocmanager安装 库 老是提示网络连接错误 才尝试各种办法

您好&#xff0c;遇到 BioManager &#xff08;通常是 BiocManager&#xff09;安装R包时提示网络连接错误确实非常令人头疼。这通常与R/RStudio的配置、网络环境&#xff08;尤其是国内用户&#xff09;或SSL证书问题有关。 请不要着急&#xff0c;我们可以按照从易到难的顺序…

【开题答辩全过程】以 智能商品数据分析系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

解构复杂财务逆向业务:如何优雅地生成与管理负数单?

文章目录一 核心复杂性二 关键设计模式&#xff1a;三 棘手场景与解决方案&#xff1a;1.分批合并处理&#xff1a;负数单需能智能拆分&#xff0c;精准冲销多批次的正向单据。2.优先级问题&#xff1a;3.超额处理&#xff1a;系统应坚决拦截而非处理&#xff0c;防止资金损失和…

Android集成OpenCV4实例

Android集成OpenCV4分以下几步骤&#xff1a; 使用Android Studio Giraffe | 2022.3.1创建一个Empty Views Activity空项目&#xff0c;包名为&#xff1a;com.example.andopencvdemo00 &#xff0c; 创建成功后&#xff0c;进行以下相关设置&#xff1a; 第一步&#xff1a;在…

npy可视化方法

npviewer 是一个应用程序&#xff0c;它允许您以热图的形式可视化 numpy 的 npy 文件中的数据。该应用程序根据不同的模式自动选择适当的维度进行显示。 根据不同的模式自动选择适当的维度进行显示支持不同格式的 numpy 数据的可视化&#xff0c;如 RGB 和灰度用户友好的界面使…

【Cesium】介绍及基础使用

文章目录一、Cesium 介绍二、 使用1、引入 cesium2、Viewer 配置选项1. 基础控件配置2. 场景与渲染配置3. 地形配置4. 天空与大气效果3、坐标系系统3.1 地理坐标系3.2 笛卡尔空间直角坐标系3.3 屏幕坐标系4、Entity 实体4.1 简介4.2 Entity 常见图形类型Point 点Polyline 线Pol…

基于SpringBoot的运动服装销售系统【2026最新】

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【嵌入式DIY实例-ESP32篇】-倾斜弹跳球游戏

倾斜弹跳球游戏 文章目录 倾斜弹跳球游戏 1、MPU6050介绍 2、硬件准备与接线 3、代码实现 在这个交互式 ESP32 Arduino 项目中,我们模拟了一个绿色球体在全彩 ST7789 170320 LCD 屏幕上弹跳,完全由 MPU6050 陀螺仪的运动控制。当你倾斜传感器时,球体会呈现出逼真的物理运动,…

从spring MVC角度理解HTTP协议及Request-Response模式

什么是HTTP协议&#xff1f;HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种通信规则&#xff0c;它定义了客户端&#xff08;如浏览器、手机APP&#xff09; 和服务器 之间如何交换信息&#xff0c;是用于在万维网&#xff08;…

江协科技STM32学习笔记补充之003 :STM32复位电路的详细分析

电路作用与每个器件R1&#xff08;10 kΩ&#xff0c;上拉到 3V3&#xff09;让 NRST 在无外力时保持高电平&#xff1d;不复位&#xff1b;同时与电容形成 RC&#xff0c;决定上电复位延时。阻值不能太小&#xff08;否则调试器或芯片复位驱动下拉电流太大&#xff09;&#x…

Spring Boot HTTP状态码详解

Spring Boot HTTP状态码完全指南&#xff1a;从入门到精通 前言 在RESTful API开发中&#xff0c;HTTP状态码是与客户端通信的重要桥梁。Spring Boot通过HttpStatus枚举提供了完整的HTTP状态码支持。本文将深入解析这些状态码的含义、使用场景以及在Spring Boot中的最佳实践。 …

怎样让外网计算机访问局域网计算机?通过公网地址访问不同内网服务的设置方法

局域网服务器提供公网访问&#xff0c;或指定某些端口应用资源给外地访问&#xff0c;都是常见跨网通信需求。在一些场景下&#xff0c;内部网络中的服务器需要通过公网地址进行访问&#xff0c;尤其是在没有固定公网IP或需要在外部访问时。为了解决这一问题&#xff0c;可以使…

Spring Boot启动失败从循环依赖到懒加载配置的深度排查指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

从零开始学大模型之大语言模型

大语言模型 4.1 什么是 LLM 在前三章&#xff0c;我们从 NLP 的定义与主要任务出发&#xff0c;介绍了引发 NLP 领域重大变革的核心思想——注意力机制与 Transformer 架构。随着 Transformer 架构的横空出世&#xff0c;NLP 领域逐步进入预训练-微调范式&#xff0c;以 Tran…

如何将视频从 iPhone 转移到 Mac

将视频从 iPhone 转移到 Mac 是许多用户常见的需求。无论你是想备份重要的视频&#xff0c;还是希望在更大的屏幕上观看&#xff0c;以下方法都能帮助你轻松完成。方法一&#xff1a;使用 iReaShare iPhone ManageriReaShare iPhone Manager 是一款功能强大的工具&#xff0c;可…

五、Docker 核心技术:容器数据持久化之数据卷

Docker 容器本身是无状态且生命周期短暂的。当一个容器被删除时&#xff0c;它在可写层产生的所有数据都会随之消失。这对于需要持久化存储数据的应用 (如数据库、日志系统、用户上传内容) 来说是不可接受的。为了解决这个问题&#xff0c;Docker 提供了多种数据持久化方案&…

前端视觉交互设计全解析:从悬停高亮到多维交互体系(含代码 + 图表)

在前端用户体验领域&#xff0c;视觉交互是连接用户与产品的 “隐形桥梁”—— 它通过可视化信号传递操作意图、反馈系统状态&#xff0c;直接决定用户对产品的感知。很多开发者对视觉交互的认知停留在 “鼠标悬停高亮”&#xff0c;但实际上&#xff0c;视觉交互是一个覆盖 “…