常用的辅助类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 配置,当然是在…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,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 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

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

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...