零基础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.xdnf.cn/news/17599.html

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

相关文章

HarmonyOS4+NEXT星河版入门与项目实战--------ArkTs语言与TypeScript语法

文章目录 1、ArkTs语言1、ArkTs 特点2、ArkTs与Javascript关系 2、TypeScript 语法 1、ArkTs语言 在html的开发中&#xff0c;实现一个页面元素&#xff0c;比如Button&#xff0c;往往包含了以下三种要素&#xff1a;JS、HTML、CSS。JS处理逻辑与响应、HTML 用来声明标签生成…

使用yak编写yakit漏洞检测插件

前言 在使用yakit进行编写yaml插件的时候遇到了yaml无法处理的情况&#xff0c;我不知道是不是yaml无法处理或者说是yakit和yaml的兼容还不够&#xff0c;面对变量的处理还是有些难受&#xff0c;于是花了点时间看了官网的yak语法的手册和其他人写的yak插件尝试使用yak语言来完…

信也科技和云杉网络的AI可观测性实践分享

1. 信也科技 2、云杉网络 2.1 中国移动

Blossom:开源私有部署的markdown笔记软件

在信息化、数字化时代&#xff0c;我们每个人的生活和工作都离不开笔记和知识管理。从简单的待办事项&#xff0c;到复杂的项目计划&#xff0c;再到存储大量个人知识的工具&#xff0c;如何选择一个高效、便捷且符合个人需求的笔记软件&#xff0c;成了许多人的难题。最近在逛…

Spring:DI依赖注入的方式

Spring为我们提供了两种注入方式&#xff0c;分别是: setter注入 简单类型引用类型 构造器注入 简单类型引用类型 setter注入 在bean中定义引用类型属性&#xff0c;并提供可访问的set方法配置中使用property标签ref属性注入引用类型对象 (1)项目中添加BookDao、BookDaoIm…

逆向攻防世界CTF系列37-crackme

逆向攻防世界CTF系列37-crackme 参考https://blog.csdn.net/xiao__1bai/article/details/120230397 nspack的壳&#xff0c;查了一下好像是北斗的一个壳 没找到什么脱壳软件&#xff0c;只能手动脱壳了 手动脱壳的最终要的是ESP定律 ESP定律的原理就是“堆栈平衡”原理 涉及…

按钮权限的操作方法

首先先在你的本地储存里边&#xff0c;加入一些你指定的字段 然后创建一个文件夹&#xff0c;在此文件夹下创建一个js文件&#xff0c;文件内容如下 在你所需要隐藏按钮的页面引入此js文件&#xff0c;并且通过 directives自定义指令绑定你的每一个按钮。在js文件中通过三个常量…

vscode 关闭绑定元素 隐式具有“any”类型这类错误

在vue的项目里面&#xff0c;经常看到any类型的报错&#xff0c;真的很烦的 在tsconfig.json中配置以下参数 “noImplicitAny”: false 就可以了 出现类型“never”上不存在属性“userName”。ts-plugin(2339) 配置该参数 modeuleResolution : node "compilerOptions&qu…

springboot 的 Profile

什么是 Profile &#xff1f; 应用所在的运行环境发生切换时&#xff0c;配置文件常常就需要随之修改。 Profile&#xff1a;——就是一组配置文件及组件的集合。 可以整个应用在不同的profile之间切换&#xff08;设置活动profile&#xff09;&#xff0c;整个应用都将使用该…

onvif协议相关:4.1.6 Digest方式云台控制启动

背景 关于onvif的其实很早之前我已经在专栏中写了不少了, 使用onvif协议操作设备 但最近有陆陆续续的粉丝问我, 希望我在写一些关于 onvif的设备自动发现、预置位跳转、云台操作的博客。 满足粉丝的需求,安排。 今天我们来实现 设备云台的控制(启动) 实现 1.在ONVIF Devi…

【JAVA毕业设计】基于Vue和SpringBoot的农机电招平台

本文项目编号 T 615 &#xff0c;文末自助获取源码 \color{red}{T615&#xff0c;文末自助获取源码} T615&#xff0c;文末自助获取源码 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#x…

基于Jmeter的分布式压测环境搭建及简单压测实践

写在前面 平时在使用Jmeter做压力测试的过程中&#xff0c;由于单机的并发能力有限&#xff0c;所以常常无法满足压力测试的需求。因此&#xff0c;Jmeter还提供了分布式的解决方案。本文是一次利用Jmeter分布式对业务系统登录接口做的压力测试的实践记录。按照惯例&#xff0…

代码随想录算法训练营day41|动态规划04

最后一块石头的重量|| 返回剩余最后一块石头石头最小的可能重量&#xff0c;那么就应该最后剩余的两块石头尽量都等于或接近总重量的一半&#xff0c;这样剩下的就是一半的质量 目标和 给定一个非负整数数组&#xff0c;a1, a2, …, an, 和一个目标数&#xff0c;S。现在你有…

Python+Flask实现随机选谷票游戏

西方曾进行一项著名的投资随机性实验&#xff0c;对比基金经理与猴子在选股上的表现。 实验方法&#xff1a;主持人提供一系列股票&#xff0c;基金经理依靠其专业知识&#xff08;如财务报表、行业趋势、产品市场及公司文化与管理层分析等&#xff09;进行筛选&#xff1b;而…

【Python数据可视化分析实战】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化

大数据分析设计方案 1.数据集来源&#xff1a;https://search.jd.com 2.实现思路&#xff1a; &#xff08;1&#xff09;数据爬取 首先&#xff0c;我们需要从京东平台上采集手机品牌的相关数据。可以通过网络爬虫或API接口等方式获取数据。为了保证数据的完整性和准确性&…

使用 TensorFlow 实现 ZFNet 进行 MNIST 图像分类

ZFNet&#xff08;ZF-Net&#xff09;是由 Matthew Zeiler 和 Rob Fergus 提出的卷积神经网络架构&#xff0c;它在图像分类任务中取得了显著的效果。它在标准卷积神经网络&#xff08;CNN&#xff09;的基础上做了一些创新&#xff0c;例如优化了卷积核大小和池化策略&#xf…

11.15 HTML

传统路线 HTML、CSS、JS AjaxJQueryMySQLJDBCServletJSPEL&JSTLCookieSessionFilterServlet案例MybatisSpringSpringMVCSpringBoot 全新路线 HTM、CSS、JSAjax、AxiosVue、Element前端工程化 vue脚手架MavenSpringBoot基础 基于SpringBoot进行讲解Spring的IOC&#xff…

打造旅游卡服务新标杆:构建SOP框架与智能知识库应用

随着旅游业的蓬勃兴起&#xff0c;旅游卡产品正逐渐成为市场的焦点。为了进一步提升服务质量和客户体验&#xff0c;构建一套高效且标准化的操作流程&#xff08;SOP&#xff09;变得尤为重要。本文将深入探讨如何构建旅游卡的SOP框架&#xff0c;并介绍如何利用智能知识库技术…

Java 简单家居开关系统

1.需求&#xff1a; 面向对象编程实现智能家居控制系统&#xff08;简单的开关&#xff09; 2.实现思路 1.定义设备类&#xff1a;创建设备对象代表家里的设备 JD类&#xff1a; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;D…

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分支冲…