【Java】字符串String

news2024/12/23 12:32:11

目录

1.字符串的构造

2.字符串转换 

2.1字符串与数值转换

2.2大小写转换 

2.3字符串转数组 

2.4格式化 

3.字符串操作

3.1字符串比较

3.2字符串查找

3.3字符串替换

3.4字符串拆分

3.5字符串截取 

3.6去除空格

4.字符串的不可变性

5.字符串修改

5.1StringBuffer的高效率

5.2 常用方法

6.小练习oj


1.字符串的构造

Ctrl 进入后我们看见String类是被final修饰的,说明不可以被继承

后面的Comparable接口说明字符串支持比较大小

public class Main {
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = new String("hello");//同上
        char[] arr = {'a','b','c','d'};//Java中没有“字符串以'\0'结尾”这一概念
        String str3 = new String(arr);
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);//abcd
        String str4 = "";//str4指向的对象中没有任何数据
        String str5 = null;//str5不指向任何对象
        System.out.println(str4.isEmpty());//true
        //System.out.println(str5.isEmpty());//空指针异常
        System.out.println("hello".length());
    }
}

2.字符串转换 

2.1字符串与数值转换

class Student {
    public String name;
    public 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 s1 = String.valueOf(12345);
        String s2 = String.valueOf(true);
        String s3 = String.valueOf(new Student("zhangsan",18));
        System.out.println(s1);//12345
        System.out.println(s2);//true
        System.out.println(s3);//Student{name='zhangsan', age=18}
        //字符串转数字
        int data1 = Integer.valueOf("123");
        int data2 = Integer.parseInt("456");
        System.out.println(data1);//123
        System.out.println(data2);//456
    }
}

2.2大小写转换 

public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "WORLD";
        System.out.println(s1.toUpperCase());//小写转大写
        System.out.println(s2.toLowerCase());//大写转小写
        String ret1 = s1.toUpperCase();//两种方法都可以
        String ret2 = s2.toLowerCase();
        System.out.println(ret1);
        System.out.println(ret2);
    }
}

2.3字符串转数组 

import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        String str = "hello world";
        char[] arr = str.toCharArray();
        System.out.println(Arrays.toString(arr));//[h, e, l, l, o,  , w, o, r, l, d]
    }
}

2.4格式化 

public class Test {
    public static void main(String[] args) {
        String str = String.format("%d %d %d",2023,5,4);//类似于C语言
        System.out.println(str);//2023 5 4
    }
}

3.字符串操作

3.1字符串比较

public class Main {
    //1.比较相等
    public static void main(String[] args) {
        String str1 = new String("hello");
        String str2 = new String("hello");
        System.out.println(str1 == str2);//false---比较的是两个字符串的地址
        System.out.println(str1.equals(str2));//true---String中重写了equals方法,比较的是内容

        String str3 = "abc";//和上面不同,这里是直接赋值
        String str4 = "abc";//str3和str4指向的是同一块内存
        System.out.println(str3 == str4);//true---常量池的概念
    }
    //2.比较大小
    public static void main1(String[] args) {
        String str1 = "abcde";
        String str2 = "abde";
        System.out.println(str1.compareTo(str2));//-1
        String str3 = "abcd";
        String str4 = "abCd";
        System.out.println(str3.compareTo(str4));//32
        System.out.println(str3.compareToIgnoreCase(str4));//0---忽略大小写
    }
}

3.2字符串查找

方法功能
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
public class Test {
    public static void main(String[] args) {
        String str = "hello";
        char ch = str.charAt(1);
        System.out.println(ch);//e

        System.out.println(str.indexOf('l'));//2
        System.out.println(str.indexOf('l', 3));//3
        System.out.println(str.indexOf("ll"));//2
        System.out.println(str.indexOf("ll", 3));//-1

        System.out.println(str.lastIndexOf('l'));//3
        System.out.println(str.lastIndexOf('l',2));//2
        System.out.println(str.lastIndexOf("ll"));//2
        System.out.println(str.lastIndexOf("ll",1));//-1
    }
}

3.3字符串替换

public class Test {
    public static void main(String[] args) {
        String s1 = "abcdabvdabcd";
        String ret1 = s1.replace('a','o');//替换单个字符
        String ret2 = s1.replace("ab","oo");//替换所有字符
        String ret3 = s1.replaceFirst("ab","oo");//替换第一次出现的字符
        String ret4 = s1.replaceAll("ab","oo");//替换所有字符
        System.out.println(ret1);//obcdobvdobcd
        System.out.println(ret2);//oocdoovdoocd
        System.out.println(ret3);//oocdabvdabcd
        System.out.println(ret4);//oocdoovdoocd
    }
}

3.4字符串拆分

注意:正则表达式

1> 字符 ' | ',' * ',' . ',' + ' 都要加上' \\ ';

2> ' \ ' 就要写成 ' \\\\ ';

3> 如果一个字符串中有多个分隔符,用 ' | ' 作为连字符。

public class Test {
    public static void main(String[] args) {
        String str1 = "hello world I love coding";
        String[] ret1 = str1.split(" ");//以空格分割
        String[] ret2 = str1.split(" ",2);//限制分为两组,但不会均分
        System.out.println(Arrays.toString(ret1));//[hello, world, I, love, coding]
        System.out.println(Arrays.toString(ret2));//[hello, world I love coding]

        String str2 = "2023.5.4";
        String[] ret3 = str2.split("\\.");//注意!!
        System.out.println(Arrays.toString(ret3));//[2023, 5, 4]

        String str3 = "abc\\def\\ghi";
        String[] ret4 = str3.split("\\\\");
        System.out.println(Arrays.toString(ret4));//[abc, def, ghi]

        String str4 = "abcd&1234*ABCD";
        String[] ret5 = str4.split("&|\\*");
        System.out.println(Arrays.toString(ret5));//[abcd, 1234, ABCD]
    }
}

3.5字符串截取 

public class Test {
    public static void main(String[] args) {
        String str = "hello";
        String ret1 = str.substring(1);
        String ret2 = str.substring(1,3);//注意左闭右开[1,3)
        System.out.println(ret1);//ello
        System.out.println(ret2);//el
    }
}

3.6去除空格

public class Test {
    public static void main(String[] args) {
        String str = "  hell o wor l d    ";
        String ret = str.trim();//去除左右空格,保留中间空格
        System.out.println(ret);//hell o wor l d
    }
}

4.字符串的不可变性

Ctrl 进入后我们发现:

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

2> value被final修饰,表明value自身的值不能改变,即不能引用其他字符数组,但是其引用空间中的内容可以修改;

3> 所有对String的修改,都不是在原有的基础上改动,而是创建新对象,改变新对象

String类为何设计成不可变的?(后续讲解)

1> 方便实现字符串对象池;

2> 不可变对象是线程安全的;

3> 不可变对象更方便缓存 hash code,作为key时可以更高效的保存到HashMap中。

public class Main {
    public static void main(String[] args) {
        final int[] arr = {1,2,3,4,5};
        arr[0] = 10;//引用对象中的内容可以修改
        System.out.println(Arrays.toString(arr));
        //arr = new int[]{6,7,8,9};//该引用变量不能引用其他对象
    }
}

5.字符串修改

因为String类的不可变性,应尽量避免直接对String类对象进行修改,又因为所有的修改都会创建新的对象,效率十分低下。这时候就需要 StringBuilderStringBuffer 出马了~

StringBuffer 和 StringBuilder大部分功能相似区别:StingBuffer采用同步处理(同步:synchronized),属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作。

与String的区别:String的内容不可修改,这俩的内容可以修改。

以下均用StringBuffer 指代: 

5.1StringBuffer的高效率

public class Main {
    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(end - start);//222
        //StringBuffer
        start = System.currentTimeMillis();
        StringBuffer sbf = new StringBuffer("");
        for(int i = 0; i < 10000; ++i) {
            sbf.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);//0
        //StringBuilder
        start = System.currentTimeMillis();
        StringBuilder sbd = new StringBuilder();
        for(int i = 0; i < 10000; ++i) {
            sbd.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);//1
    }
}

222---1---0,1和0之间的差距可忽略不计。由此可见,这俩的效率可不是一般的高。 

5.2 常用方法

方法说明
StringBuffer append ( String str )在尾部追加,相当于 String 的+=
StringBuffer insert ( int offset, String str )在 offset 位置插入 str
StringBuffer deleteCharAt ( int index )删除 index 位置的字符
StringBuffer delete ( int start, int end )删除 [ start, end ) 区间内的字符
StringBuffer replace ( int start, int end, String str )将 [ start, end ) 位置的字符替换为str
StringBuffer reverse ()反转字符串
String toString ()将所有字符按照 String 方式返回
public class Main {
    public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer("hello");
        stringBuffer.insert(1,"abc");
        System.out.println(stringBuffer);//habcello
        stringBuffer.delete(1,3);//[1,3)
        System.out.println(stringBuffer);//hcello
        stringBuffer.reverse();
        System.out.println(stringBuffer);//ollech
        stringBuffer.append("world");
        System.out.println(stringBuffer);//ollechworld
        String str = stringBuffer.toString();//将所有字符按照String的方式返回
    }
}

6.小练习oj

字符串中的第一个唯一字符

字符串最后一个单词的长度

验证回文串


还有最后一个异常,JavaSE就结束啦!哦吼吼嘿嘿~~

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

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

相关文章

基于FreeRTOS的CPU利用率计算教程详解(STM32版)

前言&#xff1a;FreeRTOS 是一个 RTOS 类的嵌入式实时操作系统&#xff0c;作为实时操作系统其必定拥有任务调度的属性。通过系统自身的任务调度算法实现任务安全且高效的切换&#xff0c;这就不可避免的引出了各个任务对 CPU 的利用率问题&#xff08;裸机情况下 CPU 利用率默…

自行车和电动自行车上亚马逊标准有什么区别?UL2849,16CFR1512

自行车 自行车是一种两轮的或三轮的交通工具&#xff0c;完全靠人力驱动后轮前进。本政策所涵盖的自行车包括当座位调整到最高位置时&#xff0c;座位离地面超过 25 英寸的自行车&#xff0c;以及座位高度为 25 英寸或以下的人行道自行车。本政策也适用于公路使用的卧式自行车…

有人看好、有人唱衰,无代码能不能开发复杂应用?

司马说 工欲善其事&#xff0c;必先利其器&#xff0c;软件开发也是如此。《人月神话》有一章的标题就是“巧匠因为他的工具而出名”。软件开发与编码工作是一项枯燥无味的任务&#xff0c;但现在这项工作很可能利用软件本身来完成。 无代码开发颠覆了传统编码的开发模式&#…

【工具使用】- git实现gitee托管代码以及检出代码

1. 下载Git工具 git下载地址1&#xff1a;https://git-scm.com/download/win git下载2&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/github-release/git-for-windows/git/Git%20for%20Windows%202.40.1/ 下载完成后安装 安装直接执行exe可执行程序&#xff0c;下一步…

晒出新高度?2023夏季小红书防晒趋势前瞻

夏日将临&#xff0c;防晒需求激增&#xff0c;进入市场旺季。今年防晒赛道朝着“防护升级&#xff0c;多面兼顾”大势发展。 哪些趋势值得关注&#xff1f;本期&#xff0c;千瓜将通过小红书数据分析和笔记内容洞察&#xff0c;为品牌提供数据支持和方向参考。 月增长高达501.…

分布式事务 [面试]

1. 基础概念 1.1 什么是事务 事务可以看做是一次大的活动&#xff0c;它由不同的小活动组成&#xff0c;这些活动要么全部成功&#xff0c;要么全部失败。 1.2 本地事务 在计算机系统中&#xff0c;更多的是通过关系型数据库来控制事务&#xff0c;这是利用数据库本身的事务…

TBSS和dpabifiber

以前用过TBSS&#xff0c;最近好久没用&#xff0c;又忘记了&#xff0c;现在重新捡起来。 首先是QSIprep和QSIrecon。 QSIPrep预处理后&#xff0c;文件夹包括anat和dwi。anat和fmriprep是一样的&#xff0c;就不介绍了。 dwi&#xff1a; 可以看出&#xff0c;这些就是在原始…

全景丨0基础学习VR全景制作,平台篇第16章:热点功能-图片

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01; 功能说明 应用场景 热点&#xff0c;指在全景作品中添加各种类型图标的按钮&#xff0c;引导用户通过按钮产生更多的交互&#xff0c;增加用户的多元化体验。 图片热点&#xff0c;即点击热点后弹出单张…

总结841

学习目标&#xff1a; 5月&#xff08;张宇强化前10讲&#xff0c;背诵25篇短文&#xff0c;熟词僻义300词基础词&#xff09; 每日必复习&#xff08;5分钟&#xff09; 重做了5道记录本上的极限题&#xff0c;值得庆幸的是&#xff0c;有一道极限题之前有三种解法&#xff…

【c语言】函数递归调用

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ…

98. 验证二叉搜索树【68】

难度等级&#xff1a;中等 上一篇算法&#xff1a; 剑指 Offer 54. 二叉搜索树的第k大节点【37】 力扣此题地址&#xff1a; 98. 验证二叉搜索树 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;98. 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断…

阿里云服务器配置选择流程(2023新版教程)

阿里云服务器ECS选购指南&#xff0c;阿里云百科分享2023阿里云服务器新手选择流程&#xff0c;选购云服务器有两个入口&#xff0c;一个是选择活动机&#xff0c;只需要选择云服务器地域、系统、带宽即可&#xff1b;另一个是在云服务器页面&#xff0c;自定义选择云服务器配置…

Cartographer源码阅读---点云数据的预处理

上一节我们已经看到了, 传感器数据是通过CollatedTrajectoryBuilder类的HandleCollatedSensorData函数 传递给 GlobalTrajectoryBuilder类的相应函数. 从GlobalTrajectoryBuilder开始, 传感器数据才真正进入到Cartographer的前后端. Cartographer最重要的数据类型就是点云, 所以…

软件著作权审查时间、软件导刊审稿周期、计算机工程与应用审稿周期、计算机技术与发展审稿周期、电子测量与仪器学报审稿周期

目录 《软件著作权》审查时间《软件导刊》审稿周期《计算机工程与应用》审稿周期《计算机技术与发展》审稿周期《电子测量与仪器学报》审稿周期 《软件著作权》审查时间 2022年申请软著的时间节点&#xff1a; 11.15受理通知书 11.15审查中 12.3审批中 12.20审查中 12.24待发放…

如何利用ChatGPT API 搭建私人 AI会话

搭建私有ChatGPT 访问谷歌的方式自行解决一、Github域名和证书私有服务器开始搭建私有Open Ai 访问谷歌的方式自行解决 对不起&#xff0c;没有魔法者止步&#xff01;没有 API 止步&#xff01; 对不起&#xff0c;没有魔法者止步&#xff01;没有 API 止步&#xff01; 对不…

C#医院手术麻醉临床信息管理系统源码:操作指南(一)

手术麻醉系统操作指南&#xff1a; 1.麻醉管理 手术管理包括:手术申请、手术安排、查看手术申请单、手术通知单&#xff0c;填写病人术前会诊记录、谈话记录、麻醉记录、手术记录、附加手术、术后信息及手术回顾等功能。 &#xff08;1&#xff09;手术申请 【功能】&#…

亚马逊cpc常见产品测试合集

CPC认证就是儿童产品安全证书&#xff08;Children’s Product Certificate, CPC&#xff09;&#xff0c;适用于所有以12岁及以下儿童为主要目标使用对象的产品&#xff0c;如玩具、摇篮、儿童服装等。 如在美国本地生产则由制造商负责提供&#xff0c;如在其他国家生产则由进…

电脑文件夹拒绝访问,如何解决?

案例&#xff1a;打不开电脑文件夹怎么办&#xff1f; 【今天工作的时候&#xff0c;需要打开文件夹查找资料&#xff0c;但是这个文件无法打开&#xff0c;提示拒绝访问。有没有小伙伴也遇到过这种情况&#xff1f;最后是怎么解决的&#xff1f;】 使用电脑的过程中&#xf…

自定义构建docker镜像

创建dockerfile 我们新建一个目录docker_test&#xff0c;然后在这个目录下新建一个dockerfile文件&#xff0c;文件内容如下&#xff1a; FROM centos VOLUME ["volume01","volume02"] CMD echo "......end......" CMD /bin/bash这些是docker…

Vue.js核心概念简介:组件、数据绑定、指令和事件处理

本文介绍了Vue.js的四个核心概念&#xff1a;组件、数据绑定、指令和事件处理。每个概念都通过一个简单的示例进行了详细的解释。通过学习这些概念&#xff0c;您将能够充分利用Vue.js的强大功能&#xff0c;构建高效、灵活的Web应用程序。 1 组件 组件是Vue.js的核心概念之一…