常用的辅助类2(StringBuilder、StringBuffer、处理时间相关的类、对象比较器)
Java知识点总结:想看的可以从这里进入
目录
- 7.7、字符串相关类
- 7.8、时间处理
- 7.8.1、JDK8前
- 7.8.2、JDK8后
- 1、时间日期类
- 2、格式化日期
- 3、其他
- 7.9、对象比较器
7.7、字符串相关类
-
String:JDK1.0出现,字符串类,被final修饰其值不可改。实现了Serializable和Comparable接口,可支持序列化和可以比较大小;创建后栈中保存一个地址的引用,每次改变的值都是重新分配一个新的内存地址赋值,而不是在原有的地址内修改。
-
StringBuilder:JDK 5.0出现,字符串类,其值可修改,线程不安全,但是速度最快。
-
StringBuffer:JDK1.0:JDK1.0出现,字符串类,其值可修改,线程安全,速度相对StringBuilder慢。
//三种构造方法 StringBuffer():初始容量为16的字符串缓冲区 StringBuffer(int size):构造指定容量的字符串缓冲区 StringBuffer(String str):将内容初始化为指定字符串内容
当三者作为方法参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。
StringBuilder和StringBuffder的底层是一个字符数组,根据无参构造创建后的可扩容长度为16个字符(接受字符串的构造长度为字符串长度+16、也可指定初始长度),

如果添加字符串过程中超出数组范围,就会对底层数组进行扩容,首先创建一个新的数组大小为原来的2倍加2,将原数组中的内容复制到新数组中,再将指针指向新创建的数组地址。
-
jdk16以前的扩容方法:
-
jdk16以后的扩容方法
StringBuilder和StringBuffder提供的方法基本类似:
StringBuilder和StringBuffder常用方法:
1、增:拼接字符串 .append("").append("").....;
2、删:删除指定范围的内容[start,end) .delete(int start,int end)
3、改:替换指定范围的内容[start,end) .replace(int start, int end, String str)修改指定索引处的字符:public void setCharAt(int n ,char ch)
4、插:在指定位置插入指定的内容 .insert(int offset, "")
5、查:获取指定索引处的字符 public char charAt(int n )
6、返回指定子字符串在当前字符串中第一次出现处的索引:public int indexOf(String str)
7、截取字符串[start,end):public String substring(int start,int end)
8、返回字符串的长度:public int length()
9、把当前字符序列逆转:.reverse()
对比一下使用String和StringBuilder在速度上的区别
计算一下追加 100,000,0次字符所用的时间
-
使用String
public static void main(String[] args) {long start = System.currentTimeMillis();String str = "";for(int i=0; i<1000000; i++){str += 1;}long end = System.currentTimeMillis();System.out.printf("使用String用时:%d",end-start); }
-
换成StringBuilder
public static void main(String[] args) {long start = System.currentTimeMillis();StringBuilder builder = new StringBuilder();for(int i=0; i<1000000; i++){builder.append(1);}long end = System.currentTimeMillis();System.out.printf("使用StringBuilder用时:%d",end-start); }
-
使用StringBuffder
public static void main(String[] args) {long start = System.currentTimeMillis();StringBuffer buffer = new StringBuffer();for(int i=0; i<1000000; i++){buffer.append(1);}long end = System.currentTimeMillis();System.out.printf("使用StringBuffer用时:%d",end-start); }
从上面可以明显的看出来使用String的时候相比较后两种速度慢的不是一点半点的,而是很多倍的差距了,而StringBuilder相比较StringBuffder也快了一些。
7.8、时间处理
7.8.1、JDK8前
-
计算时间差:
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。通常用来计算某个程序的运行时间,进行快慢的对比
-
java.util.Date类
-
SimpleDateFormat类
-
Calendar类
Calendar类中常用的常量字段如下:
常量字段 说明 Calendar.ERA get和set的字段号,表示纪元,只能为0或1。0表示BC(“before Christ”,即公元前);1表示AD(拉丁语“Anno Domini”,即公元)。 Calendar.YEAR 用于get和set的字段号,表示年份 Calendar.MONTH 用于get和set的字段号,表示月份,0表示1月,1表示2月……… Calendar.WEEK_OF_YEAR` 用于get和set的字段号,一年中的星期数,即本年中第几个星期 Calendar.WEEK_OF_MONTH 用于get和set的字段号,当前月中的星期数,即本月中第几个星期 Calendar.DAY_OF_YEAR 用于get和set的字段号,一年中第几天 Calendar.DAY_OF_WEEK 用于get和set的字段号,一周中第几天,注意,周日是1,周一是2,… Calendar.DAY_OF_WEEK_IN_MONTH get和set的字段号,表示当前月份中的星期几 Calendar.DATE 用于get和set的字段号,一月中第几天,同DAY_OF_MONTH的值是一样的 Calendar.HOUR 小时(12小时制) Calendar.AM_PM 用于get和set的字段号,用于指示HOUR是在中午之前还是在中午之后。在中午12点之前返回0,在中午12点(包括12点)之后返回1 Calendar.HOUR_OF_DAY 一天中第几个小时(24小时制) Calendar.MINUTE 分钟 Calendar.SECOND 秒 Calendar.MILLISECOND 毫秒 AY_OF_MONTH 一月中第几天 Calendar.DAY_OF_WEEK_IN_MONTH 当前月中的第几个星期 Calendar.JANUARY 1月 Calendar.FEBRUARY 2月 Calendar.MARCH 3月 Calendar.APRIL 4月 Calendar.MAY 5月 Calendar.JUNE 6月 Calendar.JULY 7月 Calendar.AUGUST 8月 Calendar.SEPTEMBER 9月 Calendar.OCTOBER 10月 Calendar.NOVEMBER 11月 Calendar.DECEMBER 12月 public static void main(String[] args) throws ParseException {Calendar calendar = Calendar.getInstance();//查看是公元前(0)还是公元后(1)System.out.println("判断公元:"+calendar.get(Calendar.ERA));//获取月份:返回值+1System.out.println("获取月份:"+calendar.get(Calendar.MONTH));//将年份设置为1999calendar.set(Calendar.YEAR,1999);System.out.println("修改年份为1999:"+calendar.get(Calendar.YEAR));//将年份+1calendar.add(Calendar.YEAR,1);System.out.println("将年份+1:"+calendar.get(Calendar.YEAR));//返回Date格式日期System.out.println("获取date格式日期:"+calendar.getTime());//设置时间calendar.setTime(new Date("Tue Feb 08 18:29:23 CST 2222"));System.out.println("设置时间:"+calendar.getTime());; }
7.8.2、JDK8后
1、时间日期类
在JDK8以前,不论是Date类、还是Calendar类,都不是特别好用,所以时期时间问题一直都是一个让人头疼的问题。所以在JDK8中第三次引入了关于日期时间的API,新的 java.time 中包含了关于本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间()、时区(ZonedDateTime)和持续时间(Duration)的类。而在 Date 类中新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。

2、格式化日期
java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:
-
预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
-
本地化相关的格式。
-
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss“)
//时间
LocalDateTime dateTime2 = LocalDateTime.of(1999, 12, 2, 12, 22, 22);
System.out.println(dateTime2);
//第一种格式化
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
String format1 = dateTimeFormatter1.format(dateTime2);
System.out.println(format1);
//第二种格式化
DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
String format2 = dateTimeFormatter2.format(dateTime2);
System.out.println(format2);
//第三种格式化
DateTimeFormatter dateTimeFormatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String format3 = dateTimeFormatter3.format(dateTime2);
System.out.println(format3);
3、其他
-
ZoneId:包含了所有的时区信息
-
ZonedDateTime:根据时区获取时间
-
Cloc:使用时区提供对当前即时、日期和时间的访问的时钟。
-
TemporalAdjuster :时间校正器。
-
Period:用于计算两个日期的间隔
-
Duration:计算两个时间的间隔
7.9、对象比较器
在Java中经常会涉及到对象排序问题(比如买东西时,可以选择根据价格排序),这就会涉及到对象之间的比较,Java实现对象排序的方式有两种:
-
自然排序:java.lang.Comparable接口,可以对实现它的每个类的对象进行整体排序。默认从小到大。
像String、包装类等等都实现Comparable接口,其中字符的比较是Unicode值,数值是直接比较数值。数组、对象列表可以通过Collections.sort 或Arrays.sort进行自动排序
我们自定义的类也可以实现Comparable接口,重写compareTo(Object obj)方法,写明比较的规则。
- 类实现Comparable接口
- 实现接口的compareTo(Object obj) 方法,通过此方法对比两个对象的大小(如果当前对象this大于形参对象,则返回正整数,如果当前对象this小于形参对象,则返回负整数,如果当前对象this等于形参对象,则返回零。)
-
定制排序:java.util.Comparator接口,当没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序,强行对多个对象进行整体排序的比较。
重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
-
首先使用匿名内部类的形式创建 Comparator 对象,然后重写compare方法
-
将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。
-
相关文章:

常用的辅助类2(StringBuilder、StringBuffer、处理时间相关的类、对象比较器)
Java知识点总结:想看的可以从这里进入 目录7.7、字符串相关类7.8、时间处理7.8.1、JDK8前7.8.2、JDK8后1、时间日期类2、格式化日期3、其他7.9、对象比较器7.7、字符串相关类 String:JDK1.0出现,字符串类,被final修饰其值不可改。…...

anaconda下pytorchCPU GUP安装及问题记录
1 pytorch安装(CPU版本) pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2 torchvision、torchaudio、torchtext安装:解决ModuleNotFoundError: No module named ‘torchvision‘问题 (…...
香港中文大学MISC Lab GNN团队: 异质图神经网络研究进展从谱的角度看待(图)对比学习(图自监督学习)
简介 实验室简介 香港中文大学机器智能与社会计算实验室(MISC Lab, Machine Intelligence and Social Computing Lab) 由Prof. Irwin King 创建并不断发展, 在图学习,推荐系统,自然语言处理,机器学习等领域取得了卓越的研究成果。在图学习方面, MISC Lab关注异质图学习(Het…...
C#开发的OpenRA的Enumerable.Concat方法应用
C#开发的OpenRA的Enumerable.Concat方法应用 在OpenRA游戏里,可以让用户指定搜索目录,也可以搜索应用程序所在的目录。 还需要把这两个结果集连接到一起,那么它是怎么实现的呢? 它是采用了Enumerable.Concat方法,实现两个列表的结果集进行合并。 可以看一下这个函数的代码…...
前端知识点总结(自参)
BFC 块级格式化上下文。BFC元素不会影响到其它环境中的布局。 触发BFC的条件 根元素或其它包含它的元素浮动元素 (元素的 float 不是 none)绝对定位元素 (元素具有 position 为 absolute 或 fixed)内联块 (元素具有 display: inline-block)表格单元格 (元素具有 display: tabl…...
[ 靶场环境片 ] kali-linux采用Docker 搭建 pikachu(特别详细)
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末…...

阿里6面,成功唬住面试官拿了27K,软件测试面试也没有传说中那么难吧....
阿里的面试挺独特,每轮面试都没有 HR 约时间,一般是晚上 8 点左右面试官来一个电话,问是否能面试,能的话开始面,不能就约一个其它时间。 全程 6 面,前五面技术面,电话面试,最后一面…...

为什么静默安装未经过数字签名的驱动是不可行的?
我想,在 Windows XP 系统上,造成蓝屏的最主要原因是带有 Bug 的设备驱动程序。 请问在座的,谁赞成,谁反对。 因为驱动运行在内核模式,再也没有更高级别的组件对其进行行为监管,它可以做它想做的任何事情。…...

Caused by: java.sql.SQLException: ORA-28040: 没有匹配的验证协议
更改Oracle的配置文件:Oracle -> app -> ... ->...dbhome... -> admin重启Oracle:重启Oracle数据库的操作步骤1.查看监听器状态:lsnrctl status2.停止监听器:lsnrctl stop3.连接数据库:sqlplus / as sysdba4.停止数据…...

Dubbo3简单使用
Dubbo3简单使用 👉 使用Spring Boot实现Dubbo3,请参见以下地址。 # Dubbo3官网地址 https://cn.dubbo.apache.org/zh/# 使用SpringBoot实现Dubbo3的地址 https://cn.dubbo.apache.org/zh/docs3-v2/java-sdk/quick-start/spring-boot/# 该项目的git地址…...

Redis未授权漏洞蜜罐模拟与捕获分析
1.概述 文章主要分析Redis未授权漏洞的原理及形成原因,使用vulhub靶场进行漏洞复现,在了解漏洞原理并复现的基础上使用golang编写蜜罐代码进行模拟,开放端口在网上捕获真实存在的恶意攻击行为,对恶意样本进行分析,总结…...

Spring Security Oauth2.0认证授权
基本概念认证: 用户认证就是判断一个用户的身份是否合法的过程 ,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机…...

安卓小游戏:贪吃蛇
安卓小游戏:贪吃蛇 前言 这个是通过自定义View实现小游戏的第二篇,实际上第一篇做起来麻烦点,后面的基本就是照葫芦画瓢了,只要设计下游戏逻辑就行了,技术上不难,想法比较重要。 需求 贪吃蛇࿰…...

CUDA中的图内存节点
CUDA中的图内存节点 文章目录CUDA中的图内存节点1. 简介2. 支持的架构和版本3. API基础知识3.1. 图节点 APIs3.2. 流捕获3.3. 在分配图之外访问和释放图内存3.4. cudaGraphInstantiateFlagAutoFreeOnLaunch4. 优化内存复用4.1. 解决图中的重用问题4.2. 物理内存管理和共享5. 性…...

你真的看好低代码开发吗?
低代码开发前景如何,大家真的看好低代码开发吗?之前有过很多关于低代码的内容,这篇就来梳理下国内外低代码开发平台发展现状及前景。 01、国外低代码开发平台现状 2014年,研究机构Forrester Research发表的报告中提到“面向客户…...

一篇带你MySQL运维
1. 日志 1.1 错误日志 错误日志是 MySQL 中 重要的日志之一,它记录了当 mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&…...

《嵌入式 – GD32开发实战指南》第22章 SPI
开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 22.1 SPI简介 SPI,是Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的…...

一个优质软件测试工程师的简历应该有的样子(答应我一定要收藏起来)
个人简历 基本信息 姓 名:xxx 性 别: 女 年 龄:24 现住 地址: 深圳 测试 经验:3年 学 历:本科 联系 电话:18xxxxxxxx 邮 箱:xxxxl163.com 求职意向 应聘岗位:软件…...

C++ 浅谈之 STL Deque
C 浅谈之 STL Deque HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是 C 浅谈系列,收录在专栏 C 语言中 😜😜😜 本系列阿呆将记录一些 C 语言重要的语法特性 🏃&a…...

Koa2-项目中的基本应用
文章目录安装配置koa2配置nodemon,热更新我们的项目中间件什么是中间件👻洋葱模型路由中间件连接数据库 - mysql后端允许跨域处理请求getpostputdelete后续会继续更新安装配置koa2 👻安装 koa2 npm i koa2 -s👻在package.json 配置,当然是在…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...

《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

如何做好一份技术文档?从规划到实践的完整指南
如何做好一份技术文档?从规划到实践的完整指南 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递
在 C 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。 在开始之前,先提出几个问题&…...

设备健康管理的范式革命:中讯烛龙全链路智能守护系统
当工业设备的“亚健康”状态导致隐性产能损失高达23%时,中讯烛龙推出 “感知-诊断-决策-闭环”四位一体解决方案,让设备全生命周期健康管理成为企业增长的隐形引擎。 一、行业痛点:传统运维的三大断层 1. 健康感知盲区 某风电场因无法捕…...