String类

news2024/9/22 15:43:31

String类常用的方法

字符串构造

String类的构造方法很多,常见的有以下的三种:

//三种常用的构造方法
public class Test {
    public static void main(String[] args) {
        //使用常量串构造
        String s1 = "hello world!";
        //直接new String对象构造
        String s2 = new String("hello world!");
        //使用字符串数组进行构造
        char[] array = {'h', 'e', 'l', 'l', 'o'};
        String s3 = new String(array);
    }
}

【注意】

  1. String是引用类型,内部并不储存字符串本身,在String类的实现原码中,String类的实例变量如下:
    在这里插入图片描述
    在JDK1.8中, 字符串实际保存在char类型的数组中
    在这里插入图片描述
  2. 在Java中“ ”引起来的也是String类型的对象

System.out.printlen(“hello”.lenth());
//这个 hello 也是String类型

String对象的比较

我们如何比较字符串的大小呢?Java中共提供了四种方法:

  1. ==比较是否引用同一对象
//==比较是否引用同一个对象
public class Test {
    public static void main(String[] args) {
        String s1 = new String("nihao");
        String s2 = new String("nihao");
        String s3 = s1;
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
    }
}

在这里插入图片描述
这里s1和s2引用的是不同的对象,使用”==“比较时候,地址不同,所以不相等。而s1和s3是引用的同一对象,所以相同。
2. boolean equals(Object anObject)方法:按照英文字母顺序查找
String类中重写了父类 Object中equals方法,Object中equals默认按照 == 比较,String重写equals方法后,按照如下规则比较:
在这里插入图片描述
比如”hello"与“hello world”比较,先比较长度,长度不相等,返回false ; 长度如果相等逐个字母进行比较,不相同返回false;全部相同,返回true
3. int compareTo(String s)方法按照英文顺序比较
与equals不同的是,equals返回值是boolean类型,而compareTo返回的是int类型,比较的方法如下:

  • 先按照字母的顺序比较,如果出现不相同的字母,直接返回两个字符大小的差值;
  • 如果前K个字符相同(K为两字符的最小长度),返回值两个字符串长度差值。
// int compareTo(String s) 方法
public class Test {
    public static void main(String[] args) {
        String s1 = "xiaoming";
        String s2 = "xiaohong";
        String s3 = "miaomiao";
        String s4 = "xiao";
        System.out.println(s1.compareTo(s2));//前几个字母相等,返回m-h的值
        System.out.println(s1.compareTo(s3));//返回x-m的值
        System.out.println(s1.compareTo(s4));//前几个字母相等,返回字母数量的差值
    }
}
  1. int compareTolgnoreCase(String str)方法:compareTo方式相同,但是忽略大小写的比较。
//int compareTolgnoreCase(String str)方法
public class Test {
    public static void main(String[] args) {
        String s1 = "XIAOMING";
        String s2 = "xiaoming";
        String s3 = "mingming";
        System.out.println(s1.compareToIgnoreCase(s2));//输出为0
        System.out.println(s1.compareToIgnoreCase(s3));//首字母大小不一样,返回首字母大小的差值
    }
}

字符串查找

字符串查找也是字符串中常见的操作,String类提供的常见查找方法:

方法功能
char chaAt(int index)返回值index位置上字符,如果index为负数或者越界,将抛出IndexOutOfBountsException异常
int indexof(int ch)返回ch第一次出现出现的位置,没有返回-1
int indexOf(int ch, int fromIndex)冲fromIndex位置开始找ch第一次出现的位置,没有返回-1
int indexof(Sting str)返回str第一次出现的位置,没有返回-1
int indexof(Sting 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
//字符、字符串查找相关函数
public class Test {
    public static void main(String[] args) {
        String s = "abcdcba";
        System.out.println(s.charAt(0));//找到第一个字符,查看是什么
        System.out.println(s.indexOf('c'));//从前往后找第一个c
        System.out.println(s.indexOf('c', 3));//从第四个字母开始找,出现c的位置
        System.out.println(s.indexOf("cba"));//从前往后找找第一个cba
        System.out.println(s.lastIndexOf('c'));//从后向前找第一个c
        System.out.println(s.lastIndexOf('c', 3));//从第四个位置开始,找第一个c
        System.out.println(s.lastIndexOf("cb"));//从后向前,找第一次出现cb的位置
        System.out.println(s.lastIndexOf("cb", 5));//从第五个位置从后向前找cb
    }
}

转化

  1. 数值和字符串转化
//数值和字符串转化
class Student {
    String s;
    int age;

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

public class Test {
    public static void main(String[] args) {
        String s1 = String.valueOf(123);
        String s2 = String.valueOf(3.1415926);
        String s3 = String.valueOf(true);
        String s4 = String.valueOf(new Student("xiaoming", 18));
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
        //字符串转化为数字
        int a = Integer.parseInt(s1);
        double b = Double.parseDouble(s2);
        System.out.println(a);
        System.out.println(b);
    }
}
  1. 大小写转化
//大小写转化
public class Test {
    public static void main(String[] args) {
        String s1 = "hello WORLD!";
        String s2 = "nihao 2022";
        System.out.println(s1.toLowerCase());
        System.out.println(s1.toUpperCase());
        System.out.println(s2.toUpperCase());
    }
}
  1. 字符串转数组
//字符串转数组
public class Test {
    public static void main(String[] args) {
        String s = "hello";
        char[] ch = s.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            System.out.print(ch[i]);
        }
        System.out.println();
        String s2 = new String(s);
        System.out.println(s2);
    }
}
  1. 格式化
//格式化
public class Test {
    public static void main(String[] args) {
        String s = String.format("%d-%d-%d",2022,9,14);
        System.out.println(s);
    }
}

字符串替换

使用一个新的字符串替换掉已有的字符串数据

String replaceAll(String regex, String replacement)//替换所有的
String replaceFirst(String regex, String replacement)//替换第一个 regex

//字符串替代
public class Test {
    public static void main(String[] args) {
        String s = "hello world!";
        System.out.println(s.replaceAll("l", "-"));
        System.out.println(s.replaceFirst("l","-"));
    }
}

在这里插入图片描述
这里我们要注意,由于字符串是不可变对象,替换并不修改当前的字符串,而是创建一个新的字符串

字符串拆分

将一个完整的字符串按照指定的分隔符进行查分成若干个子字符串。

String[] split(String regex) //将字符串根据regex进行全部拆分
String[] split(String regex, int limit);//将字符串以指定的格式进行差分

//字符串拆分
public class Test {
    public static void main(String[] args) {
        String str = "hello world, hello baobo!";
        String[] result = str.split("ll");
        for (String s: result) {
            System.out.println(s);
        }
        System.out.println("===========================");

        String[] result1 = str.split(" ", 2);//2代表分成两端
        for (String s: result1) {
            System.out.println(s);
        }
    }
}

【注意】有些特殊字符作为分隔符时,需要加上转义字符

  1. 字符“|” “*” “+”都加上转移字符,前面加上“\"
  2. 如果是 ““,那么需要写成 “\\”
  3. 如果一个字符串中有多个字符串,可以使用 “|” 作为连字符
//特殊字符作为分割字符
public class Test {
    public static void main(String[] args) {
        String s1 = "zhansan*age=18";
        String[] s2 = s1.split("\\*");
        System.out.println(s2[0]);
        System.out.println(s2[1]);
        System.out.println("=============================");
        String s3 = "d\\xuexi\\wuli";
        String[] s4 = s3.split("\\\\");
        System.out.println(s4[0]);
        System.out.println(s4[1]);
        System.out.println(s4[2]);
        System.out.println("=============================");
        String[] s5 = s1.split("\\*|=");
        System.out.println(s5[0]);
        System.out.println(s5[1]);
        System.out.println(s5[2]);
    }
}

字符串截取

从一个完整的字符串中截取部分内容,

String substring(int beginIndex);//从某一下标处开始截取
String substring(int beginIndex,int endIndex);//从 begin下标处截取到end下标出

//字符串截取
public class Test {
    public static void main(String[] args) {
        String s1 = "nihao xiaoming";
        System.out.println(s1.substring(6));
        System.out.println(s1.substring(1,6));
    }
}

在这里插入图片描述
【注意事项】

  1. 索引从0开始;
  2. ***我们写的这个去见都是前开后壁的,比如这里,包含1,不包含6下标的字母

其他操作方法

方法功能
String trim()去掉字符串中的左右空格,保留中间空格。
String toUpperCase()字符串大写
String toLowerCase()字符串转小写
public class Test {
    public static void main(String[] args) {
        String s = " Hello world! ";
        System.out.println(s.trim());//trim去掉字符串两边的空格
        System.out.println(s.toUpperCase());//将字符按转化为大写
        System.out.println(s.toLowerCase());//将字串转化为小写
    }
}

在这里插入图片描述

字符串的不可变性

String是一种不可变独享,字符串中的内容是不能改变的。字符串不可改变的愿意:

  1. ***String类在设计时就是不可改变的,String类实现描述中已经说明。
    在这里插入图片描述
    在这里插入图片描述
    String类中的字符串际保存在内部维护的value字符数组中
  2. 所有设计到可能改变字符串内容的操作实际上都是新建一个对象,改变的是新的对象。
    在这里插入图片描述
    String类无法改变的真正原因是,final修饰了内部的value,同时value被private修饰,且没有提供value的改变的方法,如果提供value改变方法,字符串是可以改变的。String类中的final只是表示它无法被继承。

为什么String要被设计成不可改变的呢?(选学)

  1. 方便实现字符串对象池。如果String可变,那么对象池就可能需要考虑写时拷贝的问题;
  2. 不可变对象的线程是安全的;
  3. 不可变对象更方便缓存hash code,作为key时可以更高效的保存到HashMap中。

字符串修改

【注意】尽量避免直接对String类型对象进行修改,因为String类是不可能修改的,所有的修改都会创建新对象,效率非常低

//字符串避免频繁修改
public class Test {
    public static void main(String[] args) {
        String s = "hello";
        s += "world";
        System.out.println(s);
    }
}

像这种方式,其实中间回创建很多的临时对象,效率很低

StringBuilder和StringBuffer

StringBuder的介绍

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

//StringBuilder的一些方法
public class Test {
    public static void main(String[] args) {
        StringBuilder s1 = new StringBuilder("Hello");
        StringBuilder s2 = s1;
        s1.append(' ');//追加字符
        s1.append("world");//追加字符串
        s1.append(123);//追加数字
        System.out.println(s1);//在原本的基础上进行追加
        System.out.println(s1 == s2);//true
        System.out.println(s1.charAt(0));//获取0下标的字符
        System.out.println(s1.length());//获取长度
        System.out.println(s1.capacity());//获取底层数组总大小
        s1.setCharAt(0,'h');//改变0位置的字符
        s1.insert(0, "nihao!");//在0下标前面,追加字符串
        System.out.println(s1);
        System.out.println(s1.indexOf("hello"));//获取第一次hello出现的位置
        System.out.println(s1.lastIndexOf("hello"));//获取从前往后数第一次出现hello的位置
        s1.deleteCharAt(0);//删除首字符
        s1.delete(0,5);//删除【0,6)范围内的字符
        System.out.println(s1.substring(0, 6));//截取【0,6)范围内的字符
        s1.reverse();//字符串逆转
        System.out.println(s1.toString());//以字符串形式输出

    }
}

在这里插入图片描述
StringBuilder的内容可以被改变(在原来的内容上进行修改);
【注意】String 和 StringBuilder类不能直接转化,如果要相互转化要满足如下原则:

  • String 变为 StringBuilder:利用 StingBuilder 的构造方法或者是append()方法
  • StringBuilder 变为 String:调用 toString() 方法

面试题

  1. String、StringBuilder、StringBuffer的区别
  • String的内容不可修改,StringBuilder和StringBuffer的内容可以修改
  • StringBuilder和StringBuffer大部分的功能相似
  • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理的操作,属于现成不安全操作
  1. 以下共创建了多少个String对象【前提不考虑常量池之前是否存在】
public class Test {
    public static void main(String[] args) {
        String str1 = new String("ab");//创建多少String对象   2
        String str2 = new String("a") + new String("b");//创建多少String对象   4
    }
}

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

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

相关文章

一个 Angular 程序员两年多的远程办公经验分享

笔者从 2020 年疫情爆发之前&#xff0c;一直从事后端开发工作。2020 年因为工作原因&#xff0c;加入了 SAP 一个代号为 Spartacus 的开源项目的开发团队。这个项目是一个基于 Angular 的电商 Storefront 框架&#xff0c;其代码贡献者来自全世界各个地区。 实际上&#xff0…

工薪族创业方案

这是一个创业的时代,想自己创业做老板的人越来越多,其中也包括众多上班族。所碰到的问题:时间紧、资金有限、经验缺乏、患得患失,是几乎所有想自主创业的上班族都会遇到的问题。有以下几个方案可以尝试尝试! 方案一:对于不想冒任何风险而又想尝一尝创业滋味的上班族来说…

jdk11新特性——局部变量类型推断(var ”关键字”)

目录一、什么是局部变量类型推断二、局部变量类型推断&#xff08;var ”关键字”&#xff09;2.1、根据右边的表达式自动推断类型2.2、var并不是关键字2.3、var声明变量和String声明变量作用相同三、var 语法&#xff1a;局部变量类型推断&#xff08;注意事项&#xff09;3.1…

jsp儿童网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 儿童网站系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发&#xff0c;数据库为Mysql&#xff0c;使用ja…

OpenShift 4 - 利用 RHSSO 实现应用认证和访问授权

《OpenShift / RHEL / DevSecOps / Ansible 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.11 环境中验证 文章目录安装环境部署应用并配置登录和授权部署应用配置 RHSSO 的用户和组配置应用身份认证配置应用访问授权为应用配置登录和访问授权参考本文将部署一个应用&…

[附源码]Python计算机毕业设计SSM进出口食品安全信息管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Maven】jar包冲突原因与最优解决方案

【Maven】jar包冲突原因与最优解决方案 文章目录前言jar包冲突原因依赖传递冲突原因jar包冲突解决方案Maven默认处理策略排除依赖版本锁定maven-shade-plugin插件总结前言 你是否经常遇到这样的报错&#xff1a; java.lang.NoSuchMethodError java.lang.ClassNotFoundExcepti…

Endnote 中批量导出PDF

简介 最近正着手写一篇综述文章&#xff0c;来整体把握下自己研究领域的历史、方法、最新进展与趋势。由于需要对相关文献进行搜集、阅读和分类。庄小编使用 EndNote 来进行管理文献。 在使用较长时间后&#xff0c;整理了几个超级好用的小技巧。比如&#xff1a;自动导入某个…

kubernetes—Service介绍

Service介绍 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题&#xff0c;kubernetes提供了Service资…

错误: 找不到或无法加载主类 com.example.demo.DemoApplication 解决方案

使用场景&#xff1a;使用idea搭建springboot项目使&#xff0c;出现报错情况 错误: 找不到或无法加载主类 com.example.demo7.Demo7Application 解决方案&#xff1a; 方法一&#xff1a;取消勾选“将IDE构建/运行操作委托给Maven” 使用步骤&#xff1a;File > Setting…

Eyeshot 2023 预期计划 Eyeshot 2023 即将见面

Eyeshot 2023 预期--Crack--定制 Eyeshot 是一个基于 Microsoft .NET Framework 的 CAD 控件。它允许开发人员快速将 CAD 功能添加到 WinForms 和 WPF 应用程序。Eyeshot 提供了从头开始构建几何体、使用有限元方法对其进行分析并在其上生成刀具路径的工具。还可以使用 CAD 交…

Python源码剖析3-列表对象PyListObject

1、PyListObject对象 PyListObject 对象可以有效地支持插入,添加,删除等操作,在 Python 的列表中,无一例外地存放的都是 PyObject 的指针。所以实际上,你可以这样看待 Python 中的列表: vector<PyObject*>。 [listobject.h] typedef struct {PyObject_VAR_HEAD/* Vecto…

卡尔曼滤波之最优状态估计和最优状态估计算法

1. 最优状态估计 情景1&#xff1a;假设一个一个比赛中&#xff0c;不同队伍的自动驾驶汽车使用 GPS 定位&#xff0c;在 100 种不同的地形上各行驶 1 公里。每次都尽可能停在终点。然后计算每只队伍的平均最终位置。 第一组输了&#xff1a;因为虽然方差小&#xff0c;但是偏差…

基于java+ssm+vue+mysql的社区流浪猫狗救助网站

项目介绍 随着迅速的发展&#xff0c;宠物饲养也较以前发生很大的变化&#xff0c;社区流浪猫狗救助网站系统以其独有的优势脱颖而出。“社区流浪猫狗救助网站”是以JAVA程序设计语言课为基础的设计出适合社区流浪猫狗救助网站&#xff0c;其开发过程主要包括后台数据库的建立…

Vulnhub:Os-Bytesec靶机渗透

目录 前期准备&#xff1a; 渗透过程 测试SMB PATH环境变量介绍 前期准备&#xff1a; 1.在vulnhub官网下载靶机&#xff1a;Os-Bytesec。 2.靶机用virtualbox打开&#xff0c;网络使用仅主机模式&#xff0c;攻击机kali在vmware上使用桥接模式&#xff0c;并桥接到virtru…

性能优化:Netty连接参数优化

参考资料&#xff1a; 《Netty优化》 相关文章&#xff1a; 《Netty&#xff1a;入门&#xff08;1&#xff09;》 《Netty&#xff1a;入门&#xff08;2&#xff09;》 《Netty&#xff1a;粘包与半包的处理》 《性能优化&#xff1a;TCP连接优化之三次握手》 写在开头…

JavaWeb_第5章_会话技术_Cookie+Session

JavaWeb_第5章_会话技术_CookieSession 文章目录JavaWeb_第5章_会话技术_CookieSession1&#xff0c;会话跟踪技术的概述2&#xff0c;Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3&#xff0c;Session3.1…

vs2019_qt6.2.4_dcmtk3.6.7_vtk9.2.2_itk5.3_opencv4.6.0编译记录

目录 1 dcmtk3.6.7编译 2 vtk9.2.2编译 3 itk5.3编译 4 opencv4.6.0 5 参考链接 编译顺序&#xff0c;qt6.2.4下载----->dcmtk3.6.7----->vtk9.2.2----->itk5.3----->opencv4.6.0 opencv4.6需要使用到vtk9.2.2&#xff0c;需要在最后编译。 opencv遇到…

[附源码]计算机毕业设计校园代取快递系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Nacos2.1.2源码修改支持高斯,postresql

1、下载代码 git clone https://github.com/alibaba/nacos.git -b 2.1.2 或 git clone https://github.com/alibaba/nacos.git 2、maven命令执行下试试能不能打包 mvn -Prelease-nacos -Dmaven.test.skiptrue -Drat.skiptrue clean install -U 或 mvn -Prelease-nacos ‘-Dmav…