Java: String类

news2024/11/17 8:23:40

一 String类

在 Java SE 中,String 类是用于处理字符串的一个非常重要的类。字符串在 Java 中是不可变的(immutable),意味着一旦创建,字符串的内容就不能被修改。所有对字符串的操作实际上都是创建了一个新的字符串对象。

1.String对象的创建

    public static void main1(String[] args) {
        String s=new String("123456");
        String s1="123";
        char[] array={'a','b','c'};
        String s2=new String(array);
        System.out.println(s);
        System.out.println(s1);
        System.out.println(s2);
    }

2.String的比较

2.1String引用的是不同的对象。

public class Test {
    public static void main(String[] args) {
        String a=new String("abc");
        String b=new String("abc");
        String c=a;
        System.out.println(a==b);
        System.out.println(a==c);

String类型a和b分别是不同的地址,a==b就是比较a和b的地址是否相同,所以是false, String c=a;意思是将a的地址赋给c,所以a==c

代码运行结果

2.2 而equals()比较的就是字符串的内容是否相同,如果相同则返回true,否则返回false

    public static void main(String[] args) {
        String a=new String("abc");
        String b=new String("abc");
        String c=a;
        System.out.println(a==b);
        System.out.println(a==c);
        System.out.println(a.equals(b));
        System.out.println(a.equals(c));

运行结果

2.3int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较 

public class Test {
    public static void main(String[] args) {
        String a=new String("abc");
        String b=new String("abcfas");
        String c=a;

        System.out.println(a.compareTo(b));
        System.out.println(a.compareTo(c));
        System.out.println(b.compareTo(c));

3.String的长度引用

     String a=new String("abc");
        System.out.println(a.length());
    

4.字符串的查找

4.1  char charAt(int index)

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

   String s=new String("aaaaavvvvvvvvddddd");
        System.out.println(s.charAt(3));

4.2  int indexOf(int ch)

返回ch第一次出现的位置,没有返回-1 

String s=new String("aaaaavvvvvvvvddddd");
        System.out.println(s.indexOf('a'));

4.3  int indexOf(int ch, int fromIndex)

从fromIndex位置开始找ch第一次出现的位置,没有返回-1 

 String s=new String("aaaaavvvvvvvvddddd");
        System.out.println(s.indexOf('a',3));

4.4  int indexOf(String str)

返回str第一次出现的位置,没有返回-1

String s=new String("aaaaavvvvvvvvddddd");
        System.out.println(s.indexOf("av"));

4.5  nt indexOf(String str, int fromIndex)

从fromIndex位置开始找str第一次出现的位置,没有返回-1 

String s=new String("aaaaavvvvvvvvddddd");
        System.out.println(s.indexOf("av",5));

4.6  nt lastIndexOf(int ch)

从后往前找,返回ch第一次出现的位置,没有返回-1 

  String s=new String("aaaaavvvvvvvvddddd");
        System.out.println(s.lastIndexOf("v"));

4.7  int lastIndexOf(int ch, int fromIndex)

从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返 回-1 

String s=new String("aaaaavvvvvvvvddddd");
        System.out.println(s.lastIndexOf("v",11));

4.8  int lastIndexOf(String str)

从后往前找,返回str第一次出现的位置,没有返回-1 

String s=new String("aaaaavvvvvvvvddddd");
        System.out.println(s.lastIndexOf("vvv"));

4.9  int lastIndexOf(String str, int fromIndex)

从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返 回-1 

        String s=new String("aaaaavvvvvvvvddddd");
        System.out.println(s.lastIndexOf("vvvv",8));

5.字符串的转化

5.1数值和字符串转化

数字转字符串

public class Test {
    public static void main(String[] args) {
        String s1=String.valueOf(1234);
        String s2=String.valueOf(12.34);
        String s3=String.valueOf(true);
        String s4=String.valueOf(new Student("ha",12));
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);

    }

 字符串转数字

public class Test {
    public static void main(String[] args) {
        int month=Integer.parseInt("1234");
        double month2=Double.parseDouble("12.12");
        System.out.println(month+1);
        System.out.println(month2+2);
    }

 5.2大小写的转化

public class Test {
    public static void main(String[] args) {
        String s=new String("abUIUuks");
        System.out.println(s.toUpperCase());
        System.out.println(s.toLowerCase());
    }

5.3字符串和数组的转化

字符串转数组

public class Test {
    public static void main(String[] args) {
        String s=new String("abcd");
        char[] arr=s.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println();
    }

数组转字符串

public class Test {
    public static void main(String[] args) {
        String s=new String("abcd");
        char[] arr=s.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println();
        //数组转字符串
        String s1=new String(arr);
        System.out.println(s1);
    }

5.4格式化

public class Test {
    public static void main(String[] args) {
        String s=String.format("%d-%d-%d",2019,9,14);
        System.out.println(s);
    }

6.字符串的替换

String replaceAll(String regex, String replacement)

替换所有的指定内容

String replaceFirst(String regex, String replacement)

替换首个指定内容 

    public static void main(String[] args) {
        String s=new String("abdhhhhddd");
        System.out.println(s.replaceAll("h","m"));
        System.out.println(s.replaceFirst("h","m"));
    }

7.字符串的拆分

String[] split(String regex)

将字符串全部拆分

public static void main(String[] args) {
        String s="helloworld";
        String[] a=s.split("w");
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }

String[] split(String regex, int limit)

将字符串以指定的格式,拆分为limit组

public class Test {
    public static void main(String[] args) {
        String s="helloworwld";
        String[] a=s.split("w",3);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }

8.字符串的截取

1.String substring(int beginIndex)

从指定索引截取到结尾

2.String substring(int beginIndex, int endIndex)

截取部分内容 

public class Test {
    public static void main(String[] args) {
        String s=new String("sda156");
        System.out.println(s.substring(2));
        System.out.println(s.substring(2,5));
    }

9.others

String trim()

去掉字符串中的左右空格,保留中间空格

public class Test {
    public static void main(String[] args) {
        String s=new String("  123FD  123  ");
        System.out.println(s.trim());
    }

二 字符串的不可变性

String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为: 

 

并不是因为String类被final修饰,才不可变,而是因为value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改,并且由于被private修饰,所以无法被引用,所以空间里面的内容无法被修改。

所以String无法被修改,String 类的不可变性意味着每次对字符串的修改都会生成一个新的字符串对象

三 字符串的修改

 所以String无法被修改,String 类的不可变性意味着每次对字符串的修改都会生成一个新的字符串对象。

public class Test {
    public static void main(String[] args) {
        String s=new String("hello");
        String a=s+" "+"world";
        System.out.println(a);
    }

在上面的代码中,a+ " World" 并不会修改原来的 s 对象,而是生成了一个新的字符串 "Hello World",然后将其赋值给 a变量。原来的 "Hello" 字符串仍然保存在内存中,直到垃圾回收机制将其清除。 

四 StringBuilder和StringBuffer 

1.StringBuff append(String str)

在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、 double、float、int、long、Object、String、StringBuff的变量

   StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.append("abc"));

2.char charAt(int index)

获取index位置的字符

StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.charAt(1));

3.int length()

获取字符串的长度

StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.length());

4.int capacity()

获取底层保存字符串空间总的大小

StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.capacity());

5.void setCharAt(int index, char ch)

将index位置的字符设置为ch

StringBuilder s=new StringBuilder("abc123");
        //s.setCharAt(1,'j');
        //System.out.println(s);

6.int indexOf(String str)

返回str第一次出现的位置

 StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.indexOf("b"));

7.int indexOf(String str, int fromIndex)

从fromIndex位置开始查找str第一次出现的位置

 StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.indexOf("b",1));

8.int lastIndexOf(String str)

返回最后一次出现str的位置

 StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.lastIndexOf("a"));

9.int lastIndexOf(String str, int fromIndex)

从fromIndex位置开始找str最后一次出现的位置

StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.lastIndexOf("a",1));

10.StringBuffer deleteCharAt(int index)

删除index位置字符

 StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.deleteCharAt(3));

11.StringBuffer delete(int start, int end)

删除[start, end)区间内的字符

 StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.delete(3,4));

12.StringBuffer replace(int start, int end, String str)

将[start, end)位置的字符替换为str

 StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.replace(3,4,"uuuu"));

13.String substring(int start)

从start开始一直到末尾的字符以String的方式返回

StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.substring(5));

14.String substring(int start,int end)

将[start, end)范围内的字符以String的方式返回 

 StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.substring(5,6));

15.StringBuffer reverse()

反转字符串

StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.reverse());

16.String toString()

将所有字符按照String的方式返回

  StringBuilder s=new StringBuilder("abc123");
        System.out.println(s.toString());

String、StringBuffer、StringBuilder的区别

特性StringStringBufferStringBuilder
可变性不可变可变可变
线程安全线程安全线程安全非线程安全
同步机制不需要方法是同步的 (synchronized)没有同步机制
性能性能较差(频繁修改时)性能较好,但比 StringBuilder性能最好
使用场景字符串内容固定,少有修改多线程环境下需要频繁修改字符串单线程环境下需要频繁修改字符串

五 例题

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

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

class Solution {
    public int firstUniqChar(String s) {
        int[] count=new int[26];
        for(int i=0;i<s.length();i++){
            char ch=s.charAt(i);
            count[ch-'a']++;
        }

          for(int i=0;i<s.length();i++){
            char ch=s.charAt(i);
            if(count[ch-'a']==1){
                return i;
            }
        }
        return -1;
    }
}

 2.最后一个单词的长度

计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)

第一种方法

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s=in.next();
        String[] arr=s.split(" ");
        int len=arr[arr.length-1].length();
        System.out.println(len);
    }
}

第二种方法

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s=in.next();
        int index=s.lastIndexOf(" ");
        int len=s.substring(index+1).length();
        System.out.println(len);

    }
}

3.检测字符串是否为回文 

class Solution {
       public boolean isPalindrome(String s) {
        s=s.toLowerCase();
        int left=0;
        int right=s.length()-1;
        while(left<right){
            while(left<right && !judge(s.charAt(left))){
                left++;
            }
            while(left<right && !judge(s.charAt(right))){
                right--;
            }
            if(s.charAt(left)==s.charAt(right)){
                left++;
                right--;
            }else{
                return false;
            }
        }
        return true;
    }
    private boolean judge(char arr){
        if(Character.isDigit(arr)|| Character.isLetter(arr)){
            return true;
        }
        return false;
    }
}

        希望能对大家有所帮助!!!!

 

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

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

相关文章

提升效率,C4D云渲染教程来了

因为C4D主要搭配的渲染器OCtane和Redshift都是GPU渲染器&#xff0c;阿诺德渲染器也可能直接用GPU渲染&#xff0c;所以大部分C4D渲染农场都支持用RTX2080、3090、4090系列显卡云渲染&#xff0c;云渲染追求速度&#xff0c;分机渲染任务&#xff0c;比如分100台机器渲染一个相…

【算法】二叉树中的 DFS

【ps】本篇有 6 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;计算布尔二叉树的值 .1- 题目解析 .2- 代码编写 2&#xff09;求根节点到叶节点数字之和 .1- 题目解析 .2- 代码编写 3&#xff09;二叉树剪枝 .1- 题目解析 .2- 代码编写 4&#x…

手机浏览器如何切换IP‌?多种方法任你选

在数字化时代&#xff0c;手机已成为我们日常生活中不可或缺的一部分&#xff0c;而手机浏览器则是我们访问互联网的重要工具。然而&#xff0c;有时出于隐私保护、访问限制规避或其他需求&#xff0c;我们可能需要切换手机浏览器的IP地址。本文将详细介绍多种在手机上切换浏览…

主流数据库与最佳备份工具选择

文章目录 前言选择备份工具的考虑因素1、数据库兼容性&#xff1a;2、备份性能&#xff1a;3、恢复能力&#xff1a;4、备份策略与灵活性&#xff1a;5、数据安全性&#xff1a; 主流数据库概述1、Oracle2、PostgreSQL3、Microsoft SQL Server4、MongoDB 备份工具推荐1、Oracle…

C++手动实现栈、和队列

栈的实现 头文件 #ifndef MY_STACK_H #define MY_STACK_H #include <iostream>using namespace std;class my_stack { private:int *base;//动态栈指针int top;//栈顶元素int size;//栈大小 public:my_stack();//无参构造my_stack(int size):top(-1),size(size){base …

机器学习——Bagging

Bagging&#xff1a; 方法&#xff1a;集成n个base learner模型&#xff0c;每个模型都对原始数据集进行有放回的随机采样获得随机数据集&#xff0c;然后并行训练。 回归问题&#xff1a;n个base模型进行预测&#xff0c;将得到的预测值取平均得到最终结果。 分类问题&#xf…

每日 GitHub 探索|构建强大 LLM 管道和优化 AI 聊天框架

探索 DSPy&#xff0c;一款用于优化 LLM 提示和权重的框架。了解 Anthropic Cookbook&#xff0c;该代码库提供使用 Anthropic 强大 AI 模型的可复制代码片段。此外&#xff0c;还有 LobeChat&#xff0c;一个开源、现代设计的 AI 聊天框架&#xff0c;支持多种 AI 供应商和功能…

AI大模型全套学习资料

前言 如果您也对AI大模型感兴趣想学习却苦于没有方向&#x1f440; 小编给自己收藏整理好的学习资料分享出来给大家&#x1f496; &#x1f449;获取方式&#xff1a; &#x1f61d;有需要的小伙伴&#xff0c;可以保存图片到wx扫描二v码关注免费领取【保证100%免费】&#x1…

C盘太满了 用这五个步骤彻底的清理C盘垃圾 真干净!

C盘太满了 用这五个步骤彻底的清理C盘垃圾 真干净&#xff01;C盘忽然满了&#xff0c;这个问题长期困扰着大家&#xff0c;因为太多的人不知道怎么去清理C盘了&#xff0c;毕竟C盘的结构确实是太复杂了&#xff0c;也不是一般人能够充分了解的&#xff0c;所以就间接的导致了大…

代码随想录算法训练营第55天 | 寻找存在的路径

寻找存在的路径 题目描述 给定一个包含 n 个节点的无向图中&#xff0c;节点编号从 1 到 n &#xff08;含 1 和 n &#xff09;。 你的任务是判断是否有一条从节点 source 出发到节点 destination 的路径存在。 输入描述 第一行包含两个正整数 N 和 M&#xff0c;N 代表节点…

openpnp - 为了防止物料操作混乱,做一张物料分布位置图清晰一些

文章目录 openpnp - 为了防止物料操作混乱&#xff0c;做一张物料分布位置图清晰一些概述笔记做子装配图做总装配图备注END openpnp - 为了防止物料操作混乱&#xff0c;做一张物料分布位置图清晰一些 概述 看网上资料&#xff0c;当openpnp贴片机上料后&#xff0c;为了防止…

海山数据库(He3DB)+AI(四):一种基于迁移学习的启发式数据库旋钮调优方法

文章目录 0 前言1 OpAdviser1.1 主要工作1.2 总体流程 2 确定搜索空间2.1 相似任务识别2.2 有效区域提取2.3 多数加权投票 3确定优化器3.1 元特征提取3.2 离线数据生成3.3 Meta-Ranker构建 4 参考文献 0 前言 在海山数据库(He3DB)AI&#xff08;三&#xff09;中&#xff0c;介…

华润置地基于Apache SeaTunnel构建统一数据集成框架

作者&#xff1a;田力、陈允德 编辑整理&#xff1a;曾辉 引言 随着数字化转型的深入&#xff0c;企业对数据集成与处理的需求不断提升&#xff0c;如何高效、灵活地处理多系统、多数据源的同步&#xff0c;成为企业数据系统建设中的关键挑战。 在这篇文章中&#xff0c;来自…

display:flex;和margin的妙用

想要实现这样的效果&#xff1a; 第一个想法就是使用display:flex;justify-content: space-between; 所以想要得到效果&#xff0c;一般来说还需要在盒子外面再套一层盒子才行&#xff0c;但是也可以使用margin来实现。 <!DOCTYPE html> <html lang"en"&g…

makefile和CMakeLists/C++包管理器

make 大家可能会很奇怪&#xff0c;都什么年代了&#xff0c;还学makefile&#xff0c;cmake都有些过时了&#xff0c;为什么还要再学这个呢&#xff1f; 我是这么看待这个问题的&#xff0c;cmake跨平台性还是很有有优势的&#xff0c;有着多年积累的底蕴&#xff0c;借助大模…

c++反汇编逆向还原——do while循环(笔记)

c反汇编逆向还原代码do while循环的实现 涉及到的汇编指令mov、lea、cmp、jle、push 一、汇编 汇编代码 涉及到的指令 mov &#xff1a;将源操作数复制到目的操作数 lea &#xff1a;与mov类似 mov a&#xff0c;b 表示将b赋值给a 若是 mov a&#xff0c;[b] 这是将b的…

OpenAI首席技术官Mira Murati宣布她将离开公司

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

解决VsCode不显示环境名称

在VSCODE终端中激活运行的conda环境&#xff0c;但是只显示PS&#xff0c;并不显示环境名称 PS D:\Code\Pro\003_pro> 解决方法&#xff1a;以管理员权限打开PowerShell 方式1&#xff1a;在Cortana搜索栏中打开带管理员权限的PowerShell 在Windows 10的任务栏搜索框输入p…

Ansible-template模块动态生成特定文件

文章目录 一、Jinja2介绍什么是主要特性安装基本用法进阶特性总结 Jinja2与Ansible关系1. 模板引擎2. Ansible 的依赖3. 变量和模板4. 动态生成配置5. 社区和生态系统总结 二、Ansible如何使用Jinja2使用template模块Jinja2文件中使用判断和循环Jinja2文件中使用判断语法 Jinja…

一文读懂Service以及实践攻略

一文读懂Service以及实践攻略 目录 1 一文读懂 Kubernetes Service 以及实践攻略 1.1 1. 什么是 Service&#xff1f; 1.1.1 为什么需要 Service&#xff1f; 1.2 2. Service 的工作原理 1.2.1 核心概念1.2.2 流量转发过程 1.3 3. Service 的几种类型及应用场景 2 实践&#…