Java String类(1)

news2025/2/26 19:42:23

String类的重要性

我们之前在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据的方法分离开的方式不符合面向对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。

而且在现在的开发和校招笔试中,String类更是举足轻重,所以今天就让我们看看String类。

常用方法

字符串构造

String类中提供的构造方式非常多,常用的就有以下三种:

 public static void main(String[] args) {
        //使用常量字符串构造
        String s1 = "hello world";
        System.out.println(s1);

        //直接newString对象
        String s2 = new String("hello world");
        System.out.println(s2);

        //使用字符数组进行构造
        char[] array = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'};
        String s3 = new String(array);
        System.out.println(s3);
    }

注意:

1.String是引用类型,内部并不存储字符串本身,在String类的实现源码中,String类的实例变量如下:

 我们可以看出:String主要有两个成员:value[ ], hash.

hash:在 Java 中,String 类中的 hash 是通过 hashCode() 方法计算的,而 hashCode() 方法是根据字符串的内容计算得到的。当你调用 hashCode() 方法时,实际上是根据字符串的字符内容来计算一个哈希码值。一般hash默认为0

value[ ]:在 Java 中,String 类中的 value[] 是一个字符数组,它存储了字符串的字符内容。每个 String 对象都有一个 value[] 数组来存储字符串的字符,这个数组是 private final char[] 类型的

public static void main(String[] args) {
        //s1和s2引用的是不同的对象 s1和s3引用的是不同对象
        String s1 = new String("hello");
        String s2 = new String("world");
        String s3 = s1;
        String s4 = "";//表明指向的对象是空的
        String s5 = null;//表明不指向任何对象

        System.out.println(s1.length());//获取字符串的长度-输出5
        //isEmpyt():检查字符串是否是空,如果是空返回true,不是空返回false
        System.out.println(s1.isEmpty());//false
        System.out.println(s4.isEmpty());//true
        System.out.println(s5.isEmpty());//空指针异常
    }

2.在Java中,用""引起来的也是String类型的对象

String对象的比较

字符串的比较也是常见的操作之一,比如:字符串排序。Java中共提供了4种方式:

1.==比较是否引用的是同一对象

注意:对于内置类型(int等基础类型等),==比较的是变量中的值;对于引用类型,==比较的是引用中的地址。

public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int c = 10;

        //对于基本类型变量,==比较的是两个变量中存储的值是否相同
        System.out.println(a == b);//false
        System.out.println(a == c);//true

        //对于引用类型变量,==比较的是两个引用变量引用的是否为同一个对象
        String s1 = new String("hello");
        String s2 = new String("hello");
        String s3 = new String("world");
        String s4 = s1;
        System.out.println(s1 == s2);//false
        System.out.println(s2 == s3);//false
        System.out.println(s1 == s4);//true
    }

2.boolean equals(Object anObject)方法:按照字典序比较

字典序:字符大小的顺序

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

public boolean equals(Object anObject) {
    // 1. 先检测this 和 anObject 是否为同一个对象比较,如果是返回true
    if (this == anObject) {
        return true;
    } 

    // 2. 检测anObject是否为String类型的对象,如果是继续比较,否则返回false
    if (anObject instanceof String) {
        // 将anObject向下转型为String类型对象
        String anotherString = (String)anObject;
        int n = value.length;

        // 3. this和anObject两个字符串的长度是否相同,是继续比较,否则返回false
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;

            // 4. 按照字典序,从前往后逐个字符进行比较
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            } 
            return true;
        }
    } 
    return false;
}

举个使用的例子:

 public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("hello");
        String s3 = new String("Hello");

        //s1,s2,s3引用的是三个不同的对象,因此==比较全部为false
        System.out.println(s1 == s2);//false
        System.out.println(s1 == s3);//false

        //equals比较:String对象中的逐个字符
        //虽然s1和s2引用的是不同的对象,但是两个对象中放置的内容相同
        //s1和s3引用的是不同的对象,而且两个对象中的内容也不同
        System.out.println(s1.equals(s2));//true
        System.out.println(s1.equals(s3));//false
    }

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

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

1.先按字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值

2.如果前k个字符相等(k为两个字符长度最小值),返回值为两个字符串的差值

  public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = new String("ac");
        String s3 = new String("abc");
        String s4 = new String("abcdef");

        System.out.println(s1.compareTo(s2));//不同输出字符差值-1
        System.out.println(s1.compareTo(s3));//相同输出0
        System.out.println(s1.compareTo(s4));//前k个字符完全相同,返回长度差值-3
    }

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

字符串查找

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

方法功能
char charAt(int index)

返回index位置上的字符,如果index负数或者越界,抛出

IndexOutOfBoundsException异常

int indexOf(int ch)返回ch第一次出现的位置,没有则返回-1
int indexOf(int ch, int fromIndex)从fromIndex位置开始找ch第一次出现的位置
int IndexOf(String str)

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

int IndexOf(String str, int fromIndex)从fromIndex位置开始找str第一次出现的位置,没有返回-1
int lastIndexOf(int ch)

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

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

下面以一段字符串来举个例子:

 public static void main(String[] args) {
        String s = "aaabbbcccaaabbbccc";
        System.out.println(s.charAt(3));//'b
        System.out.println(s.indexOf('d'));//-1
        System.out.println(s.indexOf('c'));//6
        System.out.println(s.indexOf('c', 10));//15
        System.out.println(s.indexOf("bbb"));//3
        System.out.println(s.indexOf("bbb", 10));//12
        System.out.println(s.lastIndexOf('c'));//17
        System.out.println(s.lastIndexOf('c', 10));//8
        System.out.println(s.lastIndexOf("bbb"));//12
        System.out.println(s.lastIndexOf("bbb", 10));//3
    }

转化

1.数值和字符串的转化

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("zhangsan", 18));
        //打印
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);//打印的是对象名@哈希码
        System.out.println("======================");
        //字符串转数字
        //注意:Integer,Double等是Java的包装类型,这个后面会讲
        int data1 = Integer.parseInt("1234");
        double data2 = Double.parseDouble("12.34");
        System.out.println(data1);
        System.out.println(data2);
    }

2.大小写转换

 public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO";
        //注意:不是在原来的基础上转变,转变之后是一个新的对象
        //小写转大写
        System.out.println(s1.toUpperCase());//HELLO
        System.out.println(s2.toLowerCase());//hello

    }

3.字符串转数组

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(ch);
        System.out.println(s2);
    }

4.格式化

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

字符串的替换

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

方法功能
String replaceAll(String regex, String replacement)替换掉所有的指定内容
String replaceFirst(String regex, String replacement)替换首个内容
String replace(String target,  String replacement)将所有目标字符串替换为指定字符串
String replace(char oldChar,  char newChar)将所有旧字符替换为新字符

注意事项:由于字符串是不可变对象,替换不更改当前字符串,而是产生一个新的字符串

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

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

相关文章

Cannal监听binlog

文章目录 一、canal概念二、canal使用场景四、Canal工作原理Mysql主从复制原理 binlog中的二进制日志binlog格式选择 Canal消费方式应用实践总结 一、canal概念 canal是用java开发的基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费的中间件。目前&#xff0c;ca…

【位运算】leetcode面试题:消失的两个数字

一.题目描述 消失的两个数字 二.思路分析 本题难度标签是困难&#xff0c;但实际上有了只出现一次的数字iii这道题的铺垫&#xff0c;本题的思路还是很容易想到的。 温馨提示&#xff1a;阅读本文前可以先查看我的【位运算】专栏的第一篇文章&#xff0c;其中包含位运算这类…

算法通关村14关 | 堆在数组中找第k大的元素应用

1. 在数组中找第k大元素 题目 LeetCode215&#xff1a;给定整数数组nums和整数k&#xff0c;请返回数组中第k个最大的元素&#xff0c; 思路 解题思路用三个&#xff0c;选择法&#xff0c;堆查找和快速排序。 我们选择用大堆小堆解决问题&#xff0c;“找最大用小堆&#xff…

查看GPU占用率

如何监控NVIDIA GPU 的运行状态和使用情况_nvidia 85c_LiBiGo的博客-CSDN博客设备跟踪和管理正成为机器学习工程的中心焦点。这个任务的核心是在模型训练过程中跟踪和报告gpu的使用效率。有效的GPU监控可以帮助我们配置一些非常重要的超参数&#xff0c;例如批大小&#xff0c;…

nas汇编程序的调试排错方法

nas汇编程序的调试排错方法&#xff1a; 1、查找是哪一步错了 2、查看对应的*.lst文件&#xff0c;本例中是"asmhead.lst" 3、根据*.lst文件的[ERROR #002]提示查看源码&#xff0c;改错。 4、重新运行编译&#xff0c;OK 1、查找是哪一步错了&#xff1a; nask.ex…

K8S:K8S自动化运维容器

目录 一.k8s概述 2.为什么要用K8S 3.作用及功能 4.k8s容器集群管理系统 二.K8S的特性 1.弹性伸缩 2.自我修复 3.服务发现和复制均衡 4.自动发布和回滚 5.集中化配置管理和秘钥管理 6.存储编排 7.任务批量处理运行 三.K8S的集群架构 四.K8S的核心组件 1.Master组件 …

【WebSocketIndexedDB】node+WebSocketIndexedDB开发简易聊天室

序幕介绍&#xff1a; WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 讲人话就是说&#xff1a;WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;在 WebSocket API 中&#xff0c;浏览器和服务器只需要完成一次握手&#x…

C/C++语言简易图形库EasyX库和EGE图形库

有些学校直接拿 VC 来讲 C 语言&#xff0c;因为 VC 的编辑和调试环境都很优秀&#xff0c;并且 VC 有适合教学的免费版本。可惜在 VC 里面只能做一些文字性的练习题&#xff0c;想画条直线或一个圆都很难&#xff0c;例如需要注册窗口类、建消息循环等等&#xff0c;初学者会受…

Qvirtualkeyboard使用及相关知识点

项目介绍 环境介绍&#xff1a;x86银河麒麟v10 arm银河麒麟v10 需求分析&#xff1a;在arm平台上&#xff08;一个平板&#xff09;运行qt程序需要使用软键盘&#xff0c;不会配置键盘和鼠标&#xff0c;故需要使用软键盘。 方案总结&#xff1a; 使用自己开发或者从网上下…

python爬虫-数据解析BeautifulSoup

1、基本简介 BeautifulSoup简称bs4,BeautifulSoup和lxml一样是一个html的解析器&#xff0c;主要功能也是解析和提取数据。 BeautifulSoup和lxml类似&#xff0c;既可以解析本地文件也可以响应服务器文件。 缺点&#xff1a;效率没有lxml的效率高 。 优点&#xff1a;接口设…

Vulnhub: Hogwarts: Bellatrix靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.228 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.228访问80端口 查看源码&#xff0c;提示ikilledsiriusblack.php和文件包含的参数名file 漏洞利用 ikilledsiriusblack.p…

实训笔记9.1

实训笔记9.1 9.1笔记一、项目开发流程一共分为七个阶段1.1 数据产生阶段1.2 数据采集存储阶段1.3 数据清洗预处理阶段1.4 数据统计分析阶段1.5 数据迁移导出阶段1.6 数据可视化阶段 二、项目的数据产生阶段三、项目的数据采集存储阶段四、项目数据清洗预处理的实现4.1 清洗预处…

50ETF期权开户平台(0门槛期权开户指南)

50ETF期权开户平台比较好的有&#xff1a;期权馆&#xff0c;期权科普馆&#xff0c;小熊期权&#xff0c;期权酱&#xff0c;财顺财经&#xff0c;财顺期权等&#xff0c;都是国内前十的期权分仓平台&#xff0c;下文为大家结算50ETF期权开户平台&#xff08;0门槛期权开户指南…

【SpringSecurity】十一、SpringSecurity集成JWT实现token的方法与校验

文章目录 1、依赖与配置2、JWT工具类3、认证成功处理器4、创建JWT过滤器5、安全配置类 1、依赖与配置 添加JWT的maven依赖&#xff1a; <!-- 添加jwt的依赖 --> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId…

专业协作设计工具,看看这6个有你喜欢的吗

如今“在线协作”成为了团队设计场景中必需的功能之一&#xff0c;今天本文整理了7个支持团队协作的&#xff0c;好用的设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一个强大的在线设计协作工具&#xff0c;它具有实时协作设计和在线评论能力。在设…

干翻Dubbo系列第十四篇:Dubbo协议基于SpringBoot规范化开发

文章目录 文章说明 一&#xff1a;版本控制 二&#xff1a;共有依赖声明于父项目 三&#xff1a;创建共有API 1&#xff1a;定义公共接口 2&#xff1a;定义Bean 四&#xff1a;创建Provider 1&#xff1a;引入公共API 2&#xff1a;创建实现类 3&#xff1a;定义启动…

Mac 如何判断下载Mac with Intel Chip 还是 Mac with Apple Chip

如下图&#xff0c;当我们在 Mac系统 下载客户端时&#xff0c;有两种选择&#xff1a;Mac with Intel Chip 、 Mac with Apple Chip 如何判断要下载哪一种&#xff1f; 需要判断本机Mac是在Inter芯片还是Apple芯片上运行的。方法如下&#xff1a; 点击屏幕左上角Apple标志&a…

DVWA失效的访问控制

失效的访问控制&#xff0c;可以认为是系统对一些功能进行了访问或权限限制&#xff0c;但因为种种原因&#xff0c;限制并没有生效&#xff0c;造成失效的访问控制漏洞,比如越权等 这里以DVWA为例&#xff0c;先访问低难度的命令执行并抓包 删除cookie&#xff0c;并在请求头…

Ei Scopus双检索 | 2024年第二届绿色建筑国际会议(ICoGB 2024)

会议简介 Brief Introduction 2024年第二届绿色建筑国际会议(ICoGB 2024) 会议时间&#xff1a;2024年5月22日-24日 召开地点&#xff1a;意大利米兰 大会官网&#xff1a;www.icogb.org ICoGB 2024将围绕“绿色建筑”的最新研究领域而展开&#xff0c;为研究人员、工程师、专家…

Linux 进程基础概念-进程状态、进程构成、进程控制

Linux 进程 参考&#xff1a; 「linux操作系统」进程的切换与控制到底有啥关系&#xff1f; - 知乎 (zhihu.com)&#xff0c;Linux进程解析_deep_explore的博客-CSDN博客&#xff0c;腾讯面试&#xff1a;进程的那些数据结构 - 知乎 (zhihu.com)&#xff0c;如何在Linux下的进…