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  未采用同步处理,属于线程不
安​​​​​​​全操作

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VI 使用替换命令快速注释多行

使用替换命令快速注释多行&#xff1a; 按下 Esc 键确保你在普通模式下。输入 :起始行号,结束行号s/^/#/ 并按 Enter 键。 :起始行号 和 结束行号 分别是你要注释的起始行和结束行的行号。 关于正则 s/^/#/各个部分解释&#xff1a; s/: 这是vi编辑器中的替换命令的开头。s 表…

【Linux】centos7编写C语言程序,补充:使用yum安装软件包组

确保已安装gcc编译器 C语言程序&#xff0c;一般使用gcc进行编译&#xff0c;需确保已安装gcc。 若没有&#xff0c;可以使用yum安装gcc&#xff08;版本4.8.5&#xff09;&#xff0c;也可以使用SCL源安装gcc&#xff08;例如&#xff1a;版本9.3&#xff09;。 安装gcc&am…

htb_BoardLight

信息收集 nmap -sSVC 10.10.11.11开放80端口&#xff0c;将boardlight.htb写入/etc/hosts 同步进行子域名和目录扫描 子域名扫不到 这个目录扫描很奇怪哈&#xff0c;明明访问80端口有页面&#xff0c;就是扫不出来 直接浏览器访问80端口&#xff0c;四处看看&#xff0c;发…

Blazor入门-连接MySQL的简单例子:列出数据+简单查询

参考&#xff1a; ASP.NET Core 6.0 Blazor Server APP并使用MySQL数据库_blazor mysql-CSDN博客 https://blog.csdn.net/mzl87/article/details/129199352 本地环境&#xff1a;win10, visual studio 2022 community, mysql 8.0.33 (MySQL Community Server), net core 6.0 目…

DiffIR论文阅读笔记

ICCV2023的一篇用diffusion模型做Image Restoration的论文&#xff0c;一作是清华的教授&#xff0c;还在NIPS2023上一作发表了Hierarchical Integration Diffusion Model for Realistic Image Deblurring&#xff0c;作者里甚至有Luc Van Gool大佬。模型分三个部分&#xff0c…

Linux静态库、共享动态库介绍、制作及使用

参考学习&#xff1a;Linux下的各种文件 、动态库基本原理和使用方法&#xff0c;-fPIC选项的来龙去脉 、Linux静态库和动态库分析 文章写作参考&#xff1a;Linux共享库、静态库、动态库详解 - sunsky303 - 博客园 (cnblogs.com) 一.Linux共享库、静态库、动态库详解 使用G…

三十五岁零基础转行成为AI大模型开发者怎么样呢?

以下从3个方面帮大家分析&#xff1a; 35岁转行会不会太晚&#xff1f;零基础学习AI大模型开发能不能学会&#xff1f;AI大模型开发行业前景如何&#xff0c;学完后能不能找到好工作&#xff1f; 一、35岁转行会不会太晚&#xff1f; 35岁正处于人生的黄金时期&#xff0c;拥…

将四种算法的预测结果绘制在一张图中

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 之前的一期推文中&#xff0c;我们推出了…

EI期刊的定金和尾款

当涉及到EI&#xff08;工程索引&#xff09;期刊发表并支付定金和尾款时&#xff0c;许多学者和研究人员可能会感到担忧&#xff0c;因为这涉及到一定的风险。在探讨这个话题时&#xff0c;我们需要考虑几个因素&#xff0c;包括期刊的声誉、可信度、出版质量以及作者的权益保…

wxPython Demo大全系列:ActivityIndicator控件分析

一、ActivityIndicator介绍 wx.ActivityIndicator 控件是 wxPython 中用于显示活动指示器的控件&#xff0c;通常用于指示程序正在执行某些后台任务或操作。它在用户界面中以动画的形式表现出活动状态&#xff0c;让用户知道应用程序正在进行处理而不是被挂起。 主要特点 可视…

【Paddle】稀疏计算的使用指南 稀疏ResNet的学习心得 (2) + Paddle3D应用实例稀疏 ResNet代码解读 (1.6w字超详细)

【Paddle】稀疏计算的使用指南 & 稀疏ResNet的学习心得 Paddle3D应用实例稀疏 ResNet代码解读 写在最前面一、稀疏格式简介1. COO&#xff08;Coordinate Format&#xff09;2. CSR&#xff08;Compressed Sparse Row Format&#xff09; 二、Paddle稀疏张量支持1. 创建 C…

管理能力学习笔记十一:如何通过反馈做好辅导

关于辅导的常见错误 辅导过于细致 辅导的首要障碍: 不相信对方的潜力需要有成长型思维&#xff1a;即便员工现在不OK&#xff0c;未来会更好因材施教&#xff1a;对不同风格的下属&#xff0c;采取不同的辅导风格 凡事亲力亲为 作为管理者&#xff0c;我们要做的是&#xf…

FDW(Foreign Data Wrapper)

在上一篇博客里&#xff0c;最末尾提到了 FDW。 FDW 到底是什么呢&#xff1f; 标准 FDW&#xff08;Foreign Data Wrapper&#xff09;遵循了 SQL/MED 标准&#xff0c;标准全称&#xff1a;ISO/IEC 9075-9 Management of External Data (SQL/MED) 2003 年&#xff0c;SQL…

25 使用MapReduce编程了解垃圾分类情况

测试数据中1表示可回收垃圾&#xff0c;2表示有害垃圾&#xff0c;4表示湿垃圾&#xff0c;8表示干垃圾。 统计数据中各类型垃圾的数量&#xff0c;分别存储可回收垃圾、有害垃圾、湿垃圾和干垃圾的统计结果。 &#xff08;存储到4个不同文件中&#xff0c;垃圾信息&#xff0…

使用 retrievers 在 Elasticsearch 中进行语义重新排序

作者&#xff1a;来自 Elastic Adam Demjen, Nick Chow 什么是语义重新排序&#xff1f; 语义重新排序&#xff08;semantic reranking&#xff09;是一种方法&#xff0c;它允许我们利用快速检索方法的速度和效率&#xff0c;同时在其上分层语义搜索。它还允许我们立即将语义…

【JS基础语法04】运算符分类以及运用

一&#xff1a;赋值运算符 1 类型 赋值运算符包括以下&#xff1a;、、-、*、/ 2 原理 &#xff0c;是将等号右边的数赋值给左边以为例(-、*、/和运算逻辑是相同的) let num 5 num2 等价于 let num 5 numnum2 //num7 二&#xff1a;一元运算符 1怎么判断运算符是几元…

GeoJson和WKT数据格式解析

1. GeoJson数据格式 GEOJSON是gis地图中常用的数据格式&#xff0c;制作地图时用于存储各种地理数据&#xff0c;使用时通过OpenLayer、Leaflet、mapLibre-gl或者Cesium加载GEOJSON即可渲染出GEOJSON中描述的地理要素。 GeoJSON是一种对各种地理数据结构进行编码的格式&#xf…

拍摄的视频内容怎么做成二维码?视频在线转换成二维码的方法

怎么把拍的个人才艺视频做成二维码呢&#xff1f;现在扫码看视频是实现内容快速传播的一种常用方式&#xff0c;所以很多人会将自己拍摄的视频制作二维码图片&#xff0c;然后分享给其他人扫码获取内容&#xff0c;对于内容的传播速度及用户体验有很好的提升&#xff0c;在很多…

Comfyui导出图片的命名技巧,日期文件夹

种子序号命名&#xff1a;%KSampler.seed% 图片宽高序号命名&#xff1a;%Empty Latent Image.width%x%Empty Latent Image.height% 年月日&#xff1a;%date:yyyy-MM-dd% 时分秒&#xff1a;%date:hhmmss% 年月日种子序号&#xff1a;%date:yyyy-MM-dd%/%KSampler.seed%

以果决其行,只为文化的传承

从他们每一个人的身上&#xff0c;我们看到传神的东西&#xff0c;就是他们都能用结果&#xff0c;去指引自己前进的方向&#xff0c;这正是我要解读倪海厦老师的原因&#xff0c;看倪海厦2012年已经去世&#xff0c;到现在已经十几年时间了&#xff0c;但是我们看现在自学中医…