Java_认识String类

C 语言中已经涉及到字符串了,但是在 C 语言中要表示字符串只能使用字符数组或者字符指针,
可以使用标准库提 供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开
的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java 语言专门提供了 String

目录

一、 常用方法

1.1 构造方法

1.2 字符串比较

1.2.1 == 比较是否引用同一个对象

1.2.2 boolean equals(按照字典序比较 )

1.2.3 int compareTo(String s) 方法: 按照字典序进行比较

1.2.4 int compareToIgnoreCase(String str)

1.3 字符串查找

1.4 转化

1.4.1 数值和字符串转化

1.4.2 大小写转换

1.4.3 字符串转数组 

1.4.4 格式化

1.5 字符串替换 

1.6 字符串拆分

1.7 字符串截取

1.8 其他操作方法

1.9 字符串的不可变性

二、StringBuilder和StringBuffer

2.1 StringBuilder的介绍


一、 常用方法

1.1 构造方法

String 类提供的构造方式非常多,常用的有以下三种

public static void main(String[] args) {String s1 = "hello world!";System.out.println(s1);//    直接常量串构造String s2 = new String("hellohellohello!");System.out.println(s2);//new一个char[] arr = {'h', 'e', 'l', 'l', 'o'};String s3 = new String(arr);System.out.println(s3);//    使用字符数组构造}

需要注意的是 String 是引用数据类型,内部并不存储字符串本身

Java “” 引起来的也是 String 类型对象。
 public static void main(String[] args) {System.out.println("hello".length());}

1.2 字符串比较

Java 中提供了4种比较方式

1.2.1 == 比较是否引用同一个对象

因为 String 属于引用数据类型,== 比较的是引用的地址

public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("hello");System.out.println(s1 == s2);}

1.2.2 boolean equals(按照字典序比较 )

String 类重写了父类 Object  equals 方法,Object  equals 默认按照 == 比较,String 重写

equals 方法

public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("hello");System.out.println(s1.equals(s2));}

1.2.3 int compareTo(String s) 方法: 按照字典序进行比较

String 类中实现了 Comparable 接口

实现了 compareTo 方法

比较方法类似于 C语言 中的 strcmp

先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
如果前 k 个字符相等 (k 为两个字符长度最小值 ) ,返回值两个字符串长度差值
 public static void main(String[] args) {String s1 = new String("helloa");String s2 = new String("hellob");String s3 = new String("hello123456");String s4 = new String("hello");System.out.println(s1.compareTo(s2));System.out.println("================");System.out.println(s3.compareTo(s4));}

1.2.4 int compareToIgnoreCase(String str)

compareTo方式相同,但是忽略大小写比较

   public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ABC");String s3 = new String("ABc");String s4 = new String("aBC");System.out.println(s1.compareToIgnoreCase(s2));System.out.println(s1.compareToIgnoreCase(s3));System.out.println(s1.compareToIgnoreCase(s4));}

1.3 字符串查找

String 类提供的常用查找的方法:
方法功能
char charAt(int index)
返回 index 位置上字符,如果 index 为负数或者越界,抛出 ndexOutOfBoundsException异常
int indexOf(int ch)
返回 ch 第一次出现的位置,没有返回 -1
int indexOf(int ch, int fromIndex)
fromIndex 位置开始找 ch 第一次出现的位置,没有返回 -1
int indexOf(String str)
返回 str 第一次出现的位置,没有返回 -1
int indexOf(String str, int fromIndex)
fromIndex 位置开始找 str 第一次出现的位置,没有返回 -1
int lastIndexOf(int ch)
从后往前找,返回 ch 第一次出现的位置,没有返回 -1
int lastIndexOf(int ch, int fromIndex)
fromIndex 位置开始找,从后往前找 ch 第一次出现的位置,没有返回-1
int lastIndexOf(String str)
从后往前找,返回 str 第一次出现的位置,没有返回 -1
int lastIndexOf(String str, int fromIndex)
fromIndex 位置开始找,从后往前找 str 第一次出现的位置,没有返回-1
注意:上述方法都是实例方法。
需要具体的对象去引用

1.4 转化

1.4.1 数值和字符串转化

数字转字符串可以使用 valueOf 方法

可以看到 valueOf 是重载方法 

 public static void main(String[] args) {String s1 = String.valueOf(123456);System.out.println(s1);String s2 = String.valueOf(521.2);System.out.println(s2);}

字符串转数字可以使用

Integer.parseInt
Double.parseDouble

 public static void main(String[] args) {String s1 = String.valueOf(123456);System.out.println(s1);String s2 = String.valueOf(521.2);System.out.println(s2);System.out.println("=============");int data1 = Integer.parseInt(s1);System.out.println(data1);double data2 = Double.parseDouble(s2);System.out.println(data2);}

1.4.2 大小写转换

 

toUpperCase 转大写

toLowerCase 转小写

 public static void main(String[] args) {String s1 = "abcdefg";String s2 = "ABCDEFG";System.out.println(s1.toUpperCase());System.out.println(s2.toLowerCase());}

1.4.3 字符串转数组 

可以使用 toCharArray 方法

 public static void main(String[] args) {String s1 = "abcdefg";char[] chars = s1.toCharArray();for (int i = 0; i < chars.length; i++) {System.out.println(chars[i]);}}

1.4.4 格式化

   public static void main(String[] args) {String s = String.format("%d-%d-%d", 1111, 1,11);System.out.println(s);}

1.5 字符串替换 

使用一个指定的新的字符串替换掉已有的字符串数据
方法
功能
String replaceAll(String regex, String replacement)
替换所有的指定内容
String replaceFirst(String regex, String replacement)
替换首个内容

public static void main(String[] args) {String str = "hello" ;System.out.println(str.replaceAll("l", "_"));System.out.println(str.replaceFirst("l", "_"));}

由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.

1.6 字符串拆分

方法功能
String[] split(String regex)
将字符串全部拆分
String[] split(String regex, int limit)
将字符串以指定的格式,拆分为 limit

public static void main(String[] args) {String str = "I love Java!";String[] strings = str.split(" ");for (String string:strings){System.out.println(string);}}

   public static void main(String[] args) {String str = "I love Java!";String[] strings = str.split(" ",2);for (String string:strings){System.out.println(string);}}

也会出现特殊情况

public static void main(String[] args) {String str = "123.456.789";String[] strings = str.split(".");for (String string:strings){System.out.println(string);}}

可以看到分割并没有成功

有些特殊字符作为分割符可能无法正确切分 , 需要加上转义
字符 "|" , "*",  "+"  都得加上转义字符
对于 split 这个方法来说 需要两个 \ 才能表示一个 \
   public static void main(String[] args) {String str = "123.456.789";String[] strings = str.split("\\.");for (String string:strings){System.out.println(string);}}

 而如果是 "\\" ,那么就得写成  "\\\\" 

 public static void main(String[] args) {String str = "123\\456\\789";String[] strings = str.split("\\\\");for (String string:strings){System.out.println(string);}}

 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

  public static void main(String[] args) {String str = "name=12age%15&11";String[] strings = str.split("=|%|&");for (String string:strings){System.out.println(string);}}

1.7 字符串截取

方法功能
String substring(int beginIndex)
从指定索引截取到结尾
String substring(int beginIndex, int endIndex)
截取部分内容
 public static void main(String[] args) {String str = "hello world!";System.out.println(str.substring(5));System.out.println(str.substring(0,5));}

 需要注意的是他的区间是左闭右开

substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标

1.8 其他操作方法

方法功能
String trim()
去掉字符串中的左右空格 , 保留中间空格
 public static void main(String[] args) {String str = " hello world! ";System.out.println(str);System.out.println(str.trim());}
trim 会去掉字符串开头和结尾的空白字符 ( 空格 , 换行 , 制表符等 )

1.9 字符串的不可变性

String  是一种不可变对象 . 字符串中的内容是不可改变.
上述所有操作都是在操作完成后产生一个新的对象
而非在字符串上进行修改
public static void main(String[] args) {String str = "hello world!";System.out.println(str.toUpperCase());System.out.println(str);}

String  类中的字符实际保存在内部维护的  value  字符数组中
同时  value 数组被 private 修饰 ,也没有提供 set 方法
那就无法拿到 value 这个引用
就不能对其中的内容进行修改
String 类被  final  修饰,表明该类不能被继承
 value 被修饰被 final  修饰,表明  value  自身的值不能改变,即不能引用其它字符数组,但是其引
用空间中的内容可以修改。
final  修饰类表明该类不想被继承, final  修饰引用类型表明该引用变量不能引用其他对象,但是其
用对象中的内 容是可以修改的

二、StringBuilderStringBuffer

由于 String 的不可更改特性,为了方便字符串的修改,Java中供 StringBuilder 和 StringBuffer 

类。

public static void main(String[] args) {String str = "hello";str += "world!";System.out.println(str);}

这里看一下这部分代码的底层是怎么执行的

可以看到

底层在执行这段代码的时候其实进行了多部操作

其实这里相当于是这么写

  public static void main(String[] args) {String str = "hello";StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(str);stringBuilder.append("world!");str = stringBuilder.toString();System.out.println(str);}

 这个过程中出现了 StringBuilder 

   public static void main(String[] args) {long start = System.currentTimeMillis();String s = "";for(int i = 0; i < 10000; ++i){s += i;}long end = System.currentTimeMillis();System.out.println("String:" + (end - start));start = System.currentTimeMillis();StringBuffer sbf = new StringBuffer("");for(int i = 0; i < 10000; ++i){sbf.append(i);}end = System.currentTimeMillis();System.out.println("StringBuffer:" + (end - start));start = System.currentTimeMillis();StringBuilder sbd = new StringBuilder();for(int i = 0; i < 10000; ++i){sbd.append(i);}end = System.currentTimeMillis();System.out.println("StringBuilder:" + (end - start));}

这这一段代码中循环都是个字符串进行拼接

不同的是分别使用 String StringBuffer StringBuilder

那么输出的是执行这一个过程需要的时间,单位是毫秒

可以看到

String 类的拼接效率远低于 StringBuffer StringBuilder

且 StringBuffer StringBuilder 之间的差距可以忽略不计

StringBuffer StringBuilder 拼接效率高的原因再与 append 方法

再看一下这个代码的底层是怎么执行的

此处对应的是

这个循环

可以看到的是每次进入循环都需要 new 一个对象

对应这个循环

可以看到的是他就不需要 new 对象了

String 类型就是因为要不停的创建对象销毁对象

造成效率低下

因此:尽量避免对 String 的直接需要,如果要修改建议尽量
使用  StringBuffer  或者  StringBuilder 
StringBufferappend 是一个线程安全的方法
同一时间只有一个线程能够执行这个方法
为了保证这个线程安全
所以会有一些资源的消耗
就导致时间会比 StringBuilder append 时间长

2.1 StringBuilder的介绍

StringBuilder  和  StringBuffer  类。这两个类大部分功能是相同的,这里介绍 StringBuilder  常用
的一些方法,
方法功能
StringBuff append(String str)
在尾部追加,相当于 String += ,可以追加: boolean char char[] 、 double、 float int long Object String StringBuff 的变量
char charAt(int index)
获取 index 位置的字符
int length()
获取字符串的长度
int capacity()
获取底层保存字符串空间总的大小
void ensureCapacity(int
mininmumCapacity)
扩容
void setCharAt(int index, char ch)
index 位置的字符设置为 ch
int indexOf(String str)
返回 str 第一次出现的位置
int indexOf(String str, int
fromIndex)
fromIndex 位置开始查找 str 第一次出现的位置
int lastIndexOf(String str)
返回最后一次出现 str 的位置
int lastIndexOf(String str, int fromIndex)
fromIndex 位置开始找 str 最后一次出现的位置
StringBuff insert(int
offset, String str)
offset 位置插入:八种基类类型 & String 类型 & Object 类型数据
StringBuffer
deleteCharAt(int index)
删除 index 位置字符
StringBuffer delete(int
start, int end)
删除 [start, end) 区间内的字符
StringBuffer replace(int
start, int end, String str)
[start, end) 位置的字符替换为 str
String substring(int start)
start 开始一直到末尾的字符以 String 的方式返回
String substring(int start, int end)
[start, end) 范围内的字符以 String 的方式返回
StringBuffer reverse()
反转字符串
String toString()
将所有字符按照 String 的方式返回
String  StringBuffer  StringBuilder  的区别
String  的内容不可修改, StringBuffer  与  StringBuilder  的内容可以修改 .
​​​​​​​
StringBuffer  与  StringBuilder  大部分功能是相似的
StringBuffer  采用同步处理,属于线程安全操作;而  StringBuilder  未采用同步处理,属于线程不
安​​​​​​​全操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】二维前缀和

1.题目 2.算法思路 和一维前缀和的方法类似&#xff0c;我们需要预处理一个求和矩阵&#xff0c;然后再求和。 下面是模板&#xff1a; 上面两张图片总结出来了两个公式&#xff0c;这是解决此类问题的关键。 3.代码 #include <iostream> using namespace std; #incl…

MSMG Toolkit深度Windows系统镜像文件个性定制!

MSMG Toolkit,这个听起来略显神秘的名字,在DIY电脑爱好者和系统管理员的圈子中却是大名鼎鼎。这是一款免费的系统定制工具,专为Windows操作系统量身定做,旨在帮助用户轻松移除不必要的系统组件、集成更新、添加驱动程序,以及实现无人值守安装等功能,让每一次系统安装都更…

第三方软件测试机构进行验收测试的好处分享,需多少时间和费用?

在软件开发过程中&#xff0c;软件验收测试是不可或缺的一环。那么&#xff0c;什么是软件验收测试呢?为什么建议选择第三方软件测试机构进行验收测试呢? 软件验收测试是指在软件开发完毕后&#xff0c;由测试人员基于软件需求规格说明书和软件设计文档等材料&#xff0c;对…

扩散模型--论文分享篇

定义&#xff1a;输入文本与图像&#xff0c;生成对图像的描述。 所采用的方法&#xff1a;对比学习、基于跨注意力机制的多模态融合 基于扩散模型的方法&#xff1a;主要介绍的扩散的原理 图像生成任务介绍 GAN VAE 扩散模型 基于GAN的图像生成&#xff0c;一个生成器与判别…

【重制版】Unity Meta Quest 一体机开发(一):前期准备,Meta XR SDK导入和环境配置,配置玩家物体

文章目录 &#x1f4d5;教程说明&#x1f4d5;Meta XR SDK 介绍&#x1f4d5;前期准备⭐开启开发者模式⚡在 Meta 官网申请开发者⚡在 Meta Quest 手机 APP 开启开发者 ⭐电脑需要下载的软件⚡Meta Quest Link&#xff08;以前叫做Oculus PC客户端&#xff09;⚡Oculus ADB Dri…

洗地机有哪些牌子比较好?洗地机排行榜十大品牌

随着洗地机市场竞争的日益激烈&#xff0c;市场上涌现出数百个品牌的产品&#xff0c;涵盖了从入门级到高端的各类价位和功能。这种多样化的选择一方面极大地满足了用户的不同需求&#xff0c;但另一方面也让消费者在挑选时面临一定的困扰。在众多种类的洗地机中&#xff0c;如…

MyBatisPlus学习笔记(二)

条件构造器&#xff1a; Wrapper的作用就是来封装我们当前的条件的 删除用的和查询用的一样&#xff1a;QueryWrapper 和 LambdaQueryWrapper MyBatis-Plus分页插件的配置和使用 Ctrl H 查看当前接口或者类的一个继承关系 Ctrl P 分页插件 乐观锁和悲观锁 通用枚举 代码…

LVGL移植到STM32 MCU平台详细经验笔记教程

1、前言 在之前的一篇文章LVGL在VSCode中安装模拟器&#xff0c;已经对LVGL进行了较为详细的介绍&#xff0c;本文将着重讲解如何移植适配LVGL&#xff0c;让这款图形化GUI库在STM32或其它类型的嵌入式MCU设备上运行起来。 LVGL在VScode中安装模拟器运行配置笔记教程_vscode …

利用Dify+Kimi免费使用Kimi的API接口的操作和使用方法

废话不多说&#xff0c;直接开整kimi-free-api项目。 1、kimi-free-api服务安装启动 支持高速流式输出、支持多轮对话、支持联网搜索、支持智能体对话、支持长文档解读、支持图像OCR&#xff0c;零配置部署&#xff0c;多路token支持&#xff0c;自动清理会话痕迹。 与ChatG…

一文了解知识中台:是什么、作用、如何搭建

在当今信息繁杂的时代&#xff0c;知识对于企业来说犹如宝藏般重要&#xff0c;而知识中台就是宝藏山的藏宝图。关于知识中台&#xff0c;你可能会感到好奇&#xff0c;它究竟是什么&#xff0c;有什么作用&#xff0c;又该如何搭建知识中台呢&#xff1f;接下来就让LookLook同…

MATLAB分类与判别模型算法:基于Fisher算法的分类程序【含Matlab源码 MX_002期】

算法思路介绍&#xff1a; 费舍尔线性判别分析&#xff08;Fishers Linear Discriminant Analysis&#xff0c;简称 LDA&#xff09;&#xff0c;用于将两个类别的数据点进行二分类。以下是代码的整体思路&#xff1a; 生成数据&#xff1a; 使用 randn 函数生成随机数&#x…

基于微信小程序开发的一款 高颜值在线答题刷题考试程序

大家好&#xff0c;我是兔兔。今天给大家分享的内容是&#xff0c;兔兔答题模板三的发布。 兔兔答题模板三是一款基于uniapp开发&#xff0c;后端使用PHP&#xff0c;前端使用图鸟UI的微信答题小程序应用程序。相必兔兔答题模板一和兔兔答题模板二&#xff0c;进行了系统架构的…

上位机图像处理和嵌入式模块部署(f103 mcu中main入口函数误解)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 学习stm32代码的时候&#xff0c;关于汇编文件&#xff0c;大家一般都会参考官方给出的汇编文件。通常情况下&#xff0c;不会自己去写汇编文件。特…

凡事有利有弊,如果生了一个自闭症的小孩,请说出有利的部分 :独特、专注力、诚实和直接,记忆力

生育一个自闭症小孩可能带来一些独特的优势和积极的方面&#xff0c;尽管也会面临许多挑战。以下是一些可能的有利方面&#xff1a; 独特的视角&#xff1a;自闭症儿童通常有独特的思维方式和视角&#xff0c;他们可能在某些方面比普通人更敏锐。这种独特性可以带来创新的解决方…

Nginx/阿里云/二级域名的配置和使用

阿里云域名解析配置如下&#xff1a; nginx配置如下&#xff1a; 访问地址&#xff1a; zhadmin.iotzzh.com image.png

20240529瑞芯微官方Toybrick TB-RK3588开发板的Debian11安装iperf并测试网速

20240529瑞芯微官方Toybrick TB-RK3588开发板的Debian11安装iperf并测试网速 2024/5/29 15:09 服务器端&#xff1a;瑞芯微官方Toybrick TB-RK3588开发板&#xff1a;Debian11 客户端&#xff1a;笔记本电脑&#xff1a;Ubuntu20.04 两者通过千兆交换机连接&#xff01; toybr…

小白跟做江科大32单片机之蜂鸣器

1.复制之前编写的工程库项目&#xff0c;详细工程库创建过程如下链接&#xff1a; 小白跟做江科大32单片机之LED闪烁-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139295351?spm1001.2014.3001.55022.按照江科大老师给的图片进行连接蜂鸣器 3.修改main.c…

VRTK4教程 一:资源导入、Unity设置、连接头盔

文章目录 VRTK4的分包导入VRTK4的资源包unity设置连接头盔 VRTK4的分包 vrtk4的资源包和旧版不同&#xff0c;采用了分包导入的思想&#xff0c;我们要用什么功能&#xff0c;就导入什么包&#xff0c;可以有效减小程序体积 如下图&#xff0c;已经导入的vrtk包会显示在Packag…

【JS红宝书学习笔记】第4章 变量、作用域和内存

第4章 变量、作用域和内存 1. 原始值和引用值&#xff08;面试题&#xff09; ECMAScript 变量可以包含两种不同类型的数据&#xff1a;原始值和引用值。原始值&#xff08;primitive value&#xff09;就是最简单的数据&#xff08;Undefined、Null、Boolean、Number、Strin…

DxO PhotoLab 6 for Mac/Win:专业RAW图片编辑的利器

DxO PhotoLab 6 for Mac/Win是一款专为摄影师和摄影爱好者打造的专业RAW图片编辑软件&#xff0c;它将先进的技术、丰富的功能与直观的操作完美结合&#xff0c;为用户提供了一款全面而强大的图片处理工具。 一、技术领先&#xff0c;处理RAW图片更高效 DxO PhotoLab 6采用了…