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

Java常用类(二)

好久不见,因工作原因,好久没发文了,OldWang 回来了,持续更新Java内容!

    • ⭐ 不可变和可变字符序列使用陷阱
    • ⭐ 时间处理相关类
      • ⭐ Date 时间类(java.util.Date)
      • ⭐ DateFormat 类和 SimpleDateFormat 类
      • ⭐ Calendar 日历类

⭐ 不可变和可变字符序列使用陷阱

在这里插入图片描述

● String 使用的陷阱

String 一经初始化后,就不会再改变其内容了。对 String 字符串的操作实际上是对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。
比如:
String s =“a”; 创建了一个字符串
s = s+“b”; 实际上原来的"a"字符串对象已经丢弃了,现在又产生了另一个字符串s+“b”(也就是"ab")。 如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的时间和空间性能,甚至会造成服务器的崩溃。

相反,StringBuilder 和 StringBuffer 类是对原字符串本身操作的,可以对字符串进行修改而不产生副本拷贝或者产生少量的副本。因此可以在循环中使用。

【示例】String 和 StringBuilder 在字符串频繁修改时的效率测试

public class Test {public static void main(String[ ] args) {/**使用 String 进行字符串的拼接*/String str8 = "";long num1 = Runtime.getRuntime().freeMemory();//获取系统剩余内存空间long time1 = System.currentTimeMillis();//获取系统的当前时间for (int i = 0; i < 5000; i++) {str8 = str8 + i;//相当于产生了 5000 个对象}long num2 = Runtime.getRuntime().freeMemory();long time2 = System.currentTimeMillis();System.out.println("String 占用内存 : " + (num1 - num2));System.out.println("String 占用时间 : " + (time2 - time1));/**使用 StringBuilder 进行字符串的拼接*/StringBuilder sb1 = new StringBuilder("");long num3 = Runtime.getRuntime().freeMemory();long time3 = System.currentTimeMillis();for (int i = 0; i < 5000; i++) {sb1.append(i);}long num4 = Runtime.getRuntime().freeMemory();long time4 = System.currentTimeMillis();System.out.println("StringBuilder 占用内存 : " + (num3 - num4));System.out.println("StringBuilder 占用时间 : " + (time4 - time3));}
}

执行结果如图所示:
在这里插入图片描述

⭐ 时间处理相关类

在这里插入图片描述

“时间如流水,一去不复返”,时间是一维的。所以,我们需要一把刻度尺来表达和度
量时间。在计算机世界,我们把 1970 年 1 月 1 日 00:00:00 定为基准时间,每个度量单位是毫秒(1 秒的千分之一),如图所示。
在这里插入图片描述
我们用 long 类型的变量来表示时间,从基准时间前后几亿年都能表示。
这个“时刻数值”是所有时间类的核心值,年月日都是根据这个“数值”计算出来的。

我们工作学习涉及的时间相关类有如下这些:
在这里插入图片描述

⭐ Date 时间类(java.util.Date)

在标准 Java 类库中包含一个 Date 类。它的对象表示一个特定的瞬间,精确到毫秒。

🐟	Date() 分配一个 Date 对象,并初始化此对象为系统当前的日期和时间,可以精确到毫秒)。
🐟	Date(long date) 分配 Date 对象并初始化此对象,以表示自从标准基准时间以来的毫秒数。
🐟	boolean equals(Object obj) 比较两个日期的相等性。
🐟	long getTime() 返回毫秒数。
🐟	String toString() 把此 Date 对象转换为以下形式的 String:dow mon dd hh:mm:ss zzz yyyy 其中:dow 是一周中的某一天 。

【示例】Date 类的使用

	long nowNum = System.currentTimeMillis(); //当前时刻对应的毫秒数Date d = new Date(); //当前时刻的对象System.out.println(d.getTime()); //返回时间对应的毫秒数Date d2 = new Date(1000L * 3600 * 24 * 365 * 150); //距离 1970年 150 年System.out.println(d2);

⭐ DateFormat 类和 SimpleDateFormat 类

在这里插入图片描述

● DateFormat 类的作用

把时间对象转化成指定格式的字符串。反之,把指定格式的字符串转化成时间对象。
DateFormat 是一个抽象类,一般使用它的的子类 SimpleDateFormat 类来实现。

【示例】DateFormat 类和 SimpleDateFormat 类的使用

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class TestDateFormat {public static void main(String[ ] args) throws ParseException {// new 出 SimpleDateFormat 对象SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd");// 将时间对象转换成字符串String daytime = s1.format(new Date());System.out.println(daytime);System.out.println(s2.format(new Date()));System.out.println(new SimpleDateFormat("hh:mm:ss").format(new Date()));// 将符合指定格式的字符串转成成时间对象.字符串格式需要和指定格式一致。String time = "2049-10-1";Date date = s2.parse(time);System.out.println("date1: " + date);time = "2049-10-1 20:15:30";date = s1.parse(time);System.out.println("date2: " + date);}
}

代码中的格式化字符的具体含义见表

字母日期或时间元素表示示例
GEra 标志符TextAD
yYear1996;96
M年中的月份MonthJuly;july;07
w年中的周数Number27
W月份中的周数Number2
D年中的天数Number189
d月份中的天数Number10
F月份中的星期Number2
E星期中的天数TextTuesday;Tue
aAm/pm 标记TextPM
H一天中的小时数(0-23)Number0
k一天中的小时数(1-24)Number24
Kam/pm 中的小时数(0-11)Number0
ham/pm 中的小时数(1-12)Number12
m小时中的分钟数Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zonePacific Standard Time; PST; GMT-08:00
Z时区RFC 822 time zone0800

时间格式字符也可以为我们提供其他的便利。比如:获得当前时间是今年的第几天。

【示例】获取今天时本年度第几天

import java.text.SimpleDateFormat;
import java.util.Date;public class TestDateFormat2 {public static void main(String[ ] args) {SimpleDateFormat s1 = new SimpleDateFormat("D");String daytime = s1.format(new Date());System.out.println(daytime);}
}

执行结果如图所示:
在这里插入图片描述

⭐ Calendar 日历类

在这里插入图片描述

Calendar 类是一个抽象类,为我们提供了关于日期计算的功能,比如:年、月、日、时、分、秒的展示和计算。

GregorianCalendar 是 Calendar 的子类,表示公历。

Notice!!!
注意月份的表示,一月是 0,二月是 1,以此类推,12 月是 11。 
因为大多数人习惯于使用单词而不是使用数字来表示月份,这样程序也许更易读,父类 Calendar 使用常量来表示月份:JANUARY、FEBRUARY 等等。

【示例】GregorianCalendar 类和 Calendar 类的使用

import java.util.*;public class TestCalendar {public static void main(String[ ] args) {// 得到相关日期元素GregorianCalendar calendar = new GregorianCalendar(2049, 9, 1, 22, 10, 50);int year = calendar.get(Calendar.YEAR); // 打印:2049int month = calendar.get(Calendar.MONTH); // 打印:9int day = calendar.get(Calendar.DAY_OF_MONTH); // 打印:1int day2 = calendar.get(Calendar.DATE); // 打印:1// 日:Calendar.DATE 和 Calendar.DAY_OF_MONTH 同义int date = calendar.get(Calendar.DAY_OF_WEEK); // 打印:1// 星期几 这里是:1-7.周日是 1,周一是 2,。。。周六是 7System.out.println(year);System.out.println(month);System.out.println(day);System.out.println(day2);System.out.println(date);// 设置日期GregorianCalendar calendar2 = new GregorianCalendar();calendar2.set(Calendar.YEAR, 2049);calendar2.set(Calendar.MONTH, Calendar.OCTOBER); // 月份数:0-11calendar2.set(Calendar.DATE, 1);calendar2.set(Calendar.HOUR_OF_DAY, 10);calendar2.set(Calendar.MINUTE, 20);calendar2.set(Calendar.SECOND, 23);printCalendar(calendar2);// 日期计算GregorianCalendar calendar3 = new GregorianCalendar(2049, 9, 1, 22, 10, 50);calendar3.add(Calendar.MONTH, -7); // 月份减 7calendar3.add(Calendar.DATE, 7); // 增加 7 天printCalendar(calendar3);// 日历对象和时间对象转化Date d = calendar3.getTime();GregorianCalendar calendar4 = new GregorianCalendar();calendar4.setTime(new Date());}static void printCalendar(Calendar calendar) {int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH) + 1;int day = calendar.get(Calendar.DAY_OF_MONTH);int date = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 星期几String week = "" + ((date == 0) ? "日" : date);int hour = calendar.get(Calendar.HOUR);int minute = calendar.get(Calendar.MINUTE);int second = calendar.get(Calendar.SECOND);System.out.printf("%d 年%d 月%d 日,星期%s %d:%d:%d\n", year, month, day, week, hour, minute, second);}
}

在此祝大家中秋快乐,我们下期再见!

相关文章:

Java常用类(二)

好久不见&#xff0c;因工作原因&#xff0c;好久没发文了&#xff0c;OldWang 回来了&#xff0c;持续更新Java内容&#xff01;⭐ 不可变和可变字符序列使用陷阱⭐ 时间处理相关类⭐ Date 时间类(java.util.Date)⭐ DateFormat 类和 SimpleDateFormat 类⭐ Calendar 日历类 ⭐…...

Java获取给定月份的前N个月份和前N个季度

描述&#xff1a; 在项目开发过程中&#xff0c;遇到这样一个需求&#xff0c;即&#xff1a;给定某一月份&#xff0c;得到该月份前面的几个月份以及前面的几个季度。例如&#xff1a;给定2023-09&#xff0c;获取该月份前面的前3个月&#xff0c;即2023-08、2023-07、2023-0…...

网页资源加载过程

网页资源加载是指在浏览器中访问一个网页时&#xff0c;浏览器如何获取和显示网页内容的过程。这个过程通常分为以下几个步骤&#xff1a; DNS 解析&#xff1a; 当用户在浏览器中输入一个网址&#xff08;例如&#xff0c;https://www.example.com&#xff09;&#xff0c;浏览…...

使用git config --global设置用户名和邮件,以及git config的全局和局部配置

文章目录 1. 文章引言2. 全局配置2.1 命令方式2.2 配置文件方式 3. 局部配置3.1 命令方式3.2 配置文件方式 4. 总结 1. 文章引言 我们为什么要设置设置用户名和邮件&#xff1f; 我们在注册github&#xff0c;gitlab等时&#xff0c;一般使用用户名或邮箱&#xff1a; 这个用户…...

【C语言】21-指针-3

目录 1. 指针数组1.1 什么是指针数组1.2 如何定义指针数组1.3 如何使用指针数组2. 多重指针2.1 二重指针的定义2.2 二重指针的初始化与赋值2.3 二重指针的使用3. 指针常量、常量指针、指向常量的常指针3.1 概念3.2 const pointer3.3 pointer to a constant3.3.1 (pointer to a …...

解决craco启动react项目卡死在Starting the development server的问题

现象&#xff1a; 原因&#xff1a;craco.config.ts配置文件有问题 经过排查发现Dev开发模式下不能有splitChunk的配置&#xff0c; 解决办法&#xff1a; 加一个生产模式的判断&#xff0c;开发模式不加载splitChunk的配置&#xff0c;仅在生产模式才加载 判断条件代码&#…...

常见的密码学算法都有哪些?

密码学算法是用于保护信息安全的数学方法和技术。它们可以分为多个类别&#xff0c;包括对称加密、非对称加密、哈希函数和数字签名等。以下是一些常见的密码学算法&#xff1a; 1、对称加密算法&#xff1a; AES&#xff08;高级加密标准&#xff09;&#xff1a;一种广泛使…...

云安全【阿里云ECS攻防】

关于VPC的概念还请看&#xff1a;记录一下弹性计算云服务的一些词汇概念 - 火线 Zone-安全攻防社区 一、初始化访问 1、元数据 1.1、SSRF导致读取元数据 如果管理员给ECS配置了RAM角色&#xff0c;那么就可以获得临时凭证 如果配置RAM角色 在获取ram临时凭证的时候&#xff…...

TBSS数据分析

tbss分析基本流程&#xff1a; 步骤一&#xff0c;指标解算&#xff1a;求解出FA&#xff0c;MD&#xff0c;AD&#xff0c;RD指标 #!/bin/bash #基于体素的形态学分析VBA path/media/kui/Passport5T/DATA_help/TBSS/row_data mkdir ${path}/Results_DTI_tbss mkdir ${path}/R…...

【单调队列】 239. 滑动窗口最大值

239. 滑动窗口最大值 解题思路 计算每一个滑动窗口的最大值 关键在于借助单调队列实现窗口对于单调队列 尾部添加元素 头部删除元素添加元素操作&#xff1a;从尾部开始循环对比 删除比当前元素小的元素获取最大值元素 直接获取头部元素删除元素操作 直接删除头部元素 class…...

Spring实例化源码解析之ComponentScanAnnotationParser(四)

上一章我们分析了ConfigurationClassParser&#xff0c;配置类的解析源码分析。在ComponentScans和ComponentScan注解修饰的候选配置类的解析过程中&#xff0c;我们需要深入的了解一下ComponentScanAnnotationParser的parse执行流程&#xff0c;SpringBoot启动类为什么这么写&…...

MySQL - 外键(foreign key)约束的作用和使用

什么是外键约束&#xff1f; 外键&#xff1a;用来让两张表的数据之间建立连接&#xff0c;从而保证数据的一致性和完整性。 外键约束是用于建立两个表之间关系的一种约束&#xff0c;它定义了一个表中的列与另一个表中的列之间的关系。外键约束可以保证数据的完整性和一致性…...

前端开发之服务器的基本概念与初识Ajax

1&#xff0c;服务器的基本概念与初识Ajax 1.1 URL地址的组成部分 1.2 客户端与服务器的通信过程 1.3 网页中如何请求数据 1.4 $.get()函数 1.4.1 $.get()函数的语法 // jQuery 中 $.get() 函数的功能单一&#xff0c;专门用来发起 get 请求&#xff0c;从而将服务器上的资源…...

数据结构排序算法---八大排序复杂度及代码实现

文章目录 一、冒泡排序代码实现 二、直接插入排序代码实现 三、希尔排序代码实现 四、选择排序代码实现 五、堆排序代码实现 六、快速排序代码实现 七、归并排序代码实现 八、计数排序代码实现 稳定性&#xff1a;相同的数据排序后&#xff0c;相对位置是否发生改变 一、冒泡排…...

GMS之Launcher中去除默认Search或替换为Chrome Search

将Launcher中搜索框去除 将FeatureFlags.java文件中的QSB_ON_FIRST_SCREEN变量修改为false \system\vendor\mediatek\proprietary\packages\apps\Launcher3\src\com\android\launcher3\config\FeatureFlags.java/*** Defines a set of flags used to control various launche…...

@DateTimeFormat 和 @JsonFormat 的详细研究

关于这两个时间转化注解&#xff0c;先说结论 一、介绍 1、DateTimeFormat DateTimeFormat 并不会根据得到其属性 pattern 把前端传入的数据转换成自己想要的格式&#xff0c;而是将前端的String类型数据封装到Date类型&#xff1b;其次它的 pattern 属性是用来规范前端传入…...

nodejs基于Vue.js健身体育器材用品商城购物网97794

管理员端的功能主要是开放给系统的管理人员使用&#xff0c;能够对用户的信息进行管理&#xff0c;包括对用户、健身器材、器材类型、系统和订单进行查看&#xff0c;修改和删除、新增等&#xff0c;对系统整体运行情况进行了解。用户的功能主要是对个人账号和密码进行更新信息…...

C#WPF框架Microsoft.Toolkit.MvvM应用实例

本文实例演示C#WPF框架Microsoft.Toolkit.MvvM应用 目录 一、MVVM概述 二、MVVMLight概述 三、使用Microsoft.Toolkit.Mvvm框架 一、MVVM概述 MVVM概述MVVM是Model-View-ViewModel的简写,主要目的是为了解耦视图(View)和模型(Model)。...

蓝桥杯每日一题2023.9.27

4408. 李白打酒加强版 - AcWing题库 题目描述 题目分析 对于这题我们发现有三个变量&#xff0c;店&#xff0c;花&#xff0c;酒的数量&#xff0c;对于这种范围我们使用DP来进行分析。 dp[i][j][k]我们表示有i个店&#xff0c;j朵花&#xff0c;k单位酒的集合&#xff0c…...

Redis与分布式-主从复制

接上文 常用中间件-OAuth2 1.主从复制 启动两个redis服务器。 修改第一个服务器地址 修改第二个redis 然后分别启动 redis-server.exe redis.windows.conf) 查看当前服务器的主从状态&#xff0c;打开客户端&#xff1a;输入info replication命令来查看当前的主从状态&am…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...