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

常用的辅助类2(StringBuilder、StringBuffer、处理时间相关的类、对象比较器)

Java知识点总结:想看的可以从这里进入

目录

      • 7.7、字符串相关类
      • 7.8、时间处理
        • 7.8.1、JDK8前
        • 7.8.2、JDK8后
          • 1、时间日期类
          • 2、格式化日期
          • 3、其他
      • 7.9、对象比较器

7.7、字符串相关类

  1. String:JDK1.0出现,字符串类,被final修饰其值不可改。实现了Serializable和Comparable接口,可支持序列化和可以比较大小;创建后栈中保存一个地址的引用,每次改变的值都是重新分配一个新的内存地址赋值,而不是在原有的地址内修改。

  2. StringBuilder:JDK 5.0出现,字符串类,其值可修改,线程不安全,但是速度最快。

  3. StringBuffer:JDK1.0:JDK1.0出现,字符串类,其值可修改,线程安全,速度相对StringBuilder慢。

    //三种构造方法
    StringBuffer():初始容量为16的字符串缓冲区
    StringBuffer(int size):构造指定容量的字符串缓冲区
    StringBuffer(String str):将内容初始化为指定字符串内容
    

当三者作为方法参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。

StringBuilder和StringBuffder的底层是一个字符数组,根据无参构造创建后的可扩容长度为16个字符(接受字符串的构造长度为字符串长度+16、也可指定初始长度),

image-20230207201907695

如果添加字符串过程中超出数组范围,就会对底层数组进行扩容,首先创建一个新的数组大小为原来的2倍加2,将原数组中的内容复制到新数组中,再将指针指向新创建的数组地址。

  1. jdk16以前的扩容方法:

    image-20230208162243203
  2. jdk16以后的扩容方法

    image-20230208162256706

StringBuilder和StringBuffder提供的方法基本类似:

StringBuilderStringBuffder常用方法:
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次字符所用的时间

  1. 使用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);
    }
    
    image-20220226160636737
  2. 换成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);
    }
    
    image-20220226160742055
  3. 使用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);
    }
    
    image-20220226160914216

从上面可以明显的看出来使用String的时候相比较后两种速度慢的不是一点半点的,而是很多倍的差距了,而StringBuilder相比较StringBuffder也快了一些。

7.8、时间处理

7.8.1、JDK8前

  1. 计算时间差:

    System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。通常用来计算某个程序的运行时间,进行快慢的对比

    image-20230208165114161
  2. java.util.Date类

    image-20230208165852223 image-20230208170328080
  3. SimpleDateFormat类

    image-20230208174253255 image-20230208174323519
  4. Calendar类

    image-20230208183255047

    Calendar类中常用的常量字段如下:

    常量字段说明
    Calendar.ERAget和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_MONTHget和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.JANUARY1月
    Calendar.FEBRUARY2月
    Calendar.MARCH3月
    Calendar.APRIL4月
    Calendar.MAY5月
    Calendar.JUNE6月
    Calendar.JULY7月
    Calendar.AUGUST8月
    Calendar.SEPTEMBER9月
    Calendar.OCTOBER10月
    Calendar.NOVEMBER11月
    Calendar.DECEMBER12月
    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());;
    }
    
    image-20230208183334281

7.8.2、JDK8后

1、时间日期类

在JDK8以前,不论是Date类、还是Calendar类,都不是特别好用,所以时期时间问题一直都是一个让人头疼的问题。所以在JDK8中第三次引入了关于日期时间的API,新的 java.time 中包含了关于本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间()、时区(ZonedDateTime)和持续时间(Duration)的类。而在 Date 类中新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。

image-20230208190423351

image-20230208190507078

2、格式化日期

java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:

  1. 预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME

    image-20230209095915704
  2. 本地化相关的格式。

    image-20230209101559398 image-20230209095643942
  3. 自定义的格式。如: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);

image-20230209101748401

3、其他
  1. ZoneId:包含了所有的时区信息

    image-20230209102625646
  2. ZonedDateTime:根据时区获取时间

    image-20230209102742064
  3. Cloc:使用时区提供对当前即时、日期和时间的访问的时钟。

  4. TemporalAdjuster :时间校正器。

  5. Period:用于计算两个日期的间隔

  6. Duration:计算两个时间的间隔

7.9、对象比较器

在Java中经常会涉及到对象排序问题(比如买东西时,可以选择根据价格排序),这就会涉及到对象之间的比较,Java实现对象排序的方式有两种:

  1. 自然排序:java.lang.Comparable接口,可以对实现它的每个类的对象进行整体排序。默认从小到大。

    像String、包装类等等都实现Comparable接口,其中字符的比较是Unicode值,数值是直接比较数值。数组、对象列表可以通过Collections.sort 或Arrays.sort进行自动排序

    image-20230209104345503

    image-20230209195346962

    我们自定义的类也可以实现Comparable接口,重写compareTo(Object obj)方法,写明比较的规则。

    1. 类实现Comparable接口
    2. 实现接口的compareTo(Object obj) 方法,通过此方法对比两个对象的大小(如果当前对象this大于形参对象,则返回正整数,如果当前对象this小于形参对象,则返回负整数,如果当前对象this等于形参对象,则返回零。)
  2. 定制排序:java.util.Comparator接口,当没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序,强行对多个对象进行整体排序的比较。

    重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。

    1. 首先使用匿名内部类的形式创建 Comparator 对象,然后重写compare方法

      image-20230209201040765
    2. 将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。

      image-20230209201316104

相关文章:

常用的辅助类2(StringBuilder、StringBuffer、处理时间相关的类、对象比较器)

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

anaconda下pytorchCPU GUP安装及问题记录

1 pytorch安装&#xff08;CPU版本&#xff09; pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2 torchvision、torchaudio、torchtext安装&#xff1a;解决ModuleNotFoundError: No module named ‘torchvision‘问题 &#xff08…...

香港中文大学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,软件测试面试也没有传说中那么难吧....

阿里的面试挺独特&#xff0c;每轮面试都没有 HR 约时间&#xff0c;一般是晚上 8 点左右面试官来一个电话&#xff0c;问是否能面试&#xff0c;能的话开始面&#xff0c;不能就约一个其它时间。 全程 6 面&#xff0c;前五面技术面&#xff0c;电话面试&#xff0c;最后一面…...

为什么静默安装未经过数字签名的驱动是不可行的?

我想&#xff0c;在 Windows XP 系统上&#xff0c;造成蓝屏的最主要原因是带有 Bug 的设备驱动程序。 请问在座的&#xff0c;谁赞成&#xff0c;谁反对。 因为驱动运行在内核模式&#xff0c;再也没有更高级别的组件对其进行行为监管&#xff0c;它可以做它想做的任何事情。…...

Caused by: java.sql.SQLException: ORA-28040: 没有匹配的验证协议

更改Oracle的配置文件&#xff1a;Oracle -> app -> ... ->...dbhome... -> admin重启Oracle:重启Oracle数据库的操作步骤1.查看监听器状态&#xff1a;lsnrctl status2.停止监听器&#xff1a;lsnrctl stop3.连接数据库&#xff1a;sqlplus / as sysdba4.停止数据…...

Dubbo3简单使用

Dubbo3简单使用 &#x1f449; 使用Spring Boot实现Dubbo3&#xff0c;请参见以下地址。 # 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未授权漏洞的原理及形成原因&#xff0c;使用vulhub靶场进行漏洞复现&#xff0c;在了解漏洞原理并复现的基础上使用golang编写蜜罐代码进行模拟&#xff0c;开放端口在网上捕获真实存在的恶意攻击行为&#xff0c;对恶意样本进行分析&#xff0c;总结…...

Spring Security Oauth2.0认证授权

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

安卓小游戏:贪吃蛇

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

CUDA中的图内存节点

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

你真的看好低代码开发吗?

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

一篇带你MySQL运维

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

《嵌入式 – GD32开发实战指南》第22章 SPI

开发环境&#xff1a; MDK&#xff1a;Keil 5.30 开发板&#xff1a;GD32F207I-EVAL MCU&#xff1a;GD32F207IK 22.1 SPI简介 SPI&#xff0c;是Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的…...

一个优质软件测试工程师的简历应该有的样子(答应我一定要收藏起来)

个人简历 基本信息 姓 名&#xff1a;xxx 性 别&#xff1a; 女 年 龄&#xff1a;24 现住 地址&#xff1a; 深圳 测试 经验&#xff1a;3年 学 历&#xff1a;本科 联系 电话&#xff1a;18xxxxxxxx 邮 箱&#xff1a;xxxxl163.com 求职意向 应聘岗位&#xff1a;软件…...

C++ 浅谈之 STL Deque

C 浅谈之 STL Deque HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是 C 浅谈系列&#xff0c;收录在专栏 C 语言中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些 C 语言重要的语法特性 &#x1f3c3;&a…...

Koa2-项目中的基本应用

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

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...