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

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)有了类的特点,就可以调用类中的方法

基本数据类型包装类
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble

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 );参数说明&#xff1a;nfeatures&#xff1a;类型&#x…...

Nginx界的天花板-Oracle 中间件OHS 11g服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用2台服务器&#xff0c;具体信息如下&#xff1a; 服务器IP DNS F5配置 OHS1 172.xx.xx.xx ohs01.xxxxxx.com ohs.xxxxxx.com OHS2 172.xx.xx.xx ohs02.xxxxxx.com 服务器用户角色信息均为&#xff1a;…...

域名解析协议

一、DNS简述 ‌DNS协议是一种应用层协议&#xff0c;用于将域名转换为对应的IP地址‌&#xff0c;使得客户端可以通过域名来访问Internet上的各种资源‌ DNS的基础设施是由分层的DNS服务器实现的分布式数据库&#xff0c;它运行在UDP之上‌&#xff0c;通常使用端口号53‌ DN…...

微信小程序给外面的view设置display:flex;后为什么无法给里面的view设置宽度

如果父盒子view设置了display:flex&#xff0c;子view设置宽度值无效&#xff0c;宽度值都是随着内容多少而改变&#xff1a; 问题视图&#xff1a; 原因&#xff1a; flex布局元素的子元素&#xff0c;自动获得了flex-shrink的属性 解决方法&#xff1a; 给子view增加:fl…...

Maven怎么会出现一个dependency-reduced-pom.xml的文件

问题 今天打包时突然发现&#xff0c;多出了一个名为dependency-reduced-pom.xml的文件 解决方法 由于使用了maven-shade-plugin插件导致的&#xff0c;在 <plugin> 标签下添加 <configuration><createDependencyReducedPom>false</createDependencyR…...

突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除

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

自学记录HarmonyOS Next DRM API 13:构建安全的数字内容保护系统

在完成了HarmonyOS Camera API的开发之后&#xff0c;我开始关注更复杂的系统级功能。在浏览HarmonyOS Next文档时&#xff0c;我发现了一个非常有趣的领域&#xff1a;数字版权管理&#xff08;DRM&#xff09;。最新的DRM API 13提供了强大的工具&#xff0c;用于保护数字内容…...

Vue 3 + Element Plus 实现文件上传组件:详细解析与实现指南

Vue 3 文件上传组件实现详解 在实际的前端开发中&#xff0c;文件上传是一个常见的需求&#xff0c;尤其是在需要处理文档、图片或其他类型文件的应用中。Vue 3 结合 Element Plus UI 组件库为我们提供了一个简单且灵活的文件上传解决方案。在这篇文章中&#xff0c;我们将详细…...

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 数据库&#xff08;可选&#xff09; sudo mysql_secure_installation4. 安装 PH…...

Llama 3 简介(一)

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

在 CentOS 上安装 FFmpeg

在CentOS 上安装 FFmpeg 方法一&#xff1a;在线安装 添加 EPEL 和 RPM Fusion 源&#xff1a; sudo yum install epel-release sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm安装 FFmpeg&#xff1a; sudo yu…...

Python------Pandas的数据结构

Pandas主要处理以下三个数据结构&#xff1a; 序列(Series) 数据帧(DataFrame) 面板(Panel) 数据结构维数描述序列11维结构&#xff0c;值可变&#xff0c;大小不变数据帧22维结构&#xff0c;值可变&#xff0c;大小可变&#xff0c;表结构面板3维标记&#xff0c;值可变…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

有限自动机到正规文法转换器v1.0

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

力扣热题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》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...