零基础Java第十九期:认识String(一)

 

目录

 一、String的重要性

二、String的常用方法 

2.1. 字符串构造 

2.2. String对象的比较

2.3. 字符串查找 

2.4. 转化 

2.4. 字符串替换

2.5. 字符串拆分

2.6. 字符串截取 


一、String的重要性

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

二、String的常用方法 

2.1. 字符串构造 

       要想了解一个新的类型,我们首先要了解它的源码。同样是双击shift,勾选上“include non-project items”,在框里面输入String java.lang,点击第一个,就可以看到String的源码。然后点击右侧的Structure,就可以看到String的构造方法(图中划线的表示已经弃用了)。

 

 

      下面我们将介绍几个比较重要的构造方法。String的构造方法输出的为什么回事字符串而不是地址呢?首先我们要知道,String是引用类型,内部并不存储字符串本身。

String str1 = new String("abcd");
String str2 = "hello";
char[] arrays = {'w','o','r','l','d'};
String str3 = new String(arrays);

System.out.println(str1);
System.out.println(str2);
System.out.println(str3);

 

       我们可以看一下println的源码,再看一下valueOf的源码。很明显看到调用toString方法时,字符串在走else这条语句,然后在返回obj.toString。

public void println(String x) {
   if (getClass() == PrintStream.class) {
       writeln(String.valueOf(x));
   } else {
         synchronized (this) {
         print(x);
         newLine();
      }
   }
}
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

       下面我们看下一段代码, 我们来打一个断点来进行一个简单的调试。调试了之后,我们可以看到value、coder、hash、hashiszero等属性,我们这里重点看一下value。str1和str2这些值被拿到以后,把每一个字符串存放在字节数组里面并进行赋值。倍双引号引起来的是字符串,放在一个字符串池中。

public class Main {
    public static void main(String[] args) {
        String str1 = new String("abcde");
        String str2 = new String("hello");

        System.out.println(str1);
        System.out.println(str2);
    }
}

 

字符串长度的打印:

String str1 = new String("abcd");
String str2 = new String("hello");

System.out.println(str1.length());
System.out.println(str2.length());

2.2. String对象的比较

(1) ==比较是否引用同一个对象。对于引用类型==比较的是引用中的地址。

String str1 = new String("abcd");
String str2 = new String("hello");
String str3 = str1;

System.out.println(str1 == str2);
System.out.println(str1 == str3);

 

(2)使用equals方法,比较两个引用变量字符串的内容是否相等

String str1 = new String("abcd");
String str2 = new String("hello");
String str3 = new String("hello");

System.out.println(str1.equals(str3));
System.out.println(str2.equals(str3));

 

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

     与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式: 1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值 2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值。

String str1 = new String("abc");
String str2 = new String("ac");
String str3 = new String("abc");
String str4 = new String("abcdef");

System.out.println(str1.compareTo(str2));
System.out.println(str1.compareTo(str3));
System.out.println(str1.compareTo(str4));

 

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

2.3. 字符串查找 

方法功能
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
String str = "aaabbbcccaaabbbccc";

System.out.println(str.charAt(4));
System.out.println(str.indexOf('c'));
System.out.println(str.indexOf('b',5));
System.out.println(str.indexOf("bbb"));
System.out.println(str.indexOf("bbb",12));
System.out.println(str.lastIndexOf('c'));
System.out.println(str.lastIndexOf('c',10));
System.out.println(str.lastIndexOf("bbb"));
System.out.println(str.lastIndexOf("bbb",10));

2.4. 转化 

(1)数值与字符串的转化 

class Student{
    public int age;
    public String name;

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

public class Main {
    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(19,"Thomas"));

        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
    }
}

 

如果我们再生成一个toString方法,那么打印出来的就是成员变量的值。 

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
        System.out.println(s4);

 

(2)大小写的转化

String str1 = new String("hello");
String str2 = new String("WORLD");

String str3 = str1.toUpperCase();
String str4 = str2.toLowerCase();

System.out.println(str3);
System.out.println(str4);

       这里需要注意的是,大小写转化的时候,str1和str2的值依然不变,这个过程产生新的对象。我们从源码里面可以看到有一个new,说明要产生一个新的对象。

    public static String toUpperCase(String str, byte[] value, Locale locale) {
        if (locale == null) {
            throw new NullPointerException();
        }

 (3)字符串转数组

public class Main {
    public static void main(String[] args) {
        String str = "hello";
        char[] arrays = str.toCharArray();
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i]+" ");
        }
    }
}

(4)格式化

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

2.4. 字符串替换

这里一共有4个方法,分别是以下四种。

 

       第一种是替换单个字符。第二种与第四种差不多,但是第四种只能接收String类型,第二种既能接收char,也能接收String。第三种只替换第一次出现的匹配项。并且以上四种方法都会产生新的字符串

//reolaceAll与replceFirst的区别

String str1 = new String("aabbccaabbde");
String str2 = str1.replaceAll("aa","ff");
String str3 = str1.replaceFirst("aa","ff");
        
System.out.println(str2);
System.out.println(str3);

 

2.5. 字符串拆分

str1.split("&");//表示我要用这个符号去分割

我们看一下split里面的源码,被分割后的字符串要被数组去接收。

    public String[] split(String regex) {
        return split(regex, 0);
    }
public class Main {
    public static void main(String[] args) {
        String str1 = new String("sdsjf&dsaw");
        String[] ret = str1.split("&");
        for (String x:ret){
            System.out.println(x);
        }
    }
}

 

        也有一些比较特殊的字符。比如字符"|","*","+"都得加上转义字符,前面加上"\\",而如果是"\",那么就得写成"\\\\";如果一个字符串中有多个分隔符,可以用"|"作为连字符。

2.6. 字符串截取 

substring都是要以String类型来接收。 

    public String substring(int beginIndex) {
        return substring(beginIndex, length());
    }
public class Main {
    public static void main(String[] args) {
        String str1 = new String("abcdefgh");
        String str2 = str1.substring(4);
        String str3 = str1.substring(4,6);//[4,6)

        System.out.println(str2);
        System.out.println(str3);
    }
}

 

第一种方法是从指定索引截取到结尾;第二种方法是截取部分内容。 

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

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

相关文章

基于Lora通讯加STM32空气质量检测WIFI通讯

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重&#xff0c;空气质量的监测与管理已经…

JMeter中添加请求头

在JMeter中添加请求头的步骤如下&#xff1a; 1.打开HTTP信息头管理器 &#xff1a; 首先&#xff0c;你需要进入JMeter的HTTP请求组件。这可以通过在HTTP请求测试元素上右键点击&#xff0c;然后选择“添加 > 配置元件 > HTTP信息头管理器”来完成。 2.添加新的请求头…

面试_ABtest原理简介

01 什么是ABtest ABtest来源于假设检验&#xff0c;现有两个随机均匀的有样本组A、B&#xff0c;对其中一个组A做出某种改动&#xff0c;实验结束后分析两组用户行为数据&#xff0c;通过显著性检验&#xff0c;判断这个改动对于我们所关注的核心指标是否有显著的影响&#xf…

PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级

PCB生产ERP系统的智能拼版技术&#xff0c;是基于PCB前端报价系统获取到的用户或市场人员已录入系统的板子尺寸及set参数等&#xff0c;按照最优原则或利用率最大化原则自动进行计算并输出拼版样式图和板材利用率&#xff0c;提高工程人员效率&#xff0c;减少板材的浪费。覆铜…

Kubernetes 10 问,测测你对 k8s 的理解程度

Kubernetes 10 问 假设集群有 2 个 node 节点&#xff0c;其中一个有 pod&#xff0c;另一个则没有&#xff0c;那么新的 pod 会被调度到哪个节点上&#xff1f; 应用程序通过容器的形式运行&#xff0c;如果 OOM&#xff08;Out-of-Memory&#xff09;了&#xff0c;是容器重…

《操作系统 - 清华大学》3 -3:连续内存分配:内存碎片与分区的动态分配

文章目录 0. 概述1. 内存碎片问题2. 动态分配3. 首次适配算法4. 最优适配算法5. 最差适配算法 0. 概述 内存分配是操作系统管理过程中很重要的环节&#xff0c;首先需要考虑的是一块连续区域分配的过程&#xff0c;这个过程中会有很多问题&#xff0c;首先比较关注的一个问题是…

CICD持续集成与持续交付

一 CICD是什么 CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xff09; 持续集成…

[前端面试]javascript

js数据类型 简单数据类型 null undefined string number boolean bigint 任意精度的大整数 symbol 创建唯一且不变的值&#xff0c;常用来表示对象属性的唯一标识 复杂数据类型 object&#xff0c;数组&#xff0c;函数,正则,日期等 区别 存储区别 简单数据类型因为其大小固定…

多线程-阻塞队列

目录 阻塞队列 消息队列 阻塞队列用于生产者消费者模型 概念 实现原理 生产者消费者主要优势 缺陷 阻塞队列的实现 1.写一个普通队列 2.加上线程安全和阻塞等待 3.解决代码中的问题 阻塞队列 阻塞队列&#xff0c;是带有线程安全功能的队列&#xff0c;拥有队列先进…

Uniapp 引入 Android aar 包 和 Android 离线打包

需求&#xff1a; 原生安卓 apk 要求嵌入到 uniapp 中&#xff0c;并通过 uniapp 前端调起 app 的相关组件。 下面手把手教你&#xff0c;从 apk 到 aar&#xff0c;以及打包冲突到如何运行&#xff0c;期间我所遇到的问题都会 一 一 进行说明&#xff0c;相关版本以我文章内为…

软间隔支持向量机

软间隔支持向量机 ​ 我们先直接给出软间隔支持向量机的形式&#xff1a; P min ⁡ ω , b , ζ 1 2 ∥ ω ∥ 2 2 − C ∑ i 1 m ζ i s . t . y i ( ω x i b ) ≥ 1 − ζ i , i 1 , 2 , 3.. m ζ i ≥ 0 , i 1 , 2 , 3.. m P \min_{\omega,b,\zeta} \frac{1}{2}\Ve…

html + css 自适应首页布局案例

文章目录 前言一、组成二、代码1. css 样式2. body 内容3.全部整体 三、效果 前言 一个自适应的html布局 一、组成 整体居中&#xff0c;宽度1200px&#xff0c;小屏幕宽度100% 二、代码 1. css 样式 代码如下&#xff08;示例&#xff09;&#xff1a; <style>* {…

深入List集合:ArrayList与LinkedList的底层逻辑与区别

目录 一、前言 二、基本概念 三、相同之处 四、不同之处 五、ArrayList 底层 六、LinkedList 底层 七、ArrayList 应用场景 八、LinkedList 应用场景 九、ArrayList和LinkedList高级话题 十、总结 一、前言 在Java集合的广阔舞台上&#xff0c;ArrayList与LinkedLis…

Vue3中实现插槽使用

目录 一、前言 二、插槽类型 三、示例 四、插槽的分类实现 1. 基本插槽 2. 命名插槽 3. 默认插槽内容 4. 作用域插槽&#xff08;Scoped Slots&#xff09; 5. 多插槽与具名插槽组合 一、前言 在 Vue 3 中&#xff0c;插槽&#xff08;Slot&#xff09;用于实现组件的内…

海思3403对RTSP进行目标检测

1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库&#xff0c;拉取RTSP流&#xff0c;然后调过3403的VDEC模块进行解码&#xff0c;送个NPU进行目标检测&#xff0c;输出到hdmi&#xff0c;这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…

【Java知识】Java性能测试工具JMeter

一文带你了解什么是JMeter 概述JMeter的主要功能&#xff1a;JMeter的工作原理&#xff1a;JMeter的应用场景&#xff1a;JMeter的组件介绍&#xff1a; 实践说明JMeter实践基本步骤&#xff1a;JMeter实践关键点&#xff1a; JMeter支持哪些参数化技术&#xff1f;常见插件及其…

Github客户端工具github-desktop使用教程

文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…

Flutter中的Material Theme完全指南:从入门到实战

Flutter作为一款热门的跨平台开发框架&#xff0c;其UI组件库Material Design深受开发者喜爱。本文将深入探讨Flutter Material Theme的使用&#xff0c;包括如何借助Material Theme Builder创建符合产品需求的主题风格。通过多个场景和代码实例&#xff0c;让你轻松掌握这一工…

EWM 打印

目录 1 简介 2 后台配置 3 主数据 4 业务操作 1 简介 打印即输出管理&#xff08;output management&#xff09;利用“条件表”那一套理论实现。而当打印跟 EWM 集成到一起时&#xff0c;也需要利用 PPF&#xff08;Post Processing Framework&#xff09;那一套理论。而…

2024 同一个网段,反弹shell四种方法【linux版本】bash、python、nc、villian反弹shell图解步骤

实验环境准备&#xff08;同一个网段下&#xff0c;我是桥接的虚拟机&#xff09; 一、bash反弹shell 二、python反弹shell 三、nc反弹shell 四、villain反弹shell 实验环境准备&#xff08;同一个网段下&#xff0c;我是桥接的虚拟机&#xff09; 一台kali的linux(攻击者)…