java复习 05
我的天啊一天又要过去了,没事的还有时间!!!
不要焦虑不要焦虑,事实证明只要我认真地投入进去一切都还是来得及的,代码多实操多复盘,别叽叽喳喳胡思乱想多多思考,有迷茫前害怕后的功夫已经可以学很多东西了,不许胡思乱想了快点学,,,对,加油,相信自己哦!!
---------------------------------------------------------------------------------------------------------------------------------
这是day2 写的,是的一般两天合起来更一次,一路生花~~~~❀~!!~!~!~!~!~!
加油加油加油!我的天啊期末考试慌死我了不会挂科的不会挂的不会的,,,吓鼠我了。。
pta还剩两道题目,记得看课了再做,做的太多了,今天要消化不良了。。。。。
1 设置和获取线程名称(小结)
Thread 类中设置和获取线程名称的方法
- void setName (String name):将此线程的名称更改为等于参数 name
- String getName ():返回此线程的名称
- 通过构造方法也可以设置线程名称
如何获取 main () 方法所在的线程名称?
- public static Thread currentThread ():返回对当前正在执行的线程对象的引用
2 线程调度
线程有两种调度模型~~~
- 分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
- 抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
Java 使用的是抢占式调度模型
假如计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU 时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性,因为谁抢到 CPU 的使用权是不一定的!!
Thread 类中设置和获取线程优先级的方法
- public final int getPriority ():返回此线程的优先级
- public final void setPriority (int newPriority):更改此线程的优先级
public final int getPriority()
:
调用这个方法时,会返回当前线程对象的优先级。
返回值是一个 int
类型,在 Java 里,线程优先级的取值范围通常是 1(最低优先级 )到 10(最高优先级 ),默认值是5,(不过不同的 JVM 实现可能在具体映射到底层系统优先级时有差异,但应用层代码遵循这个取值逻辑即可 。
通过获取优先级,我们可以在程序中判断线程当前的 “重要程度” 设定,用于一些调试、日志记录或者逻辑判断场景,比如打印线程优先级信息,辅助排查多线程执行顺序相关问题 。
public final void setPriority(int newPriority)
:
该方法用于更改当前线程的优先级~~~~
传入的参数 newPriority
需是在合法取值范围(1 - 10 )内的 int
值。
需要注意的是,设置优先级只是给线程调度一个 “提示”!!!!!,并非设置后高优先级线程就一定会立即执行、低优先级线程就完全无法执行,它受抢占式调度整体机制以及系统环境等影响,但合理设置优先级,能在多线程协作执行中,让关键任务线程更大概率获得 CPU 资源,提升程序整体的执行效率和业务逻辑的合理性,比如在处理紧急任务的线程上设置较高优先级,让其尽快得到执行 。
getPriority()
:
是 Thread
类中的一个实例方法,其作用是返回当前线程对象的优先级。线程的优先级是一个介于 1
(Thread.MIN_PRIORITY
)到 10
(Thread.MAX_PRIORITY
)之间的整数,默认优先级为 5
(Thread.NORM_PRIORITY
)。
package PTA_training.Thread_training;public class MyThreadDemo {public static void main(String[] args) {MyThread m1 = new MyThread("啊");MyThread m2 = new MyThread("ABC");// 设置 m1 的优先级为 10m1.setPriority(10);// 设置 m2 的优先级为 1m2.setPriority(1);// 启动线程m1.start();m2.start();}
}
package PTA_training.Thread_training;public class MyThread extends Thread {public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(getName() + ":" + i);}}
}
3 线程控制
方法名 | 说明 |
---|---|
static void sleep(long millis) | 使当前正在执行的线程停留(暂停执行)指定的毫秒数 |
void join() | 等待这个线程死亡 |
void setDaemon(boolean on) | 将此线程标记为守护线程,当运行的线程都是守护线程时,Java 虚拟机将退出 |
4 消耗换行符的重要性
是的!在 Java 中使用 Scanner
时,输入流的换行符处理是非常容易出错的细节。以下是关于这个问题的深度解析和避坑指南,帮你彻底理解原理并避免类似问题:
一、为什么会出现换行符残留?
1. Scanner
的输入方法特性
nextInt()
/nextDouble()
等方法:
只会读取有效数据部分(如数字),不会消耗数据后的换行符(\n
),导致换行符残留在输入流中。nextLine()
方法:
会读取一行完整的输入,包括换行符(但会自动去除换行符)。如果输入流中残留换行符,nextLine()
会直接读取空字符串。
2. 具体场景示例
-
错误代码:
java
int n = scanner.nextInt(); // 输入:3(回车) String line = scanner.nextLine(); // 此时 line 是空字符串!
- 输入
3
后按下回车,nextInt()
读取3
,但残留\n
在输入流中。 nextLine()
会直接读取这个残留的\n
(视为空行),导致line
为空。
- 输入
-
正确做法:
在nextInt()
后手动消耗换行符:java
int n = scanner.nextInt(); scanner.nextLine(); // 主动读取并丢弃残留的 \n String line = scanner.nextLine(); // 此时正常读取下一行输入
二、常见输入组合的坑与解决方案
1. 场景 1:数字 + 字符串(行输入)
- 需求:先输入整数
n
,再输入n
行字符串(如姓名和年龄)。 - 错误代码:
java
int n = scanner.nextInt(); // 输入:3(回车) for (int i = 0; i < n; i++) {String line = scanner.nextLine(); // 第一次循环读取空字符串!// 导致 line.split(" ") 长度不足,引发 ArrayIndexOutOfBoundsException }
- 解决方案:
在nextInt()
后添加scanner.nextLine()
消耗换行符:java
int n = scanner.nextInt(); scanner.nextLine(); // 关键!消耗残留的 \n for (int i = 0; i < n; i++) {String line = scanner.nextLine(); // 正常读取每一行String[] parts = line.split(" ");// ... 处理逻辑 }
2. 场景 2:混合使用 next()
和 nextLine()
- 需求:先输入单词(如姓名),再输入整行文本。
- 错误代码:
java
String name = scanner.next(); // 输入:lily(回车) String desc = scanner.nextLine(); // 直接读取空字符串!
- 原因:
next()
读取到lily
后,残留的\n
被nextLine()
视为空行。 - 解决方案:
同样在next()
后添加scanner.nextLine()
消耗换行符(如果后续需要nextLine()
):java
String name = scanner.next(); scanner.nextLine(); // 消耗残留的 \n String desc = scanner.nextLine(); // 正常读取整行
三、终极避坑指南
1. 基本原则
- 如果先调用了
nextInt()
/next()
等非行读取方法,后续需要调用nextLine()
时,必须手动消耗残留的换行符。 - **********
- 养成习惯:在
nextInt()
/next()
后,立即添加scanner.nextLine()
来 “清理” 输入流。
2. 统一使用 nextLine()
处理输入
- 对于数字输入,先读取整行字符串,再转为数字:
java
String nStr = scanner.nextLine(); // 读取整行(含回车) int n = Integer.parseInt(nStr); // 转为整数
这样可以避免nextInt()
遗留换行符的问题。
3. 调试技巧
- 在怀疑输入流有残留时,添加
System.out.println("DEBUG: " + scanner.hasNextLine());
查看是否有未读取的行。 - 使用
scanner.hasNext()
或scanner.hasNextInt()
预判输入类型,确保逻辑正确。
四、总结:为什么这个坑容易被忽略?
- 换行符不可见:残留的
\n
不会在控制台显示,但会直接影响后续输入方法的行为。 - 惯性思维:以为输入方法会自动处理所有字符,但实际上
Scanner
的不同方法对换行符的处理策略不同。
记住这个口诀:非行读取后,必消换行符。
下次遇到类似问题时,先检查是否在 nextInt()
/next()
后遗漏了 nextLine()
的调用~
5 Express express;这是什么做法?划重点!
/*
7-5 快递计价器-2现需要编写一个简易快递计价程序。具体来说:1、抽象快递类Express,
其包含一个属性int weight表示快递重量(单位为kg),
一个方法getWeight()用于返回快递重量和一个抽象方法getTotal()用于计算快递运费。2、两个类继承Express,分别是:
(a)顺路快递SLExpress:计价规则为首重(1kg)12元,每增加1kg费用加2元。
(b)地地快递DDExpress:计价规则为首重(1kg)5元,每增加1kg费用加1元。3、Main:
接收用户通过控制台输入的N行信息,
自动计算每件快递的运费。输入样例:
6
SL 2
DD 2
SL 1
SL 1
SL 1
DD 3输入解释:
第1行n表示需要计算的快递件数
第2至n+1表示每个快递信息,
即选哪家快递公司 以及快递的重量(单位kg),
物品重量都是整数。输出样例:
SLExpress:14
DDExpress:6
SLExpress:12
SLExpress:12
SLExpress:12
DDExpress:7*/
import java.util.Scanner;
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();scanner.nextLine();for (int i = 0; i < n; i++) {String line = scanner.nextLine();String [] parts = line.split(" ");String name = parts[0];int weight = Integer.parseInt(parts[1]);Express express;//划重点,我卡住的地方if (name.equals("SL")){express = new SLExpress();express.weight = weight;System.out.println("SLExpress:"+ express.getTotal());} else if (name.equals("DD")) {express = new DDExpress();express.weight = weight;System.out.println("DDExpress:"+ express.getTotal());}else{continue;}}scanner.close();}
}
class SLExpress extends Express{@Overrideint getTotal(){if (weight > 1){return 12 + (weight - 1) * 2;}else {return 12;}}
}
class DDExpress extends Express{@Overrideint getTotal(){if (weight > 1){return 5 + (weight - 1 );}else {return 5;}}
}
abstract class Express {int weight;int getWeight(){return weight;}abstract int getTotal();
}
在你之前代码里出现的 Express express;
是一个变量声明语句,这是面向对象编程里多态性的一种应用,下面为你详细解释:
1. 变量声明
Express express;
声明了一个名为 express
的变量,该变量的类型为 Express
。这里的 Express
是一个抽象类,此抽象类定义了快递的通用属性与方法,像 weight
属性、getWeight()
方法以及抽象方法 getTotal()
。
2. 多态性的体现
多态性是面向对象编程的重要特性之一,它允许我们使用父类类型的引用去引用子类的对象。在这个场景中,Express
是父类(抽象类),SLExpress
和 DDExpress
是它的子类。
在代码里,我们依据用户输入的快递公司名称(SL
或者 DD
)来创建对应的子类对象,不过把这些子类对象赋值给父类类型的引用 express
,具体代码如下:
java
if (name.equals("SL")) {express = new SLExpress();
} else if (name.equals("DD")) {express = new DDExpress();
}
- 当
name
为"SL"
时,创建一个SLExpress
对象,并且把这个对象赋值给express
。 - 当
name
为"DD"
时,创建一个DDExpress
对象,并且把这个对象赋值给express
。
3. 好处
采用这种做法有以下好处:
- 代码的可扩展性:要是后续需要添加新的快递类型(例如新的子类),仅需创建新的子类并继承
Express
类,重写getTotal()
方法,而不用修改Main
类里大部分的代码逻辑。 - 代码的简洁性:能够使用统一的父类引用
express
来调用getTotal()
方法,不用为每个子类单独编写调用逻辑。例如:
java
express.weight = weight; // 设置快递重量
int total = express.getTotal(); // 计算运费
4. 动态绑定
在运行时,Java 会依据 express
实际引用的对象类型(SLExpress
或者 DDExpress
)来调用对应的 getTotal()
方法,这就是动态绑定。所以,尽管 express
是 Express
类型的引用,但调用 getTotal()
方法时会执行子类重写后的具体实现。
综上所述,Express express;
这种做法利用了多态性,提升了代码的可扩展性和简洁性。
相关文章:
java复习 05
我的天啊一天又要过去了,没事的还有时间!!! 不要焦虑不要焦虑,事实证明只要我认真地投入进去一切都还是来得及的,代码多实操多复盘,别叽叽喳喳胡思乱想多多思考,有迷茫前害怕后的功…...

aardio 简单网页自动化
WebView自动化,以前每次重复做网页登录、搜索这些操作时都觉得好麻烦,现在终于能让程序替我干活了,赶紧记录下这个超实用的技能! 一、初次接触WebView WebView自动化就像给程序装了个"网页浏览器",第一步得…...

打卡第39天:Dataset 和 Dataloader类
知识点回顾: 1.Dataset类的__getitem__和__len__方法(本质是python的特殊方法) 2.Dataloader类 3.minist手写数据集的了解 作业:了解下cifar数据集,尝试获取其中一张图片 import torch import torch.nn as nn import…...
【评测】Qwen3-Embedding模型初体验
每一篇文章前后都增加返回目录 回到目录 【评测】Qwen3-Embedding模型初体验 模型的介绍页面 本机配置:八代i5-8265U,16G内存,无GPU核显运行,win10操作系统 ollama可以通过下面命令拉取模型: ollama pull modelscope…...
BeanFactory 和 FactoryBean 有何区别与联系?
导语: Spring 是后端面试中的“常青树”,而 BeanFactory 与 FactoryBean 的关系更是高频卡人点。很多候选人混淆两者概念,答非所问,轻则失分,重则直接被“pass”。本文将从面试官视角,深入剖析这一经典问题…...

如何做好一份优秀的技术文档:专业指南与最佳实践
如何做好一份优秀的技术文档:专业指南与最佳实践 技术文档是产品开发、用户支持和团队协作的核心工具。高质量的技术文档能够提升开发效率、降低维护成本并改善用户体验。本文将从实践出发,详细讲解如何编写专业、清晰且实用的技术文档。 🌟…...
C语言内存管理和编译优化实战
参考: C语言内存管理“玄学”:从崩溃到精通的避坑指南C语言编译优化实战:从入门到进阶的高效代码优化技巧...

TCP相关问题 第一篇
TCP相关问题1 1.TCP主动断开连接方为什么需要等待2MSL 如上图所示:在被动链接方调用close,发送FIN时进入LAST_ACK状态,但未收到主动连接方的ack确认,需要被动连接方重新发送一个FIN,而为什么是2MSL,一般认为丢失ack在…...

6.Pandas 数据可视化图-1
第三章 数据可视化 文章目录 目录 第三章 数据可视化 文章目录 前言 一、数据可视化 二、使用步骤 1.pyplot 1.1引入库 1.2 设置汉字字体 1.3 数据准备 1.4 设置索引列 编辑 1.5 调用绘图函数 2.使用seaborn绘图 2.1 安装导入seaborn 2.2 设置背景风格 2.3 调用绘图方法 2.…...

软件功能测试报告都包含哪些内容?
软件功能测试报告是软件开发生命周期中的重要文档,主要涵盖以下关键内容: 1.测试概况:概述测试目标、范围和方法,确保读者对测试背景有清晰了解。 2.测试环境:详细描述测试所用的硬件、软件环境,确保…...

在Vue或React项目中使用Tailwind CSS实现暗黑模式切换:从系统适配到手动控制
在现代Web开发中,暗黑模式(Dark Mode)已成为提升用户体验的重要功能。本文将带你使用Tailwind CSS在React项目(Vue项目类似)中实现两种暗黑模式控制方式: 系统自动适配 - 根据用户设备偏好自动切换手动切换 - 通过按钮让用户自由选择 一、项目准备 使…...

Linux--命令行参数和环境变量
1.命令行参数 Linux 命令行参数基础 1.1参数格式 位置参数:无符号,按顺序传递(如 ls /home/user 中 /home/user 是位置参数) 选项参数: 短选项:以 - 开头,单个字母(如 -l 表示长格…...
Android 集成 Firebase 指南
Firebase 是 Google 提供的一套移动开发平台,包含分析、认证、数据库、消息推送等多种服务。以下是在 Android 应用中集成 Firebase 的详细步骤: 1. 准备工作 安装 Android Studio - 确保使用最新版本 创建或打开 Android 项目 - 项目需要配置正确的包…...

springboot线上教学平台
摘要:在社会快速发展的影响下,使线上教学平台的管理和运营比过去十年更加理性化。依照这一现实为基础,设计一个快捷而又方便的网上线上教学平台系统是一项十分重要并且有价值的事情。对于传统的线上教学平台控制模型来说,网上线上…...
阿里云 Linux 搭建邮件系统全流程及常见问题解决
阿里云 Linux 搭建 [conkl.com]邮件系统全流程及常见问题解决 目录 阿里云 Linux 搭建 [conkl.com]邮件系统全流程及常见问题解决一、前期准备(关键配置需重点检查)1.1 服务器与域名准备1.2 系统初始化(必做操作) 二、核心组件安装…...
【Elasticsearch】映射:fielddata 详解
映射:fielddata 详解 1.fielddata 是什么2.fielddata 的工作原理3.主要用法3.1 启用 fielddata(通常在 text 字段上)3.2 监控 fielddata 使用情况3.3 清除 fielddata 缓存 4.使用场景示例示例 1:对 text 字段进行聚合示例 2&#…...
用Python训练自动驾驶神经网络:从零开始驾驭未来之路
用Python训练自动驾驶神经网络:从零开始驾驭未来之路 哈喽,朋友们!我是Echo_Wish,今天咱们聊点超酷的话题——自动驾驶中的神经网络训练,用Python怎么玩转起来? 说实话,自动驾驶一直是科技圈的香饽饽,为什么?因为它承载了未来交通的无限可能:减少事故、提升效率、节…...
【电路】阻抗匹配
📝 阻抗匹配 一、什么是阻抗匹配? 阻抗匹配(Impedance Matching)是指在电子系统中,为了实现最大功率传输或最小信号反射,使信号源、传输线与负载之间的阻抗达到一种“匹配”状态的技术。 研究对象&#x…...

mariadb5.5.56在centos7.6环境安装
mariadb5.5.56在centos7.6环境安装 1 下载安装包 https://mariadb.org/mariadb/all-releases/#5-5 2 上传安装包的服务器 mariadb-5.5.56-linux-systemd-x86_64.tar.gz 3 解压安装包 tar -zxvf mariadb-5.5.56-linux-systemd-x86_64.tar.gz mv mariadb-5.5.56-linux-syst…...
MySQL 索引失效:六大场景与原理剖析
我们都熟知索引是优化 MySQL 查询性能的利器。但你是否遇到过这样的困境:明明在表上建立了索引,查询却依然缓慢,EXPLAIN 分析后发现索引并未被使用?这就是所谓的“索引失效”。 索引失效并非一个 Bug,而是 MySQL 查询…...

打造你的 Android 图像编辑器:深入解析 PhotoEditor 开源库
📸 什么是 PhotoEditor? PhotoEditor 是一个专为 Android 平台设计的开源图像编辑库,旨在为开发者提供简单易用的图像编辑功能。它支持绘图、添加文本、应用滤镜、插入表情符号和贴纸等功能,类似于 Instagram 的编辑体验。该库采…...
DeepSeek 终章:破局之路,未来已来
目录 一、DeepSeek 技术发展现状回顾二、未来发展趋势2.1 多模态融合的拓展2.2 模型可解释性的强化2.3 垂直领域的深化应用 三、面临的技术挑战3.1 数据隐私与安全难题3.2 算法偏见与公平性困境3.3 网络攻击与恶意利用威胁 四、挑战应对策略探讨4.1 技术层面的解决方案4.2 算法…...
八:操作系统设备管理之缓冲、缓存与假脱机
弥合鸿沟:操作系统中的缓冲、缓存与假脱机技术深度解析 在计算机系统的世界里,存在着一个根本性的速度差异:中央处理器(CPU)的执行速度飞快,而输入/输出(I/O)设备(如硬盘…...

Azure 虚拟机端口资源:专用 IP 和公共 IP Azure Machine Learning 计算实例BUG
## 报错无解 找不到Azure ML 计算实例关联的 NSG .env 文件和 ufw status: .env 文件中 EXPOSE_NGINX_PORT8080 是正确的,它告诉 docker-compose.yaml 将 Nginx 暴露在宿主机的 8080 端口。 sudo ufw status 显示 Status: inactive,意味着宿…...

Java核心技术-卷I-读书笔记(第十二版)
第一章 Java程序设计概述 09年sun被oracle收购->11年java7(简单改进)->14年java8(函数式编程)->2017年java9->2018年java11->2021年java17 第二章 Java编程环境 Java9后新增JShell,提供类似脚本试执…...
从C到C++语法过度1
从C到C语法过度1 文章目录 从C到C语法过度11. 字符串string2. 引用3. 类型转换3.1 新式转换 const_cast3.2 新式转换 static_cast 4. 关键字auto 1. 字符串string C语言从本质上来说,是没有字符串这种类型的,在C语言中如果要表达字符串,只能…...
AI是如何换装的?
AI换装是一种基于计算机视觉、深度学习和生成对抗网络(GAN)的技术,能够通过算法自动识别人像并更换服饰,实现虚拟换装的效果。这项技术广泛应用于电商服装试穿、虚拟偶像、影视特效、社交媒体滤镜等领域。 AI换装的核心技术 1. 图像分割与人体解析 换装的第一步是图像分…...

MATLAB遍历生成20到1000个节点的无线通信网络拓扑推理数据
功能: 遍历生成20到1000个节点的无线通信网络拓扑推理数据,包括网络拓扑和每个节点发射的电磁信号,采样率1MHz/3000,信号时长5.7s,单帧数据波形为实采 数据生成效果: 拓扑及空间位置: 节点电磁…...
python爬虫:grequests的详细使用(基于gevent和requests的异步HTTP请求库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、grequests 概述1.1 grequests 介绍1.2 注意事项1.3 替代方案比较1.4 基本组件1.5 grequests 安装二、基本用法2.1 创建请求任务2.2 发送请求并获取响应2.3 带参数的请求三、高级用法3.1 自定义回调函数3.2 设置超时…...
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
在使用PHP连接MySQL数据库时,可能会遇到连接失败和写锁问题。这类问题可能会影响应用的正常运行,本文将详细介绍排查和解决这些问题的方法。 一、PHP连接MySQL数据库失败 1. 排查连接失败的常见原因 数据库配置错误: 检查数据库主机、用户名…...