Java中String类常用方法

写笔记记录自己的学习记录以及巩固细节

目录

1.String类的常用方法

1.1 字符串构造

1.2 String对象的比较

1.2.1 比较两个字符串是否相等

 1.2.2 比较两个字符串的大小

1.3 字符串查找

1.4 字符串的转化

1.4.1 字符串转整数

1.4.2  字符串转数字

1.4.3 大小写的转换

 1.4.4 字符串与数组之间转换

 1.4.5 格式化输出

1.5 字符串的替换

1.6 字符串的拆分

1.7 字符串的截取

1.8 其他操作方法

1.8.1 trim()

1.8.2 contains() 

 1.8.3 endWith(),startsWith()

1.9 字符串常量池

1.10 字符串的不可变性

1.11 字符串的修改

2. StringBuilder和StringBuffer

2.1 StringBuilder介绍

2.2 两者的主要区别


1.String类的常用方法

1.1 字符串构造

//两种方法一样,常用第一种
String str1 = "hello";//直接指向常量池,常量池中的哈希值指向"hello"数组
String str2 = new String("abc");//凡是new的都是在堆上开辟空间,堆上的空间再指向String的地址

//字符数组
char[] chars = {'a', 'v', 's', 'd'};
String str3 = new String(chars);
System.out.println(str3);

str1 是在常量池中创建一个新的String对象

只要是引号引出来的值都会存放在常量池中

str2 是使用了new方法在堆上开辟了一个String大小的空间

chars 是一个字符数组,直接在堆上开辟空间

str3 在堆上new了一个String对象

所有String对象中都有一个value和hash,其中value指向一个字符数组

1.2 String对象的比较

1.2.1 比较两个字符串是否相等

s1.equals(s2)方法     判断s1,s2两字符串的值是否相等,返回boolean值

s1.equalsIgnoreCase(s2)    忽略字母的大小写进行比较,返回boolean值

 使用注意事项:最好把要比较的字符串放前面,可以避免空指针的风险

String string1 = new String("aaaaa");
//string1 = null;
//若使用空指针则不能 '.',会报错
System.out.println(string1.equals("aaaaa"));//若string1为null,则系统报错
//而使用"aaaaa"在前可以避免空指针异常的风险
System.out.println("aaaaa".equals(string1));

"=="比较的是两个字符串的地址是否相同

"equals"比较的是连个字符串的值是否相等

//利用new出来的字符串才算开辟新的空间
//但只要出现引号引起来的数据就会存放在在常量池中
String string1 = new String("aaaaa");
String string2 = new String("aaaaa");
//两个哈希地址一样,即都指向常量池同一个位置
System.out.println(string1.hashCode());//92567585
System.out.println(string2.hashCode());//92567585
//但 == 的结果为false,即在堆上的地址不同
System.out.println(string1 == string2);//false       == 比较的是两个变量的地址是否相等
System.out.println(string1.equals(string2));//true   equals比较的是具体值是否相等

有图可知,String虽然创建出了两个相同的值,但是在堆上开辟了两个不同地址的String对象,但两个String对象中的value指向的常量字符数组是同一个。

 1.2.2 比较两个字符串的大小

s1.compareTo(s2)      比较s1,s2的大小,若s1 > s2返回正值,反之返回负值,若相等返回0

s1.compareToIgnoreCase(s2)   忽略大小写进行比较,返回值和compareTo()一样

//比较字符串的大小
    public static void test2() {
        String s1 = new String("hello");
        String s2 = new String("Hello");

        int ret = s1.compareTo(s2);
        //忽略大小写进行比较
        ret = s1.compareToIgnoreCase(s2);
        if (ret > 0) {
            System.out.println("s1 > s2");
        } else if (ret < 0) {
            System.out.println("s1 < s2");
        } else {
            System.out.println("s1 == s2");
        }
    }

1.3 字符串查找

s1.charAt(i)   返回s1中下标为i的字符

s1.indexOf('ch')  从字符串第一个字符查找,返回第一次出现’ch'字符的下标,停止查找

s1.indexOf('ch',i)  从下标为i的位置开始往后查找,返回第一次出现’ch'字符的下标

s1.indexOf("String" )从头开始查找,返回第一次出现"String"的第一个字符的下标 

s1.indexOf("String",i)    同上

s1.lastIndexOf( )  从尾部开始往前查找,用法和前面一样

//字符串中查找字符
    public static void test3() {
        String s1 = new String("haekasdj");
        for (int i = 0; i < s1.length(); i++) {
            //charAt(i) 拿到某个位置的字符
            char ch = s1.charAt(i);
            System.out.println(ch);
        }
        //indexOf(),查找,若找到返回下标,找不到返回-1
        //indexOf('char') 从头开始找,遇到第一个查找的字符就结束,  返回找到字符的下标
        System.out.println(s1.indexOf('a'));
        //indexOf('char',i)从i下标开始找,找到第一个查找的字符就停止 ,返回该下标
        System.out.println(s1.indexOf('a', 3));
        //indexOf("String")从头开始找,找到第一个字符串第一个字符的下标
        System.out.println(s1.indexOf("abc"));// -1
        System.out.println(s1.indexOf("aek"));// 1
        //从下标3开始找,返回第一个找到的字符串第一个字符的下标
        System.out.println(s1.indexOf("asd",3));

        //lastIndexOf()从后往前找,和以上用法相同
        System.out.println(s1.lastIndexOf('a'));
    }

1.4 字符串的转化

1.4.1 字符串转整数

String.valueOf()

参数转字符串

s1 = String.valueOf()

参数可以是int,char,long,float,boolean,double一类的数字

也可以是类Object

字符串  char[]

//valueOf  把参数转化为字符串
String s1 = String.valueOf(1234);
System.out.println(s1);
String s2 = String.valueOf("alskdjlkajsd");
System.out.println(s2);
//转换类时,该类中必须重写ToString方法
String s3 = String.valueOf(new Student("xiaoli", 12));
System.out.println(s3);

 输出

1234
alskdjlkajsd
Student{name='xiaolei', age=12}

1.4.2  字符串转数字

Interger.parseInt() 

Double.parseDouble()   

//parseInt/parseDouble 字符串 转 整数
int a1 = Integer.parseInt("123123123");
System.out.println(a1);

double a3 = Double.parseDouble("12309.1203");
System.out.println(a3);

1.4.3 大小写的转换

toUpperCase()    //字符串中字母全部转大写

toLowerCase()    //字符串中字母全部转小写

//toUpperCase() 小写转大写 汉字不变
String s1 = "hellGtasT高";
String ret = s1.toUpperCase();
System.out.println(ret);

//toLowerCase() 大写转小写 汉字不变
ret = s1.toLowerCase();
System.out.println(ret);

 输出

HELLGTAST高
hellgtast高

 1.4.4 字符串与数组之间转换

toCharArray()

没有toIntArray(),因此不能用整数数组接收

 String s1 = "asdasd";
//字符串转数组
char[] ch = s1.toCharArray();
System.out.println(Arrays.toString(ch));

//数组转字符串
String s2 = new String(ch);
System.out.println(s2);
//不能将字符串转换成整数数组
//int[] arr = "123123".toCharArray();

 1.4.5 格式化输出

String.format()    可以像C语言那样控制格式输出

//格式化输出 String.format()
    public static void test1() {
        String s1 = String.format("%d,%d,%d", 2024, 4, 21);
        System.out.println(s1);//2024,4,21
    }

1.5 字符串的替换

s1.replace('oldChar', 'newChar')   将字符串的某个字符替换为新字符,返回一个新的字符串

s1.replace("String", "String")  将某个字符串替换为新的字符串,返回一个新的字符串

s1.replaceFirsrt()   将第一个old字符或字符串替换为新的

//将字符串中的某个字符替换,返回一个新的字符串
        String s1 = "asdasdasd";
        String ret = s1.replace('a', 'd');
        System.out.println(ret);//dsddsddsd

        //也可以将某段字符替换为任意字符串
        String s2 = "asdasdasdasd";
        String ret2 = s2.replace("asd", "qweqwe");
        System.out.println(ret2);//qweqweqweqweqweqweqweqwe

        //替换第一个字符串  或字符
        String s3 = "asdasdasd";
        String ret3 = s3.replaceFirst("asd", "asdfgdfgfgh");
        System.out.println(ret3);//asdfgdfgfghasdasd

1.6 字符串的拆分

s1.split(char)   以某个字符为分割符,返回一个字符串数组

s1.split(char,int)   以某个字符串为分割符,限制分割为几个字符串,但不会平均分

//字符串拆分 split
    public static void test3() {
        //是该字符串根据某个字符分割开,返回一个字符串数组
        String s1 = "zhangsan wangwu 爱上了的骄傲 zhao2";
        String arr[] = s1.split(" ");
        System.out.println(arr.length);
        System.out.println(Arrays.toString(arr));
        //[zhangsan, wangwu, 爱上了的骄傲, zhao2]

        //多加一个limit参数,即控制分组的数量(但不会平分,会找打第一个分隔符进行分割)
        String arr_[] = s1.split(" ", 2);
        System.out.println(Arrays.toString(arr_));
        //[zhangsan, wangwu 爱上了的骄傲 zhao2]

        // '.' 和 '\'很特殊,需要\\进行转义
        String s2 = "2024.4.21";
        String arr2[] = s2.split("\\.");
        System.out.println(Arrays.toString(arr2));//[2024, 4, 21]
        String s3 = "2024\\4\\21";
        System.out.println(s3);//2024\4\21
        String arr3[] = s3.split("\\\\");//表示分隔符为"\\"
        System.out.println(Arrays.toString(arr3));//[2024, 4, 21]

        //多个分割符,用|来分割分隔符
        String s4 = "asd&gaf fdgg.asddsasd";
        String arr4[] = s4.split("&| |\\.");//表示三个分隔符 & 和 ' ' 和 '.'
        System.out.println(Arrays.toString(arr4));//[asd, gaf, fdgg, asddsasd]
    }

1.7 字符串的截取

s1.substring(int)    从下标int作为新字符串的头,从该下标开始到尾部截取原s1,返回新字符串

s1.substring(int m,int n)  截取s1的下标[m,n),返回新字符串   

//截取字符串 substring(int)
    public static void test4() {
        String s1 = "asddfgghjghj";
        //从某个下标开始往后作为一个新字符串的第一个字符[2,tail]
        String ret1 = s1.substring(2);
        System.out.println(ret1);//ddfgghjghj
        String ret2 = s1.substring(2, 5);//[2,5),即下标为2,3,4的字符作为新字符串
        System.out.println(ret2);//ddf
    }

1.8 其他操作方法

1.8.1 trim()

s1.trim()  除去s1两端的空格

//除去字符串左右两边的空格trim()
    public static void test5() {
        String s1 = "    asdjlkw   asd   ";
        System.out.print(s1);
        System.out.println("ppppppppppppppppppp");


        String s2 = "    asdwasd  fgdh   ";
        String ret2 = s2.trim();
        System.out.print(ret2);
        System.out.println("pppppppppppppppppp");
}

 输出

    asdjlkw   asd   ppppppppppppppppppp
asdwasd  fgdhpppppppppppppppppp

1.8.2 contains() 

s1.contains("String")   判断s1中是否有String片段  ,返回boolean值

//判断字符串中是否包含 某一段字符串contains,返回类型为boolean
    public static void test6() {
        String s1 = " hello  asdkhello";
        System.out.println(s1.contains("hello"));//true
    }

 1.8.3 endWith(),startsWith()

s1.endWith("String")  判断s1是否以String结尾

s1.startsWith("String") 判断s1是否以String开头    返回boolean值

//判断字符串是否是以某段字符串结尾 或开头的 返回boolean
    public static void test7() {
        String s1 = "asd sdfjlf kkk";
        System.out.println(s1.endsWith("kkk"));//true
        System.out.println(s1.startsWith("asd"));//true
    }

1.9 字符串常量池

凡是出现在双引号中的值,都会被保存在字符串常量池中。

凡是使用new关键字开辟的新空间都是在堆上。

如果没使用new开辟空间,那么对于常量池所存在的数据,有且只能有一个,也就是多个变量可以指向同一个空间

双引号中的数据  系统会先检查常量池中是否有该数据
如果有就直接引用  如果没有就会把该常量放进去
即在常量池中只会维护一个“abcd"对象
public static void test1() {
        //双引号中的数据  系统会先检查常量池中是否有该数据
        //如果有就直接引用  如果没有就会把该常量放进去
        //即在常量池中只会维护一个“aaaaa"对象
        String s1 = "aaaaa";
        String s2 = "aaaaa";

        //在堆上开辟空间 这个堆上的地址中的value指向的是常量池中的数据
        String s3 = new String("aaaaa");
        String s4 = new String("aaaaa");

        System.out.println(s1 == s2);//true

        System.out.println(s3 == s4);//false   //堆上的地址不一样

        System.out.println(s1 == s3);//false
    }

1.10 字符串的不可变性

String类中的字符实际保存在内部维护的value字符数组中

1. String类被final修饰,表名该类不能被继承

2. value被final修饰,表示value自身的值不能改变,既不能引用其它字符数组,但是其引用空间的内容可以被修改

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

1.11 字符串的修改

字符串的修改实际上是创建了新的对象

在循环中进行字符串拼接时,String在每次拼接时都是创建新的对象,很费时间

//在循环中进行字符串拼接时,String在每次拼接时都是创建新的对象,很费时间
    //StringBuffer 和 StringBuilder是根据原来对象进行拼接
    //在循环拼接字符串最好使用StringBuffer 和 StringBuilder
    public static void test3() {
        long start = System.currentTimeMillis();
        String s = "";
        for (int i = 0; i < 100000; i++) {
            s += i;
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);//3019

        start = System.currentTimeMillis();
        StringBuffer s1 = new StringBuffer("");
        for (int i = 0; i < 100000; i++) {
            s1.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);//3


        start = System.currentTimeMillis();
        StringBuilder s2 = new StringBuilder();
        for (int i = 0; i < 100000; i++) {
            s2.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);//2
    }

2. StringBuilder和StringBuffer

2.1 StringBuilder介绍

//String拼接的实质
    public static void test4() {
        String s1 = "abcd";
        //循环内的相当于 s1 += i
        //即String的拼接每次都会 创建一个新的对象以及两次拼接和一次转换
        for (int i = 0; i < 100; i++) {
            StringBuilder sb = new StringBuilder();
            sb.append(s1);
            sb.append(i);
            s1 = sb.toString();//类型转换
        }
        System.out.println(s1);


        //以上代码可以简化为如下
        StringBuilder stringBuilder = new StringBuilder("abcd");
        for (int i = 0; i < 100; i++) {
            stringBuilder.append(i);
        }
        System.out.println(stringBuilder);
    }

2.2 两者的主要区别

//StringBuffer 和 StringBuilder
    public static void test5() {
        StringBuilder stringBuilder = new StringBuilder("asdfghjkl");
        //逆置字符串  String则没有这个方法
        stringBuilder.reverse();
        System.out.println(stringBuilder);
    }

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

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

相关文章

Mysql注入详细讲解

特殊字符 0x3a:0x7e~0x23# 注入基础 联合查询注入(union) :::tips 页面将SQL查询内容显示出来&#xff0c;即为有回显&#xff0c;可以尝试联合查询注入 利用关键字union &#xff0c;union all 拼接恶意SQL语句 ::: 注入流程 有报错&#xff0c;可以利用报错。如&#xff…

day 38 435.无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 968.监控二叉树

435.无重叠区间 思路 为了使区间尽可能的重叠所以排序来使区间尽量的重叠&#xff0c;使用左边界排序来统计重叠区间的个数与452. 用最少数量的箭引爆气球恰好相反。 代码 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(a,…

不同类型的区块链钱包有什么特点和适用场景?

区块链钱包是用于存储和管理加密货币的重要工具&#xff0c;市面上有许多不同类型的区块链钱包可供选择。以下是几种主要类型的区块链钱包及其特点和适用场景。 1.软件钱包&#xff1a; 特点&#xff1a;软件钱包是最常见的一种区块链钱包&#xff0c;通常作为软件应用程序提供…

系统工程 | 系统工程概识

系统工程是为了最好地实现系统的目的&#xff0c;对系统的组成要素、组织结构、信息流、控制机构等进行分析研究的科学方法。 它运用各种组织管理技术&#xff0c;使系统的整体与局部之间的关系协调和相互配合&#xff0c;实现总体的最优运行。 系统工程不同于一般的传统工程…

指针数组与数组指针的理解

typedef struct vexnode {int key;struct arcnode *next; }vexnode, adjlist[MVNUM]; void init(adjlist *list); void init(adjlist *list) {for(size_t i 0; i < MVNUM; i){list[i].key i;list[i].next NULL;} }上述代码编译的时候没有报错&#xff0c;但是运行的时候&…

数据仓库和数据挖掘基础

文章目录 1. 数据仓库基础知识1.1 数据仓库的基本特性1.2 数据仓库的数据模式1.3 数据仓库的体系结构 2. 数据挖掘基础知识2.1 数据挖掘的分类2.2 数据挖掘技术2.3 数据挖掘的应用过程 传统数据库在联机事务处理(OLTP)中获得了较大的成功&#xff0c;但是对管理人员的决策分析要…

LeetCode刷题笔记第2769题:找到最大的可达成数字

LeetCode刷题笔记第2769题&#xff1a;找到最大的可达成数字 题目&#xff1a; 想法&#xff1a; 从题目中可以看出&#xff0c;num经过t次增减变为x&#xff0c;x即为可达成数字。因为要求最大的可达成数字&#xff0c;需要满足num一直增加&#xff0c;x一直减少&#xff0c…

第七节:带你全面理解vue3: 其他响应式进阶API

前言: 针对vue3官网中, 响应式:进阶API 中, 我们在上一章中给大家讲解了shallowRef, shallowReactive, shallowReadonly几个API的使用. 本章主要对剩下的API 进行讲解, 我们先看一下官网中进阶API 都有那些 对于剩下这些API, 你需要了解他们创建目的, 是为了解决之前的API存在…

C语言/数据结构——每日一题(设计循环队列)

一.前言 上一次我们分享了关于队列的基本实现——https://blog.csdn.net/yiqingaa/article/details/139033067?spm1001.2014.3001.5502 现在我们将使用队列知识来解决问题——设计循环队列&#xff1a;https://leetcode.cn/problems/design-circular-queue/submissions/533299…

振弦式渗压计的维护和校准:确保数据准确性的关键步骤

振弦式渗压计是一种用于测量土壤和岩石中孔隙水压力的高精度仪器。它广泛应用于土木工程、水利工程、地质灾害监测等领域&#xff0c;准确性直接影响到工程安全和监测数据的可靠性。因此&#xff0c;对振弦式渗压计进行适当的维护和校准是至关重要的。本文将探讨振弦式渗压计的…

2024-5-6-从0到1手写配置中心Config之实现配置中心客户端

配置加载原理 在Spring中PropertySource类实现了所有属性的实例化。 启动赋值&#xff1a; 定义自定义属性配置源&#xff0c;从config-server获取全局属性&#xff1b;Spring启动时&#xff0c;插入自定义属性配置源&#xff1b;绑定属性会优先使用&#xff0c;给自定义属性…

tomcat jdbc连接池的默认配置配置方案

MySQL 5.0 以后针对超长时间数据库连接做了一个处理&#xff0c;即一个数据库连接在无任何操作情况下过了 8 个小时后(MySQL 服务器默认的超时时间是 8 小时)&#xff0c;MySQL 会自动把这个连接关闭。在数据库连接池中的 connections 如果空闲超过 8 小时&#xff0c;MySQL 将…

python期末作业:批量爬取站长之家的网站排行榜数据并保存,数据分析可视化

爬虫作业,含python爬取数据和保存文件,数据分析使用pyecharts做数据可视化 整体上分析网站的排名,直观看各个网站的热度。 数据分析之后大致的效果: 整个项目分为两个大的部分,第一部分就是抓取网站排名数据,然后保存为Excel、csv等格式,其次就是从文件中…

Advanced Installer 使用教程-自定义操作(下)

1、点击左侧“必要条件”&#xff0c;选择“运行环境” 2、这个运行环境用于设置安装前、中、后&#xff0c;各个阶段的自定义操作 3、安装过程中的自定义操作 1&#xff09;右击基本特征&#xff0c;选择新建程序包先决条件&#xff0c;在弹出的对话框中选择自己的EXE任务程…

Live800:客户为王,企业竞争的新趋势与核心要素!

在企业经营管理中&#xff0c;客户始终是最重要的资源和战略。从企业经营的角度来说&#xff0c;企业管理的核心是客户管理&#xff0c;客户管理的核心是价值创造和价值分配&#xff0c;这是企业经营的基础。这里主要讨论了企业竞争的新趋势与核心要素&#xff0c;认为客户为王…

营收净利双降、股东减持,大降价也救不了良品铺子

号称“高端零食第一股”的良品铺子(603719.SH)&#xff0c;正遭遇部分股东的“用脚投票”。 5月17日晚间&#xff0c;良品铺子连发两份减持公告&#xff0c;其控股股东宁波汉意创业投资合伙企业、持股5%以上股东达永有限公司&#xff0c;两者均计划减持。 其中&#xff0c;宁…

【minio】minio文件访问不到问题记录

问题描述&#xff1a; 项目上上传了logo&#xff0c;但是无法回写logo&#xff0c;但是文件minio路径已经返回&#xff0c;并且到minio服务器上也能下载文件&#xff1b; 解决方案&#xff1a; 1.排查Nginx的代理的minio是否正确 2.登录minio服务查一下文件路径policy是否设置访…

国内大模型价格战全面爆发:新旧势力逐鹿江湖【附主流模型价格对比】

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;大模型逐渐成为行业的焦点。然而&#xff0c;伴随而来的却是一场价格战。DeepSeek率先推出超低价服务&#xff0c;随后字节跳动、阿里巴巴、百度、科大讯飞、腾讯等巨头纷纷跟进&#xff0c;使得这一领域的竞争愈演愈…

研发机构大数据迁移如何保障敏感数据不泄露

随着云计算和大数据技术的飞速进步&#xff0c;越来越多的企业正试图通过数据迁移来提升IT基础设施的效率&#xff0c;减少成本&#xff0c;并增强业务的灵活性。但是&#xff0c;这一过程并非没有它的挑战&#xff0c;尤其是在数据安全方面。数据在转移过程中可能会遭遇黑客攻…

Python使用thread模块实现多线程

介绍&#xff1a; 线程&#xff08;Threads&#xff09;是操作系统提供的一种轻量级的执行单元&#xff0c;可以在一个进程内并发执行多个任务。每个线程都有自己的执行上下文&#xff0c;包括栈、寄存器和程序计数器。 在Python中&#xff0c;可以使用threading模块创建和管理…