当前位置: 首页 > 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 配置,当然是在…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...