深入理解【 String类】

news2024/11/28 2:33:18

目录

1、String类的重要性

2、常用方法 

2、1 字符串构造

2、2 String对象的比较

2、3 字符串查找 

 2、4字符转换

数值和字符串转换:

大小写转化:

 字符串转数组:

格式转化: 

2、5 字符串替换

2、6字符串拆分 

 2、7 字符串截取

3、String字符串的不可变性 

4、 认识StringBuffer和StringBuilder

4、1StringBuffer

4、2StringBuilder


1、String类的重要性

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类
在开发和校招笔试中,字符串也是常客,而且在面试中也频繁被问到,比如:String、StringBuff和StringBulider之间的区别等。

2、常用方法 

2、1 字符串构造

String类提供的构造方法常用的是以下三种:

  1. 使用常量字符串构造
  2. 直接newString类对象
  3. 使用字符数组进行构造
public class Test {
    public static void main(String[] args) {
        //1、使用常量字符串构造
        String str1="Hello";
       
        //2、直接newString类对象
        String str2=new String("Hello");
        
        //3、使用字符数组进行构造
        char[] array={'H','e','l','l','o'};
        String str3=new String(array);
    }
}

【注意】

1、String类是引用类型,内部并不储存字符串本身

2、Java中""引起来的也是String类对象

2、2 String对象的比较

1、==比较是否为同一个对象

对于内置类型,==是比较变量的值,而引用类型==比较的是引用中的地址。

String str1="Hello";
String str2=new String("Hello");
System.out.println(str1==str2);//结果为false

2、boolean equals(Obeject anObeject)方法,比较内容是否相同

String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照如下规则进行比较,比如:str1.equals(str2)

String str1="Hello";
String str2=new String("Hello");
String str3="world";
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//false

3、int compareTo(String s)方法:按照字典序比较

与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:

  1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
  2. 如果前K个字符相等,返回两串字符串长度差值

4、int compareTolgnoreCase(String str)方法:与compareTo方法相同,但忽略大小写比较

String str1="abc";
String str2=new String("ABC");
String str3="Abdef";
System.out.println(str1.compareToIgnoreCase(str2));//0
System.out.println(str1.compareToIgnoreCase(str3));//-1
System.out.println(str2.compareToIgnoreCase(str3));//-1

2、3 字符串查找 

字符串查找方法
方法功能
char charAt(int index)

返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常

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

String str1="Hello,world,Hello";//长度为17

System.out.println(str1.charAt(6));//w
System.out.println(str1.indexOf('o'));//4
System.out.println(str1.indexOf('l',8));//9
System.out.println(str1.indexOf("Hello"));//0
System.out.println(str1.indexOf("Hello",0));//0
System.out.println(str1.lastIndexOf('l'));//15
System.out.println(str1.lastIndexOf('l',16));//15
System.out.println(str1.lastIndexOf("Hello"));//12
System.out.println(str1.lastIndexOf("Hello",10));//0

上述方法都是实例方法 

 2、4字符转换

数值和字符串转换:

  • valueOf用于将其他形式转化为字符串,有许多重载方法。

代码演示: 

public class Student {
    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Test {
    public static void main(String[] args) {
        String str1=String.valueOf(123);
        String str2=String.valueOf(true);
        String str3=String.valueOf(new Student("lisi",18));
        System.out.println(str1);//123
        System.out.println(str2);//true
        System.out.println(str3);//Student{name='lisi', age=18}
    }
}

大小写转化:

  • 大写转小写toLowerCase()
  • 小写转大写toUpperCase()
String str1="Hello";
String str2="World";
//小写转大写
System.out.println(str1.toUpperCase());//HELLO
//大写转小写
System.out.println(str2.toLowerCase());// world

 字符串转数组:

  • toCharArray()
String str1="Hello";
char[]array = str1.toCharArray();
 for (int i = 0; i < array.length; i++) {
     System.out.println(array[i]);
 }

格式转化: 

  • format
String s=String.format("%d-%d-%d",2024,7,5);
System.out.println(s);//2024-7-5

2、5 字符串替换

使用一个指定的新的字符串替换已有的字符串数,可用方法如下:

方法功能
String replaceAll(String regex, String replacement) 替换所有的指定内容
String replaceFirst(String regex, String replacement) 替换收个内容方法

代码示例: 

String str1="Helloworld";

System.out.println(str1.replace("H","h"));
System.out.println(str1.replaceFirst("l","L"));

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

2、6字符串拆分 

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
可用方法如下:

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

代码实例:

 【注意】

有些特殊字符作为分隔符无法正确切分,需要加上转义。

  1. " | "、" * "、 "+"都得加上转义字符,前面加上"\\"
  2. " \ "前面要加上" \\\\"
  3. 如果有多个分隔符,用" | "作为连字符

 2、7 字符串截取

 从一个完整的字符串之中截取部分内容,可用方法

方法功能
String substring ( int beginindex )从指定索引截取到结尾
String substring(int bwginindex ,int endindex )截取部分内容

【注意】

  1. 索引从0开始
  2. 注意前闭后开的用法 substring(  ,  】

3、String字符串的不可变性 

String类是一种不可变对象,字符串中内容是不可改变的。这是因为

1、String类在设计时就是不可改变的

String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:

  1. String类被final修饰,表明该类不能被继承
  2.  value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。

2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象 

” 字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。”
这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。
final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。

4、 认识StringBuffer和StringBuilder

4、1StringBuffer

StringBuffer类是Java提供的一个可变字符串序列类,在java.lang包中定义。它与String类相似,但有一个重要的区别:String类是不可变的,即创建后不能更改其内容,而StringBuffer类则可以在原地修改字符串。
需要注意的是,由于StringBuffer是为了线程安全而设计的。在多线程环境下,建议使用线程安全的StringBuffer类,以确保数据的一致性。

4、2StringBuilder

StringBuilder类是Java提供的一个可变字符串序列类,与StringBuffer类类似,但不同的是StringBuilder不是线程安全的。StringBuilder类位于java.lang包中。

以下是StringBuilder类的一些重要特性:
单线程环境下,通过使用StringBuilder类,我们可以方便地进行字符串的动态操作和修改,并能够高效地处理字符串操作的需求

面试题:String、StringBuffer和StringBuilder的异同?

相同点:底层都是通过char数组实现的
不同点:

String对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空间来存储修改之后的对象;而StringBuffer和StringBuilder对象的值是可以被修改的;

StringBuffer几乎所有的方法都使用synchronized实现了同步,线程比较安全,在多线程系统中可以保证数据同步,但是效率比较低而StringBuilder 没有实现同步,线程不安全,建议在单线程中使用 StringBuilder,效率比较高。

如果我们在实际开发过程中需要对字符串进行频繁的修改,不要使用String,否则会造成内存空间的浪费;当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用 StringBuilder。

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

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

相关文章

【pytorch12】什么是梯度

说明 导数偏微分梯度 梯度&#xff1a;是一个向量&#xff0c;向量的每一个轴是每一个方向上的偏微分 梯度是有方向也有大小&#xff0c;梯度的方向代表函数在当前点的一个增长的方向&#xff0c;然后这个向量的长度代表了这个点增长的速率 蓝色代表比较小的值&#xff0c;红色…

初阶数据结构二叉树练习系列(1)

这个系列的文章将带大家一起刷题&#xff0c;并且总结思路 温馨提示&#xff1a;本篇文章里的练习题仅适合刚学完二叉树的小白使用 相同的树 思路 情况分析&#xff1a;第一种情况&#xff1a;两棵树都为空 → 返回true 第二种情况&am…

Vue +Echarts 二维数组获取最大值和最小值以及索引

实现图例效果 获取最大值方法&#xff1a; maxSecond(array) {let max Number.MIN_SAFE_INTEGER;for (let i 0; i < array.length; i) {const secondElement parseInt(array[i][1]);if (secondElement > max) {max secondElement;}}return max;}, 获取最大值索引&…

数据结构——(单)链表

文章目录 1. 结构 2. 链表的分类 1. 单链表 2. 双链表 3. 循环单链表 4. 循环双链表 3. 优缺点 4. 单链表函数 5. 单链表代码实现 1. 结构 逻辑结构 链表是一种线性结构&#xff0c;由一系列结点&#xff08;Node&#xff09;组成。每个结点包含一个数据元素和一个指…

Linux库概念及相关编程(动态库-静态库)

Linux库概念及相关编程 分文件编程案例 分文件编程是指将程序按功能模块划分成不同的文件进行编写&#xff0c;这种方法有以下好处&#xff1a; 功能责任划分&#xff1a;每个文件对应一个功能模块&#xff0c;职责明确&#xff0c;易于理解和维护。方便调试&#xff1a;可以…

绝地求生PUBG点击开始游戏一直在加载不读条计时间的解决办法

绝地求生PUBG作为一款引领潮流的大逃杀游戏&#xff0c;凭借其紧张刺激的对抗体验赢得了全球玩家的喜爱。 即使是游戏已经上线很长时间了&#xff0c;但是游戏现在依旧是很火爆&#xff0c;还有很多玩家下载游戏进行游玩。然而&#xff0c;一些为玩家在游戏中遇到了点击开始游戏…

java版本ERP管理系统源码 Spring Cloud ERP_ERP系统_erp软件_ERP管理系统

在当今数字化时代&#xff0c;企业对高效、稳定且易于扩展的管理系统的需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、Spring Boot、…

Butterfly主题文章标题改成转动小风车

效果 标题级别不同小风车颜色不同&#xff0c;鼠标移入会有转动变慢及变色效果。 新建css 建议在/source下创建诸如img/css/js等文件夹&#xff0c;存放文章或网站用的素材&#xff0c;分门别类后续也方便维护。 Hexo打包的时候&#xff0c;会自动把/source下的文件&#…

JavaScript基础知识5(对象)

JavaScript基础知识5&#xff08;对象&#xff09; 对象创建对象使用对象字面量使用 new Object() 访问和修改属性点表示法方括号表示法 动态添加和删除属性添加属性删除属性 对象方法对象的遍历常用属性和方法数学常量数学函数三角函数 使用示例生成随机整数计算圆的面积求最大…

Zabbix 配置 VMware 监控

Zabbix监控VMware 官方文档&#xff1a;https://www.zabbix.com/documentation/current/en/manual/vm_monitoring Zabbix 可以使用低级发现规则自动发现 VMware 虚拟机管理程序和虚拟机&#xff0c;并根据预定义的主机原型创建主机来监控它们。Zabbix 还包括用于监控 VMware …

VirtualBox的windows server 2016设置主机和虚拟机共享文件夹

文章目录 安装步骤1. windows server 2016安装增强功能2.上述安装完成之后&#xff0c;需要做共享文件夹&#xff0c;在宿主机&#xff0c;新建一个test文件夹&#xff0c;做共享设置&#xff0c;如下图&#xff1a;3.然后打开虚拟机&#xff0c;设置文件共享 安装步骤 1. win…

字节码编程javassist之定义方法和返回值

写在前面 源码 。 本文看下如何使用javassist来定义方法和返回值。 1&#xff1a;源码 package com.dahuyou.javassist.generateFieldAndMethod;import javassist.*;import java.lang.reflect.Method;public class JustDoIt222 {public static void main(String[] args) thr…

跨平台Ribbon UI组件QtitanRibbon全新发布v6.7.0——支持Qt 6.6.3

没有Microsoft在其办公解决方案中提供的界面&#xff0c;就无法想象现代应用程序&#xff0c;这个概念称为Ribbon UI&#xff0c;目前它是使应用程序与时俱进的主要属性。QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件&#xff0c;QtitanRibb…

SOLIDWORKS分期许可(订阅形式),降低前期的投入成本!

SOLIDWORKS 分期许可使您能够降低前期软件成本&#xff0c;同时提供对 SOLIDWORKS 新版本和升级程序的即时访问&#xff0c;以及在每个期限结束时调整产品的灵活性&#xff0c;帮助您跟上市场需求和竞争压力的步伐。 目 录&#xff1a; ★ 1 什么是SOLIDWORKS分期许可 ★ 2 …

Cube-Studio:开源大模型全链路一站式中台

开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/data-infra/cube-studio 一款真正意义的 LLMOps 框架 LLMOps&#xff08;Large Language Model Operations&#xff09;是一个涵盖了大型语言模型&#xff08;如GPT系列&#xff09;开发、部署、维护和优化的一…

【EI会议/稳定检索】2024年应用数学、化学研究与物理工程国际会议(AMPE 2024)

2024 International Conference on Applied Mathematics, Chemical Research, and Physical Engineering 2024年应用数学、化学研究与物理工程国际会议(AMPE 2024) 【会议信息】 会议简称&#xff1a;AMPE 2024 大会时间&#xff1a;点击查看 截稿时间&#xff1a;官网查看 大…

pp 二 物料bom (CS01 CS02 CS03)

02&#xff1a;bom建了以后不能做生产&#xff0c;也不能下达计划 03&#xff1a;不能下达成本&#xff0c;下达订单 bom里面的存储地点高于物料主数据里面的存储地点&#xff08;mrp视图2&#xff09; 生产存储地点作为组件角度是一个发料得存储地点 但是作为一个成品则是成…

Restore Equipment

Restore Equipment 魔兽世界 - 盗号申请 - 恢复装备流程 魔兽和网易真的不行啊 1&#xff09;这个装备本来就是兑换的竟然可以卖NPC 2&#xff09;针对这个情况竟然无法挽回 3&#xff09;设计理念真的不得不吐槽一下 4&#xff09;策划真的不咋样&#xff0c;要是有机会我要自…

mssql查询历史执行过的语句日志

SELECT deqs.creation_time,dest.text AS [SQL Text],deqs.execution_count,deqs.total_elapsed_time,deqs.total_worker_time FROM sys.dm_exec_query_stats AS deqs CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest--where dest.text like %这个是我的条件&#…

数学建模----滑翔伞伞翼面积的设计及运动状态描述

摘要 滑翔伞作为一项融合了挑战、冒险和刺激于一体的运动&#xff0c;近年来在全球范围内受到了广泛的关注。滑翔伞在救援、探险、体育、娱乐、环保和交通等领域的应用展现了其重要价值。然而&#xff0c;中国在滑翔伞领域尚未取得突破&#xff0c;缺乏全球影响力和竞争力。因此…