Java--String类

 前言:


        在之前的学习中,学习了和了解了一些类的基本使用,例如object类等等,但是我们用String这个引用或者说这个类其实我们已经用了好久,只不过没有具体分析过!

        对于String类,它可以引用一个字符串,在C语言中没有一个类型是字符串类型。

接下来就来探究一下String类带给我们的一些方法。

常用方法:

1、构造方法:

        字符串的构造方法常见的有三种:

public class Test1 {
    public static void main(String[] args) {
        //方式一:
        String str = "abcd";
        //方式二:
        String str1 = new String("abcd");
        //方式三:
        char[] arr = {'a','b','c','d'};
        String str2 = new String(arr);
    }
}

由于String是引用类型,自己本身不存储数据,在String类中实例变量如下:

      String s1 = new String("hello");
        String s2 = new String("world");
        String s3 = s1;

如上这段代码是s1和s3是引用同一个对象的,画图解释:

注意:

        在Java中用" "引起来的也是String类型!!

字符串的比较:

        字符串的比较有四种情况:

1.比较String类型是否引用同一个对象:

        也就是用"=="比较两个引用的地址是否相同:

        

    public static void main(String[] args) {
        //对于基本变量“==”是比较两个值是否相等
        int a = 10;
        int b = 20;
        int c = 10;
        System.out.println(a == b);//fasle
        System.out.println(a == c);//true

        //对于String引用类型,比较地址
        String s1 = new String("abcd");
        String s2 = new String("abcd");
        String s3 = s1;
        System.out.println(s1 == s2);//false
        System.out.println(s1 == s3);//true
        System.out.println(s2 == s3);//false
    }

我们从结果也能看出!

但是!!!,这时候有一个问题:我用直接引用的方式,也就是不new直接引用一个字符串结果是否还是一样的呢?

    public static void main(String[] args) {
        String s1 ="abcd";
        String s2 = "abcd";
        String s3 = s1;
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s2 == s3);
    }

结果是:

三个true,难道说此时没有在比较地址?还是说没有在堆区开辟新的空间?
要谈就这个问题和"常量池"有关,放在后边的讲解中!
 

 2.equals方法按照字典序比较两个字符串

        也就是比较两个字符串中的每一个字符是不是都是一样的,如果一样就返回true,如果不一样就返回false!

        String类中的该方法时继承Object类中的equals方法,如果我们想要有自己的equals方法也可以重写。

    public static void main(String[] args) {
        String s1 = new String("abcde");
        String s2 = new String("abcde");
        String s3 = new String("abc");
        System.out.println(s1.equals(s2));//true
        System.out.println(s1.equals(s3));//false
    }

此时可以看出结果,equals方法可以比较两个字符串里面的字符是不是一样的。

我们可以拿到equals的源码:

 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

这个源码是Object类中的方法,被继承之后可以使用,这个源码的特点:

        1、当两个引用类型引用同一个对性的时候,也就是地址相同时,直接返回true

        2、检查两个引用的类型是否一样,如果不一样直接返回false。

        3. this和 anObject 两个字符串的长度是否相同,是继续比较,否则返回 false

        4、将字符串放入字符数组中,逐一比较每个字符的Ascall值是否一样。

3.compareTo方法 按照字典序比较

        这个方法比起equals方法更加精细化二了,equals方法只能告诉你两个字符串相不相等,

但是compareTo方法能够告诉你如果不相等那个字符串大。

        

    public static void main(String[] args) {
        String s1 = new String("abcdef");
        String s2 = new String("abc");
        String s3 = new String("efg");
        String s4 = new String("abcdef");
        System.out.println(s1.compareTo(s2));
        System.out.println(s1.compareTo(s3));
        System.out.println(s1.compareTo(s4));
    }

注意:     

1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
2. 如果前 k 个字符相等 (k 为两个字符长度最小值 ) ,返回值两个字符串长度差值

源码如下:

public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

 4、compareToIgnoreCase方法:

        与compareTo方式相同,但是忽略大小写比较。

    public static void main(String[] args) {
        String s1 = new String("abcdef");
        String s2 = new String("abc");
        String s3 = new String("efg");
        String s4 = new String("AbcdEf");
        System.out.println(s1.compareToIgnoreCase(s2));
        System.out.println(s1.compareToIgnoreCase(s3));
        System.out.println(s1.compareToIgnoreCase(s4));
    }

结果是:

发现s1和s4在大小写上有区别,但是该方法可以忽略大小写,直接比较!

字符串的查找:

        返回index位置上字符:

        也就是找到对应位置上的字符:

    public static void main(String[] args) {
        String s = "abcdefghhigkl";
        System.out.println(s.charAt(1));
        System.out.println(s.charAt(3));
        System.out.println(s.charAt(20));
    }

注意事项:        

如果index为负数或者越界,抛出IndexOutOfBoundsException异常

 返回字符第一次出现的位置:

        

    public static void main(String[] args) {
        String s = "abcdefghhigkl";
        System.out.println(s.indexOf('e'));
        System.out.println(s.indexOf('c'));
        System.out.println(s.indexOf('z'));
    }

 

注意事项:

       1. 如果index在字符串中没有则返回-1。

        2.参数index需要传字符,内部是用整形接收字符的ASCALL码值。

返回从指定位置开始第一次对应字符出现的位置:

    public static void main(String[] args) {
        String s = "abcdefghhigkl";
        System.out.println(s.indexOf('a',0));
        System.out.println(s.indexOf('a',2));
        System.out.println(s.indexOf('l',99));
    }

 返回指定字符串的位置:

        该方法可以返回指定字符串第一次出现的位置:

    public static void main(String[] args) {
        String s = "abcdefghhigkl";
        System.out.println(s.indexOf("igk"));
        System.out.println(s.indexOf("l"));
        System.out.println(s.indexOf("abcd"));
    }

如果没有就返回-1。

从后往前找对应字符串,返回对应位置:

    public static void main(String[] args) {
        String s = "abcdefghhigkl";
        System.out.println(s.lastIndexOf('d'));
        System.out.println(s.lastIndexOf('l'));
    }

其效果和indexOf一样的。

当然它同样也有一些重载的方法,这里就不一一列举了!!

转化:

    数值转字符串:

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

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}
public class Test1 {
    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(13,"xiaoming"));
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
    }

 字符串转数值:
        

    public static void main(String[] args) {
        String s1 = new String("12345");
        String s2 = new String("123.45");
        int a = Integer.parseInt(s1);
        double b = Double.parseDouble(s2);
        System.out.println(a);
        System.out.println(b);
    }

大小写转换:
 

    public static void main(String[] args) {
        String s1 = "abcde";
        String s2 = "HAHAHA";
        String s3 = "abcDEF";
        System.out.println(s1.toUpperCase());//小写转大写
        System.out.println(s2.toLowerCase());//大写转小写
        System.out.println(s3.toUpperCase());//小写转大写
        System.out.println(s3.toLowerCase());//大写转小写
    }

字符串转数组:

    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);
    }

字符串的替换:

    public static void main(String[] args) {
        String s = "helloworld!";
        System.out.println(s.replaceAll("l", "_"));
        System.out.println(s.replaceFirst("l", "_"));
        System.out.println(s.replaceAll("hel","_"));
    }

注意:

        如果字符串中没有对应要替换的对象就返回原来的字符串!

字符串拆分:

String[] split(String regex)    将字符串全部拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。

    public static void main(String[] args) {
        String s = "abc def ghi";
        String[] s1 = s.split(" ");
        for (String s2:s1) {
            System.out.println(s2);
        }
    }

 

String[] split(String regex, int limit)   将字符串以指定的格式,拆分为limit
    public static void main(String[] args) {
        String s = "abc def ghi";
        String[] s1 = s.split(" ",2);
        for (String s2:s1) {
            System.out.println(s2);
        }
    }

 

特殊:

        拆分如下字符串:

    public static void main(String[] args) {
        String s = "192.182.1.13";
        String[] s1 = s.split(".");
        for (String x:s1) {
            System.out.println(x);
        }
    }

打印结果却不对劲。

注意:

1. 字符"." , "|" , "*" , "+" 都得加上转义字符,前面加上 "\\" .
2. 而如果是 "\" ,那么就得写成 "\\\\" .
3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

 可以这样写:

    public static void main(String[] args) {
        String s = "192.182.1.13";
        String[] s1 = s.split("//.");
        for (String x:s1) {
            System.out.println(x);
        }
    }

多次拆分:
 

String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++) {
String[] temp = result[i].split("=") ;
System.out.println(temp[0]+" = "+temp[1]);
}

字符串截取:

String substring(int beginIndex)    从指定索引截取到结尾
String substring(int beginIndex, int endIndex)     截取部分内容

 

    public static void main(String[] args) {
        String s = "helloworld!!";
        System.out.println(s.substring(3));
        System.out.println(s.substring(3,8));
    }

 

 

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

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

相关文章

JavaScript web API part3

web API DOM 日期对象 > 得到当前系统的时间 new这个操作就是实例化 语法 const date new Date() or const date new Date(2004-11-3 08:00:00) 可以指定时间 > 可应用于通过系统时间和指定时间实现倒计时的操作 //得到当前时间const date new Date()console.lo…

【Python小知识 - 2】:在VSCode中切换Python解释器版本

文章目录 在VSCode中切换Python解释器版本 在VSCode中切换Python解释器版本 在VSCode中按下快捷键CtrlShiftP&#xff0c;出现命令框。 输入以下命令&#xff1a; Python: Select Interpreter输入命令回车后即出现不同的Python解释器选项&#xff0c;选择想要切换的Python解释器…

【题解】—— LeetCode一周小结37

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结36 9.合并零之间的节点 题目链接&#xff1a;2181. 合并零之间…

【最新综述】基于深度学习的超声自动无损检测(下)

4.Levels of automation 5.Basic axioms for DL-based ultrasonic NDE 在回顾了最新技术和每个自动化级别的贡献之后&#xff0c;我们不难发现&#xff0c;目前的数字语言方法论在不同论文之间存在着很大的差异。例如&#xff0c;有些作者提出了同时处理不同步骤的模型[121]&…

感知器神经网络

1、原理 感知器是一种前馈人工神经网络&#xff0c;是人工神经网络中的一种典型结构。感知器具有分层结构&#xff0c;信息从输入层进入网络&#xff0c;逐层向前传递至输出层。根据感知器神经元变换函数、隐层数以及权值调整规则的不同&#xff0c;可以形成具有各种功能特点的…

Java并发常见面试题(上)

Java并发常见面试题(上) 什么是线程和进程? 一个 Java 程序的运行是 main 线程和多个其他线程同时运行 进程:程序的一次执行过程&#xff0c;系统运行一个程序就是一个进程从创建&#xff0c;运行到消亡的过程。在Java中启动main函数就是开启一个进程&#xff0c;main函数所…

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统 在产品将要上线之前&#xff0c;需要制作不同类型格式的根文件系统 在产品研发阶段&#xff0c;我们还是需要使用nfs的方式挂载根文件系统 优点&#xff1a;可以直接在上位机中修改文件系统内容&#xff0c;延长EMMC的寿命 【1】重启上位机nfs服…

WPF利用Path自定义画头部导航条(TOP)样式

1;新建两个多值转换器&#xff0c;都有用处&#xff0c;用来动态确定PATH的X,Y州坐标的。 EndPointConverter 该转换器主要用来动态确定X轴&#xff0c;和Y轴。用于画线条的。 internal class EndPointConverter : IMultiValueConverter {public object Convert(object[] val…

wifiip地址可以随便改吗?wifi的ip地址怎么改变

对于普通用户来说&#xff0c;WiFi IP地址的管理和修改往往显得神秘而复杂。本文旨在深入探讨WiFi IP地址是否可以随意更改&#xff0c;以及如何正确地改变WiFi的IP地址。虎观代理小二将详细解释WiFi IP地址的基本概念、作用以及更改时需要注意的事项&#xff0c;帮助用户更好地…

PPT中的图形与图片:插入、调整与格式设置技术详解

目录 引言 一、图形与图片的插入 1. 插入图形 2. 插入图片 二、图形与图片的调整 1. 调整大小与位置 2. 裁剪与旋转 3. 图形与图片的合并与组合 三、图片格式与布局设置 1. 图片格式设置 2. 图片布局设置 示例案例&#xff1a;制作产品展示PPT 四、结论 引言 在现…

Harmony OS DevEco Studio低代码开发流程 - HarmonyOS开发自学5

一. 为什么要用低代码开发&#xff1f; HarmonyOS低代码开发方式&#xff0c;具有丰富的UI界面编辑功能&#xff0c;例如基于图形化的自由拖拽、数据的参数化配置等&#xff0c;通过可视化界面开发方式快速构建布局&#xff0c;可有效降低用户的时间成本和提升用户构建UI界面的…

【JVM】类加载

1. 类加载过程 Java虚拟机&#xff08;JVM&#xff09;的 类加载 过程是将字节码文件&#xff08;.class文件&#xff09;从存储设备加载到内存&#xff0c;并为其创建相应的类对象的过程。类加载是Java程序运行的基础&#xff0c;保证了程序的动态性和安全性。JVM的类加载过程…

Unity 粒子系统参数说明

一、Particle System 1. Duration&#xff08;持续时间&#xff09; 粒子系统运行一次所需的时间。它决定粒子系统持续播放的时间长度。 2. Looping&#xff08;循环播放&#xff09; 如果启用&#xff0c;粒子系统将在播放完一次后自动重新开始播放&#xff0c;直到你停止它…

pgrouting实战应用

1&#xff09;下载地区地区数据&#xff08;下载数据是XYZM 四位数据&#xff09; 2&#xff09;下载裁剪行政区数据 3&#xff09;使用arcgis pro添加路网数据和行政区数据 4&#xff09;裁剪数据&#xff0c;仅历下行政区路网 5&#xff09;arcgis pro要素转线&#xff0…

【数据结构】顺序表和链表经典题目

系列文章目录 单链表 动态顺序表实现通讯录 顺序表 文章目录 系列文章目录前言一、顺序表经典例题1. 移除元素2. 合并两个有序数组 二、链表经典例题1. 移除链表元素2. 反转链表3. 合并两个有序链表4. 链表的中间节点5. 环形链表的约瑟夫问题 总结 前言 我们通过前面对顺序表…

ArrayList 源码解析

ArrayList是Java集合框架中的一个动态数组实现&#xff0c;提供了可变大小的数组功能。它继承自AbstractList并实现了List接口&#xff0c;是顺序容器&#xff0c;即元素存放的数据与放进去的顺序相同&#xff0c;允许放入null元素&#xff0c;底层通过数组实现。除该类未实现同…

HTB-Vaccine(suid提权、sqlmap、john2zip)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天来为大家讲解Vaccine靶机 渗透过程 信息搜集 服务器开放了 21FTP服务、22SSH服务、80HTTP服务 通过匿名登录FTP服务器 通过匿名登录到服务器&#xff0c;发现backup.zip文件&#xff0c;可能存在账号密码 发现b…

2024.9.16 day 1 pytorch安装及环境配置

一、配置pytorch环境&#xff0c;安装pytorch 1.查看python版本 python --version 2.在anaconda命令中创建pytorch环境 conda create -n pytorch python3.12(python版本&#xff09; 3.pytorch安装 pytorch首页 PyTorchhttps://pytorch.org/ os为windows推荐package选择…

算法练习题27——疫情下的电影院(模拟)

其实思路还好 就是输入有点难搞 Java import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String input scanner.nextLine();// 去掉输入字符串的方括号if (input.…

react 安装使用 antd+国际化+定制化主题+样式兼容

安装antd 现在从 yarn 或 npm 或 pnpm 安装并引入 antd。 yarn add antd修改 src/App.js&#xff0c;引入 antd 的按钮组件。 import React from react; import { Button } from antd;const App: React.FC () > (<div className"App"><Button type&q…