零基础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方法,那么打印出来的就是成员变量的值。 

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

 

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

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

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

相关文章

面试经典 150 题:20、2、228、122

20. 有效的括号 参考代码 #include <stack>class Solution { public:bool isValid(string s) {if(s.size() < 2){ //特判&#xff1a;空字符串和一个字符的情况return false;}bool flag true;stack<char> st; //栈for(int i0; i<s.size(); i){if(s[i] ( |…

【SpringBoot】公共字段自动填充

问题引入 JavaEE开发的时候&#xff0c;新增字段&#xff0c;修改字段大都会涉及到创建时间(createTime)&#xff0c;更改时间(updateTime)&#xff0c;创建人(craeteUser)&#xff0c;更改人(updateUser)&#xff0c;如果每次都要自己去setter()&#xff0c;会比较麻烦&#…

深度学习-卷积神经网络CNN

案例-图像分类 网络结构: 卷积BN激活池化 数据集介绍 CIFAR-10数据集5万张训练图像、1万张测试图像、10个类别、每个类别有6k个图像&#xff0c;图像大小32323。下图列举了10个类&#xff0c;每一类随机展示了10张图片&#xff1a; 特征图计算 在卷积层和池化层结束后, 将特征…

stm32——通用定时器时钟知识点

&#xff08;该图来自小破站 铁头山羊老师的stm32标准库教学&#xff09;

SobarQube实现PDF报告导出

文章目录 前言一、插件配置二、使用步骤1.新生成一个Token2.将拷贝的Token加到上文中执行的命令中3.查看报告 三、友情提示总结 前言 这篇博文是承接此文 .Net项目在Windows中使用sonarqube进行代码质量扫描的详细操作配置 描述如何导出PDF报告 众所周知&#xff0c;导出PDF功…

【数据结构】10.线索二叉树

一、线索二叉树的产生 采用先序、中序、后序三种方法遍历二叉树后都可以得到一个线性序列&#xff0c;序列上的每一个结点&#xff08;除了第一个和最后一个&#xff09;都有一个前驱和一个后继&#xff0c;但是&#xff0c;这个线性序列只是逻辑的概念&#xff0c;不是物理结…

如何合理设计一套springcloud+springboot项目中的各个微服务模块之间的继承关系的最优方案

文章目录 一、模块化设计所遵循的原则二、项目架构设计三、各个模块作用说明3.1 core 模块3.2 common 模块3.3 generatorcode模块3.4 business 模块3.5 web 模块3.6 admin 模块3.7 父pom 四、采用import引入SpringBoot 在springcloud微服务项目中经常用到多模块化的架构设计&am…

HarmonyOS4+NEXT星河版入门与项目实战--------开发工具与环境准备

文章目录 1、熟悉鸿蒙官网1、打开官网2、下载 DevEco Studio3、HarmonyOS 资源库4、开发指南与API 2、安装 DevEco Studio1、软件安装2、配置开发工具 1、熟悉鸿蒙官网 1、打开官网 百度搜索 鸿蒙开发者官网 点击进入开发者官网&#xff0c;点击开发&#xff0c;可以看到各种…

单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)

目录 1.单元测试 实现单元测试的方法&#xff1a; 注意事项&#xff1a; 2.集成测试 需注意事项&#xff1a; 实现集成测试的方法&#xff1a; 如何实现高效且可靠的集成测试&#xff1a; 3.系统测试 实现系统测试的方法: 须知注意事项&#xff1a; 4.验收测试 实现验…

Ubuntu24 上安装搜狗输入法

link 首先在终端中依次输入以下代码 sudo apt update sudo apt install fcitx 找到语言支持 在终端中依次输入 sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ sudo apt purge ibus 进入网页 搜狗输入法linux-首页​ shurufa.sogou.com/linux 找到刚才下…

FairyGUI和Unity联动(入门篇)

一、FairyGUI编辑器中 1.新建按钮、新建组件 编辑器中界面简易设计如下 2.文件-发布设置-发布路径&#xff1a;自己unity项目Resources所在的路径 二、Unity 使用代码展示UI using FairyGUI; using System.Collections; using System.Collections.Generic; using UnityEngi…

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

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

Redis的缓存穿透、缓存雪崩、缓存击穿问题及有效解决方案

目录 一、缓存穿透 1.简介 2.解决方案 3.修改前的代码 4.修改过后的代码 二、缓存雪崩 1.简介 2.解决方案 三、缓存击穿 1.简介 2.解决方案 3.用代码来实现互斥锁来解决缓存击穿 4.用代码来实现逻辑过期解决缓存击穿 四、缓存穿透和缓存击穿的区别 一、缓存穿透 …

CPU的性能指标总结(学习笔记)

CPU 性能指标 我们先来回顾下&#xff0c;描述 CPU 的性能指标都有哪些。 首先&#xff0c;最容易想到的应该是 CPU 使用率&#xff0c;这也是实际环境中最常见的一个性能指标。 用户 CPU 使用率&#xff0c;包括用户态 CPU 使用率&#xff08;user&#xff09;和低优先级用…

【go从零单排】Environment Variables环境变量

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;环境变量是用于配置程序行为的一种常见方式。它们可以用…

信捷PLC转以太网连接电脑方法

信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程&#xff0c;即插即用&#xff0c;具体看见以下介绍&#xff1a; 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计&#xff0c;可实现工厂设备信息化需求&#xff0c;对…

【golang-技巧】-线上死锁问题排查-by pprof

1.背景 由于目前项目使用 cgo golang 本地不能debug, 发生死锁问题&#xff0c;程序运行和期待不一致&#xff0c;通过日志排查可以大概率找到 阻塞范围&#xff0c;但是不能找到具体问题在哪里&#xff0c;同时服务器 通过k8s daemonset 部署没有更好的方式暴露端口 获取ppr…

AVL树的删除方法简单实现

看过前面的AVL树的介绍和插入方法实现AVL树了解并简单实现-CSDN博客&#xff0c;接着可以来学习删除方法的实现 目录 1.AVL树的删除 2.平衡因子调节 3.删除代码逻辑 4.AVL树的整体代码 1.AVL树的删除 因为AVL树也是二叉搜索树&#xff0c;可按照二叉搜索树的方式将节点删除…

ArcGIS的汉字(亚洲文本)垂直标注

01 需求说明 实现ArcGIS的汉字&#xff08;亚洲文本的垂直标注&#xff09;。 启用 Maplex 标注引擎。 在标注 工具条上单击标注管理器按钮 。 选中要进行标注的图层旁边的复选框。 选择图层下方的标注分类。 单击符号。 选中 CJK 字符方向复选框。 仅当字体有垂直的文本度…

飞凌嵌入式RK3576核心板已适配Android 14系统

在今年3月举办的RKDC2024大会上&#xff0c;飞凌嵌入式FET3576-C核心板作为瑞芯微RK3576处理器的行业首秀方案重磅亮相&#xff0c;并于今年6月率先量产发货&#xff0c;为客户持续稳定地供应&#xff0c;得到了众多合作伙伴的认可。 FET3576-C核心板此前已提供了Linux 6.1.57…