java常用类(上)
笔上得来终觉浅,绝知此事要躬行
🔥 个人主页:星云爱编程
🔥 所属专栏:javase
🌷追光的人,终会万丈光芒
🎉欢迎大家点赞👍评论📝收藏⭐文章
![]()
目录
一、包装类
1.1包装类的分类
1.2包装类和基本数据的转换
1.3案例
1.4Integer创建机制
1.5Integer比较问题
二、String
2.1基本介绍
2.2 String对象的创建方式
创建机制理解:
2.3 String比较问题
2.4字符串特性
2.4.1介绍
2.4.2总结:
2.4.3例题:
2.5 String常用方法
三、StringBuffer
3.1基本介绍
3.2StringBuffer比较String
3.3StringBuffer的构造器
3.4String和StringBuffer相互转换
3.5 StringBuffer类常见方法
四、StringBuilder
4.1基本介绍
4.2 StringBuilder常用方法
4.3 String、StringBuffer、StringBuilder的比较
4.4 String、StringBuffer、StringBuilder的使用选择
结语
一、包装类(Wrapper)
1.1包装类的分类
说明:
(1)针对八种基本类型定义相应的引用类型--包装类。
(2)有了类的特点,就可以调用类中的方法
基本数据类型 | 包装类 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
1.2包装类和基本数据的转换
(1)jdk5前的手动装箱和拆箱方式,装箱:基本类型->包装类型,反之拆箱。
(2)jdk5以后(含jdk5)的自动装箱和自动拆箱方式。
(3)自动装箱底层调用的是valueOf方法,例如:Integer.valueOf()
1.3案例
public class Test1 {public static void main(String[] args) {int n=10;//手动装箱 int->IntegerInteger x=Integer.valueOf(n);//手动拆箱 Integer->intint y=x.intValue();//自动装箱int a=20; //底层调用的是 Integer.valueOf(20);Integer integer=a;//自动拆箱int a2=integer; //底层调用的是 intValue()方法}
}
1.4Integer创建机制
请看如下代码,试着输出运行结果
public class Test2 {public static void main(String[] args) {Integer s1=new Integer(10);Integer s2=new Integer(10);System.out.println( s1==s2 );Integer n1=100;Integer n2=100;System.out.println( n1==n2 );Integer m1=128;Integer m2=128;System.out.println( m1==m2 );}
}
运行结果:false true false。
解释:
(1)对于第一种创建方式new Integer() 因为new在堆上开辟了新的空间,s1和s2是两个不同的对象,==对于引用数据类型比较的是地址,故为false.
(2)第二种创建方式
源码:
这里的cache是一个存储器,Integer类里把-128到127范围内的数字全部创建了一个对象存在cache了,所以装箱的时候在这个范围的话直接返回存储器里的对象了,不用每次都new新的堆空间。
对于n1、n2在-128~127范围内,没有开辟新的空间,故其相等;而对于m1、m2不在-128~127范围内,需要new一个空间,是两个不同的对象,故为false。
1.5Integer比较问题
public static void main(String[] args) {Integer n1=129;int n2=129;Integer n3=129;System.out.println(n1==n2);System.out.println(n1==n3);}
结论:
(1)只要有基本数据类型int,比较的就是数值,否则为空间地址。
(2)对于Integer integer=int 装箱方式,int在-128~127范围内不会new新空间,否则将会new新空间。
(3)==比较引用数据类型比较的是空间地址是否相等。
二、String
2.1基本介绍
(1)String对象用于保存字符串,也就是一组字符序列
(2)字符串常量对象是用双引号括起来的字符序列;
(3)字符串的字符使用Unicode字符编码,一个字符(不分字母还是汉字)占两个字节;
(4)String类的构造方法很多;
(5)String类实现了接口Serializable,即String可以串行化:可以在网络传输;
String类实现了接口Comparable,即String对象可以比较大小。
(6)String是final类,不能被其他的类继承
(7)String有属性 private final char value[],用于存放字符串内容,同时,value是一个final类型的属性,不可以被修改。
2.2 String对象的创建方式
方式一:直接赋值
String str1="hello";
方式二:调用构造器
String str2=new String("hello")
创建机制理解:
方式一:先从常量池查看是否有"hello"数据空间,如果有,直接指向;如果没有,则重新创建,然后指向最终的常量池的空间,str1最终指向的是常量池中的地址
方式二:先在堆中创建空间,里面维护了value属性,指向常量池的"hello"数据空间,如果常量池也没有“hello”,则重新创建;如果有,直接通过value指向,str2最终指向的是堆中的空间的地址。
2.3 String比较问题
补充知识点:
(1)当调用intern方法时,如果池已经包含与equals(Object)
方法确定的相当于此String
对象的字符串,则返回来自池的字符串。 否则,此String
对象将添加到池中,并返回对此String
对象的引用。即str.intern()最终返回的是常量池的地址。
(2)String类中的equals方法是重写过的,比较的是值。其源码如下:
例题:
public static void main(String[] args) {String str1="hello";String str2=new String("hello");System.out.println(str1==str2);System.out.println(str1.equals(str2));System.out.println(str1==str2.intern());System.out.println(str2==str2.intern());}
答案为 false true true false
2.4字符串特性
2.4.1介绍
(1)String是一个final类,代表不可变的字符序列。
(2)字符串是不可变的,一个字符串对象一旦分配,其内容是不可变的。
请看如下代码,试问其分别创建了几个对象?
①
String str="hello";str="world";
创建了两个对象:hello、world
②
String str="hello"+"world";
创建了一个对象:helloworld;
解释:String str="hello"+"world"编译时在底层优化等价于String str="helloworld"。
③
String a="hello";
String b="world";
String c=a+b;
创建了3个对象,其执行流程为:
2.4.2总结:
String str1="ab"+"cd;常量相加,看的是常量池;
String str2=a+b;变量相加,是在堆中
2.4.3例题:
把运行结果发到评论区
public class Test6 {public static void main(String[] args) {A a = new A();a.exchange(a.str,a.ch);System.out.print(a.str+" and ");System.out.println(a.ch);}
}class A{String str="hello";final char[] ch={'j','a','v','a'};public void exchange(String str,char[]ch){str="abc";ch[0]='z';}
}
2.5 String常用方法
①equals:区分大小写,判断内容是否相等
②equalsIgnoreCase:忽略大小写,判断内容是否相等
③length:获取字符的个数,字符串长度
④indexOf:获取字符在字符串中第一次出现的索引(下标),索引从0开始,如果找不到,返回-1
⑤lastIndexOf:获取字符在字符串中最后一次出现的索引(下标),索引从0开始,如果找不到,返回-1
⑥subString:截取指定范围的字符串
⑦trim:去前后空格
⑧charAt:获取某所引出的字符,注意不能使用Str[index]这种方式
⑨replace:替换字符串中的字符
⑩compareTo:比较两个字符串的大小
⑪toCharArray:将字符串转换为字符数组
⑫format:格式字符串,%s字符串,%c字符,%d整形,%f浮点型
⑬split:分割字符串,对于某些分割字符,我们要转义,例如:\ ->\\
在使用String类方法时,有看不懂的,建议看源码(ctrl+左键进入源码)
三、StringBuffer
3.1基本介绍
(1)java.lang.StringBuffer代表可变的字符串序列,可以对字符串内容进行增删
(2)StringBuffer是个容器。
(3)很多方法与String相同,但StringBuffer是可变长度的。
3.2StringBuffer比较String
(1)String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上是更改地址,效率较低
(2)StringBuffer保存的是字符串常量,里面的值可以更改,每次StringBuffer的更新实际上可以更改内容,不用每次更新地址,效率较高。
3.3StringBuffer的构造器
(1)StringBuffer()
构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符
(2)StringBuffer(CharSequence seq)
构造一个字符串缓冲区,它包含与指定的CharSequence相同的字符
(3)StringBuffer(int capacity)
构造一个不带字符,但具有指定初始容量的字符串缓冲区,即对char[]大小进行指定
(4)StringBuffer(String str)
构造一个字符缓冲区,并将其内容初始化为指定的字符串内容
3.4String和StringBuffer相互转换
(1)String->StringBuffer
①使用构造器
String str="hello";
StringBuffer sb=new StringBuffer(str);
②使用append方法
String str="hello";
StringBuffer sb=new StringBuffer();
sb=sb.append(str);
(2)StringBuffer->String
①使用StringBuffer提供的toString方法
StringBuffer sb=new StringBuffer("hello");
String str=sb.toString();
②使用构造器
StringBuffer sb=new StringBuffer("hello");
String str=new String(sb);
3.5 StringBuffer类常见方法
①append:拼接追加字符串
②delete:删除指定字符串
③replace(start ,end,String):将start~end间的内容替换掉,不含end,即[start,end)。
④indexOf:查找子串在字符串第一次出现的索引,索引从0开始,找不到返回-1
⑤insert:在指定位置插入字符串
⑥length:获取字符的个数,字符串长度
四、StringBuilder
4.1基本介绍
(1)StringBuilder的直接父类是AbstractStringBuilder,StringBuilder实现了Serializable接口,即StringBulider的对象可以串行化;在父类中AbstractStringBuilder有属性char[]value,不是final类型,该value数组存放字符串内容,引出存放在堆中的。
(2)StringBuffer是一个final类,不能被继承
(3)因为StringBuffer字符内容是存在char[]value,所以在变化(增加/删除) 时,不用每次都更换地址(即不是每次创建新对象),所以效率高于String。
(4)StringBuilder是一个可变的字符序列,提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder线程不安全),该类被设计用作StringBuffer的一个简单替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先使用该类,现实中,它比StringBuffer快
(5)在StringBuilder上的主要操作是append和insert方法,可重载这些方法,以接受任意类型数据。
(6)StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,因此在单线程的情况下使用
4.2 StringBuilder常用方法
StringBuilder有与StringBuffer兼容的API,可以往看StringBuffer类常见方法
4.3 String、StringBuffer、StringBuilder的比较
(1)StringBuffer和StringBuilder非常类似,均代表可变的字符序列,而且方法也一样。
(2)String是不可变字符序列,效率低,但是复用率高
(3)StringBuffer是可变字符序列,效率较高(增删),线程安全
(4)StringBuilder是可变字符序列,效率最高,线程不安全。
(5)String使用注意事项
String s="a";
s+="b;
执行上诉代码时,原来的"a"已经丢弃了,现在又产生了一个字符串s+"b"(也就是ab);
如果多次执行这些改变字符串内容的操作,会导致大量副本字符串对象留在内存中,减低效率,如果这样的操作放到循环中,会极大影响程序的性能。所以,如果我们对String做大量修改时,不要使用String.
4.4 String、StringBuffer、StringBuilder的使用选择
(1)如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder;
(2)如果字符串存在大量的修改操作,并在单线程的情况下,使用StringBuilder;
(3)如果字符串存在大量的修改操作,并在多线程的情况下,使用StringBuffer;
(4)如果字符串存在少量的修改操作,并被多个对象引用,使用String。
结语
感谢您的耐心阅读,希望这篇博客能够为您带来新的视角和启发。如果您觉得内容有价值,不妨动动手指,给个赞👍,让更多的朋友看到。同时,点击关注🔔,不错过我们的每一次精彩分享。若想随时回顾这些知识点,别忘了收藏⭐,让知识触手可及。您的支持是我们前进的动力,期待与您在下一次分享中相遇!
路漫漫其修远兮,吾将上下而求索。
相关文章:

java常用类(上)
笔上得来终觉浅,绝知此事要躬行 🔥 个人主页:星云爱编程 🔥 所属专栏:javase 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 一、包装类 1.1包装类…...
包管理工具npm、yarn、pnpm、cnpm详解
1. 包管理工具 1.1 npm # 安装 $ node 自带 npm# 基本用法 npm install package # 安装包 npm install # 安装所有依赖 npm install -g package # 全局安装 npm uninstall package # 卸载包 npm update package # 更新包 npm run script #…...

CI/CD是什么?
CI/CD 定义 CI/CD 代表持续集成和持续部署(或持续交付)。它是一套实践和工具,旨在通过自动化构建、测试和部署来改进软件开发流程,使您能够更快、更可靠地交付代码更改。 持续集成 (CI):在共享存储库中自动构建、测试…...
[Java]合理封装第三方工具包(附视频)
-1.视频链接 视频版: 视频版会对本文章内容进行详细解释 [Java]合理封装第三方工具包_哔哩哔哩_bilibili 0.核心思想 对第三方工具方法进行封装,使其本地化,降低记忆和使用成本 1.背景 在我们的项目中,通常会引用一些第三方工具包,或者是使用jdk自带的一些工具类 例如: c…...

常规配置、整合IDEA
目录 Redis常规配置 tcp-keepalive security Jedis RedisTemplate 连接池技术 Lua脚本 Jedis集群 Redis应用问题&解决方案 缓存穿透 缓存击穿 缓存雪崩 分布式锁 Redis实现分布式锁 Redis新功能 ACL Redis常规配置 tcp-keepalive security redis.conf中…...

用Python写炸金花游戏
文章目录 **代码分解与讲解**1. **扑克牌的生成与洗牌**2. **给玩家发牌**3. **打印玩家的手牌**4. **定义牌的优先级**5. **判断牌型**6. **确定牌型优先级**7. **比较两手牌的大小**8. **计算每个玩家的牌型并找出赢家**9. **打印结果** 完整代码 以下游戏规则: 那…...

计算机的错误计算(一百九十二)
摘要 用两个大模型计算 csc(0.999), 其中,0.999是以弧度为单位的角度,结果保留5位有效数字。两个大模型均给出了 Python代码与答案。但是,答案是错误的。 例1. 计算 csc(0.999), 其中,0.999是以弧度为单位的角度,结…...
37 Opencv SIFT 特征检测
文章目录 Ptr<SIFT> SIFT::create示例 Ptr SIFT::create Ptr<SIFT> SIFT::create(int nfeatures 0,int nOctaveLayers 3,double contrastThreshold 0.04,double edgeThreshold 10,double sigma 1.6 );参数说明:nfeatures:类型&#x…...

Nginx界的天花板-Oracle 中间件OHS 11g服务器环境搭建
环境信息 服务器基本信息 如下表,本次安装总共使用2台服务器,具体信息如下: 服务器IP DNS F5配置 OHS1 172.xx.xx.xx ohs01.xxxxxx.com ohs.xxxxxx.com OHS2 172.xx.xx.xx ohs02.xxxxxx.com 服务器用户角色信息均为:…...
域名解析协议
一、DNS简述 DNS协议是一种应用层协议,用于将域名转换为对应的IP地址,使得客户端可以通过域名来访问Internet上的各种资源 DNS的基础设施是由分层的DNS服务器实现的分布式数据库,它运行在UDP之上,通常使用端口号53 DN…...

微信小程序给外面的view设置display:flex;后为什么无法给里面的view设置宽度
如果父盒子view设置了display:flex,子view设置宽度值无效,宽度值都是随着内容多少而改变: 问题视图: 原因: flex布局元素的子元素,自动获得了flex-shrink的属性 解决方法: 给子view增加:fl…...
Maven怎么会出现一个dependency-reduced-pom.xml的文件
问题 今天打包时突然发现,多出了一个名为dependency-reduced-pom.xml的文件 解决方法 由于使用了maven-shade-plugin插件导致的,在 <plugin> 标签下添加 <configuration><createDependencyReducedPom>false</createDependencyR…...

突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除
GitLab停止为中国大陆、香港和澳门地区提供服务,要求用户在60天内迁移账号,否则将被删除。这一事件即将引起广泛的关注和讨论。以下是对该事件的扩展信息: 1. 背景介绍:GitLab是一家全球知名的软件开发平台,提供代码托…...

自学记录HarmonyOS Next DRM API 13:构建安全的数字内容保护系统
在完成了HarmonyOS Camera API的开发之后,我开始关注更复杂的系统级功能。在浏览HarmonyOS Next文档时,我发现了一个非常有趣的领域:数字版权管理(DRM)。最新的DRM API 13提供了强大的工具,用于保护数字内容…...
Vue 3 + Element Plus 实现文件上传组件:详细解析与实现指南
Vue 3 文件上传组件实现详解 在实际的前端开发中,文件上传是一个常见的需求,尤其是在需要处理文档、图片或其他类型文件的应用中。Vue 3 结合 Element Plus UI 组件库为我们提供了一个简单且灵活的文件上传解决方案。在这篇文章中,我们将详细…...

qt5.12.11+msvc编译器编译qoci驱动
1.之前编译过minGW编译器编译qoci驱动,很顺利就完成了,文章地址:minGW编译qoci驱动详解,今天按照之前的步骤使用msvc编译器进行编译,直接就报错了: 查了些资料,发现两个编译器在编译时,pro文件中引用的库不一样,下面是msvc编译器引用的库,其中编译引用的库我这里安装…...
Ubuntu 20.04 安装 LNMP
1. 更新系统 sudo apt update sudo apt upgrade2. 安装 Nginx sudo apt install nginx3. 安装 MariaDB (作为 MySQL 的替代) sudo apt install mariadb-server mariadb-client初始化 MariaDB 数据库(可选) sudo mysql_secure_installation4. 安装 PH…...

Llama 3 简介(一)
目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练(Over-training) 3. 计算训练预算 4. 如何逐步估算和确定最优模型? 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…...

在 CentOS 上安装 FFmpeg
在CentOS 上安装 FFmpeg 方法一:在线安装 添加 EPEL 和 RPM Fusion 源: sudo yum install epel-release sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm安装 FFmpeg: sudo yu…...
Python------Pandas的数据结构
Pandas主要处理以下三个数据结构: 序列(Series) 数据帧(DataFrame) 面板(Panel) 数据结构维数描述序列11维结构,值可变,大小不变数据帧22维结构,值可变,大小可变,表结构面板3维标记,值可变…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...