java基础-String

        之前有很长时间没进行更新了,现在开始会重新进行java基础的学习,所以会开始进行java基础方面的更新,今天会进行string字符串的学习。

        String在底层被final(声明的变量或者对象不可以扩展/改变)修饰,故其不可变。其底层采用的是字符(JDK8)或字节数组(JDK11)实现。string类位于java.lang包中,具有丰富的方法(计算字符串的长度、比较字符串、连接字符串等)

        1.String字符串的声明方式

       String声明有三种不同的形式:

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

其中,第一种直接将值复制给字符串,后面两种是基于创建一个String对象去创建字符串

其本质区别大概率还是在于是否指向同一块地址空间

        2.字符串length()方法

string类里面封装了length()方法,用于确定字符串的长度

String password = "123456";
System.out.println(password.length());

注意:数组中的length是一个属性,而字符串中的length()是一个方法

在jdk8之前,字符串底层使用的是字符数组,他的好处在于不用考虑存储不了的情况,对于中文来书,一个字符可以存储一个中文汉字,但是对于字母来说,一个字符也只能存储一个字母,但是这样一来,就会造成空间的一个浪费。每次存储一个字母,都会浪费对应的一个字节,长此以来,就会造成存储空间的大量浪费,降低其性能。

但是对jdk11以后的版本,length()方法用的则为字节数组,这种情况下,一个字节就只能存储一个字母,两个字节就可以存储一个汉字,不会造成字节空间的浪费,此时我们只需要进行右位移,去获得完整的字符内容。

jdk8 length()方法 -利用的value是char类型

public int length() {return value.length;
}

jdk11以后 length()方法 -利用的value是byte类型

这里延伸介绍一下String的一些特性

其中这里的value就是用字节存储的字符串数组

coder其实就是代表当前的字符编码形式 0代表Latin编码,1代表utf16

public int length() {//根据对应的字符编码进行向右位移,获取完整的字符内容return value.length >> coder();
}

然后我们可以发现,jdk11之后的length会变成字节型数组,这也就需要我们去进行右移来判断到底是一个中文汉字还是一个字母,从而获得完整的字符内容。运用字节型数组,可以很大程度的节省存储空间,提供整体的算法性能

如果是一个中文,则coder()返回为1,右移一位;如果是一个英文,则coder()返回为0,数组保持不变,因为该数组为一个字节数组。

        3.字符串中的==和equals之间的区别

        3.1 equals方法

        euqals方法主要是用来判断存储在两个字符型对象的内容是否一致。同样的,在jdk8之前会通过字符进行比较,在jdk11之后就通过字节进行比较。

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

        在jdk8中,首先,会利用==判断是否为同一对象,如果是的话,就直接返回true ,没有继续判断的意义了,其次,先判断是否为String类型,判断之后,此时anObject只有可能是string或者是比string高级的父类类型Object,然后我们将其强制转换为string类型。接着判断二者长度是否一致,如果一致则继续判断,否则返回false。接着,将这两个字符型数组从后向前遍历进行一一对比,只要存在不一致,即可返回false,否则,则返回true。

以上大概就是jdk8中equals方法的底层代码设计,接下来我们看下jdk11的底层代码设计

public boolean equals(Object anObject) {if (this == anObject) {return true;}return (anObject instanceof String aString)&& (!COMPACT_STRINGS || this.coder == aString.coder)&& StringLatin1.equals(value, aString.value);
}public static boolean equals(byte[] value, byte[] other) {if (value.length == other.length) {for (int i = 0; i < value.length; i++) {if (value[i] != other[i]) {return false;}}return true;}return false;
}

        首先,同样的,先进行==判断,如果两个存储对象地址一致,则直接返回true,否则进行三个与的判断,第一个同样是在判断参数对象是否为string类型,如果是则将其直接赋值给aString,同时进行下一步的判断,判断其是否为同一编码格式,如果不是,则直接返回false。如果是进行,下一步判断,此时是整个算法的精华所在,因为jdk11利用的是字节型数组,所以即使是中文进行了拆分,对其比较也不会造成影响,因为索引并不会改变,然后设计的equals方法就和jdk8一样,对每一个字节内容进行等值判断。

        3.2==比较

        第一种情况,对于基本数据类型,==是对其对应的值判断是否相等,一致则返回true,否则返回false。对于两个对象,会比较两个对象中的堆的内存地址是否相同,相同返回true,不同返回false。

        4.字符串比较

        对于登录时不考虑大小写这种情况,string为我们提供了一种方法

        equalsIgnoreCase()方法 忽略大小写比较是否相同,通常在验证码中使用

        toLowerCase()方法 当前字符为纯英文,将其转换为小写

        toUpperCase()方法 当前字符为纯英文,将其转换为大写

        其实忽略大小写的方法底层就是用的转换小写、大写的方法,将其转换成大写和小写进行等值的判断,从而满足忽略大小写的情况这样。

        5.字符串连接

        一般情况下,字符串连接只有两种,一种是使用“+”,一种是使用String类的concat()方法

         

        至于为什么要用concat?一方面,concat相对于“+”号,能提高代码的可读性,方便进行维护,否则多个连接最后就是一大堆“+”号,其次,concat可以进行"链式编程",所以就可以进行多个字符串连接这样

        6.常用提取方法

        

        字符串存在一些常用的提取方法,这与JavaScript中的语法几乎一致

第一个,返回字符对应字符串的位置

第二个,返回第一次出现value的位置

第三个和第四个都是从后向前查找,返回对应的索引

public int indexOf(String str,int fromIndex)

从某个索引位置开始查找,返回找到的对应索引位置,找不到就返回-1

        

        第一个,提取从位置索引开始的字符串部分

        第二个·,从起始索引,到结束索引,截取中间的字符串,这里要注意是左闭右开的,也就是其实索引可以取到,但是结束索引取不到,只截取到其前面一个索引

        第三个,trim()方法,去除字符串中的空白格

        7.字符串拆分

        split()方法,将一个字符串分割为多个子字符串,结果作为字符串数组返回

不过需要注意,该字符串必须存在可以分割的相同分割元素,不然无法进行分割

对于其底部设计,其原理还是利用substring进行判断这样,大家感兴趣可以了解一下

        8.StringBuffer和StringBuilder

        StringBuffer即为String增强版

        其对字符串进行频繁修改(字符串连接时),使用StringBuffer类大大提高程序运行效率(对比String) 但是由于其内部方法都加了同步锁,解决对应的多线程安全问题,所以会造成性能的下降,因此,sun公司又引入了StringBuilder这个类,该类主要就是取消了同步锁,增强了性能,但是只能在保证线程安全的情况下使用

        创建对象

StringBuffer sb = new StringBuffer();
StringBuffer sb = new StringBuffer("aaa");StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder("aaa");

        作用

//StringBuffer 与StringBuilder 用法基本相似
sb.tosTring(); //转化为String类型
sb.append("**");//追加字符串
sb.insert(1,"**");//在对应位置插入字符串

        

  • StringBuffer

    • 线程安全

    • 性能较差

  • StringBuilder

    • 性能较高

    • 安全性较差

9.其他方法

对于String来说,还有一些其他方法

replace() 替代字符串:用字符串去替代 满足条件的所有可替代内容

repalceAll()替代字符串:用正则表达式去替代 满足正则表达式的所有内容

replace(String target, String replacement)//regex:正则表达式
replaceAll(String regex, String replacement)String str = "今天天气真特么晴朗,我的心情真特么的爽!" ;
System.out.println(str.replaceAll("真特么", "***"));

matches(String regex):告知该字符串是否与给定的正则表达式匹配

String regex = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$" ;String telephone = "zhangsan@163.com" ;boolean flag = telephone.matches(regex) ;System.out.println(flag);

isEmpty() :判断字符串是否为空(关注字符串长度)

isBlank():判断字符串是否为空(关注字符串本身内容)

String str = " " ;//str.isEmpty():判断数组中的长度是否为零,如果包含了空格,并不会认为是空的。
//str.isBlank():判断非空白的字符串内容,如果包含了空格,还会认为是空的。
System.out.println(str.isEmpty());  // false
System.out.println(str.isBlank());  // true

以上就是字符串的所有内容了,如有疑问还请各位评论区多多提出!

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

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

相关文章

springboot集成redis之字典缓存

什么是redis的字典缓存&#xff1f; Redis的缓存是Redis内部用于存储键值对数据结构的一种基础数据结构。在Redis中&#xff0c;所有的键值对都是通过字典这种数据结构来存储的。字典在Redis中扮演着核心角色&#xff0c;因为它不仅用于数据库中的键值对存储&#xff0c;还用于…

Postman设置全部请求都携带请求头,Postman如何一次性设置请求头、不需要一个请求一个请求去添加请求头

文章目录 一、问题描述二、解决办法三、应用场景 一、问题描述 现在我有 n 个接口测试&#xff0c;其中 n 个都需要携带一致的请求头&#xff08;其实一般都是携带 JWT 令牌&#xff09;&#xff0c;怎么办&#xff1f;我要一个一个写&#xff1f;如图&#xff1a; 二、解决办…

go语言Gin框架的学习路线(十)

目录 GORM的CRUD教程 查询 普通查询 定义 User 结构体 查询所有用户 查询第一个用户 总结 条件查询 内联条件 额外查询选项 高级查询 链式操作 Scopes 多个立即执行方法 GORM的CRUD教程 CRUD 是 "Create, Read, Update, Delete"&#xff08;创建、查询…

[经验] 驰这个汉字的拼音是什么 #学习方法#其他#媒体

驰这个汉字的拼音是什么 驰&#xff0c;是一个常见的汉字&#xff0c;其拼音为“ch”&#xff0c;音调为第四声。它既可以表示动词&#xff0c;也可以表示形容词或副词&#xff0c;意义广泛&#xff0c;经常出现在生活和工作中。下面就让我们一起来了解一下“驰”的含义和用法。…

以Zookeeper为例 浅谈脑裂与奇数节点问题

一、脑裂现象的定义与影响 脑裂&#xff08;split-brain&#xff09;是指在分布式系统中&#xff0c;因网络分区或其他故障导致系统被切割成两个或多个相互独立的子系统&#xff0c;每个子系统可能独立选举出自己的领导节点。这一现象在依赖中心领导节点&#xff08;如Elastic…

【Qt 】JSON 数据格式详解

文章目录 1. JSON 有什么作用?2. JSON 的特点3. JSON 的两种数据格式3.1 JSON 数组3.2 JSON 对象 4. Qt 中如何使用 JSON 呢&#xff1f;4.1 QJsonObject4.2 QJsonArray4.3 QJsonValue4.4 QJsonDocument 5. 构建 JSON 字符串6. 解析 JSON 字符串 1. JSON 有什么作用? &#x…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十九章 Linux MISC驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

5.Fabric的共识机制

在Fabric中,有以下3中典型共识机制。 Solo共识 solo共识机制只能用于单节点模式,即只能有一个Orderer节点,因此,其共识过程很简单,每接收到一个交易信息,就在共识模块的控制下产生区块并广播给节点存储到账本中。 Solo 模式下的共识只适用于一个Orderer节点,所以可以在…

CTF-Web习题:2019强网杯 UPLOAD

题目链接&#xff1a;2019强网杯 UPLOAD 解题思路 打开靶场如下图所示&#xff0c;是一个注册和登录界面 那就注册登录一下&#xff0c;发现是一个提交头像的页面&#xff1a; 试了一下只有能正确显示的png图片才能提交成功&#xff0c;同时F12拿到cookie&#xff0c;base6…

便宜多域名SSL证书申请平台推荐

随着互联网的深入发展&#xff0c;网络安全问题愈发受到重视。SSL证书作为保障网站和用户数据安全的重要工具&#xff0c;其重要性不言而喻。在众多SSL证书类型中&#xff0c;多域名SSL证书因其独特的功能和优势&#xff0c;逐渐成为企业和个人保护网站安全的首选。 申请便宜S…

Django视图与URLs路由详解

在Django Web框架中&#xff0c;视图&#xff08;Views&#xff09;和URLs路由&#xff08;URL routing&#xff09;是Web应用开发的核心概念。它们共同负责将用户的请求映射到相应的Python函数&#xff0c;并返回适当的响应。本篇博客将深入探讨Django的视图和URLs路由系统&am…

全国区块链职业技能大赛国赛考题区块链产品需求分析与方案设计

任务1-1:区块链产品需求分析与方案设计 本任务需要依据项目背景完成需求分析与方案设计,具体要求如下: 依据给定区块链食品溯源系统的业务架构图,对考题进行业务分析,尽可能多的去考虑一个业务系统所需要的模块,使用Visio或思维导图工具展现本系统的基本设计概念和处理流…

科研绘图系列:R语言热图(heatmap)

介绍 热图是一种数据可视化技术,通常用于展示数据的分布情况。它通过颜色的变化来表示数据的大小或密度,使得观察者能够直观地理解数据集中的模式和趋势。以下是热图的一些关键特点和应用场景: 数据分布:热图可以显示数据在不同区域的分布情况,比如在地图上显示不同地区的…

Go基础编程 - 12 -流程控制

流程控制 1. 条件语句1.1. if...else 语句1.2. switch 语句1.3. select 语句1.3.1. select 语句的通信表达式1.3.2. select 的基特性1.3.3. select 的实现原理1.3.4. 经典用法1.3.4.1 超时控制1.3.4.2 多任务并发控制1.3.4.3 监听多通道消息1.3.4.4 default 实现非堵塞读写 2. …

GPT-4o mini是什么?

今天&#xff0c;全网都知道 OpenAI 发现货了&#xff01; GPT-4o mini 取代 GPT 3.5&#xff0c;从此坐上正主之位。 从官网信息来看&#xff0c;OpenAI 最新推出的 GPT-4o mini 重新定义了 AI 成本效益的标准&#xff0c;其性能优于前代模型 GPT-3.5 Turbo&#xff0c;且成本…

查看公网IP的网络出口

文章目录 背景 背景 有时候在各种交易或其他时候&#xff0c;会被问到给我一个公网IP&#xff0c;我来帮你加白名单。 这个怎么怎么获取公网IP呢&#xff0c;在自己本机查看ipconfig或者ifconfig ip a 等命令查到的一般都是局域网的IP&#xff0c;每台机器都需要一个IP来进行对…

数学建模学习(111):改进遗传算法(引入模拟退火、轮盘赌和网格搜索)求解JSP问题

文章目录 一、车间调度问题1.1目前处理方法1.2简单案例 二、基于改进遗传算法求解车间调度2.1车间调度背景介绍2.2遗传算法介绍2.2.1基本流程2.2.2遗传算法的基本操作和公式2.2.3遗传算法的优势2.2.4遗传算法的不足 2.3讲解本文思路及代码2.4算法执行结果&#xff1a; 三、本文…

基于MobileNetv2的垃圾分类函数式自动微分-昇思25天打卡

基于MobileNetv2的垃圾分类 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写&#xff08;Python语言&#xff09;&a…

linux 网络子系统

__netif_receive_skb_core 是 Linux 内核网络子系统中一个非常重要的函数&#xff0c;它负责将网络设备驱动层接收到的数据包传递到上层协议栈进行处理。以下是对该函数的一些关键点的详细解析&#xff1a; 一、函数作用 __netif_receive_skb_core 函数是处理接收到的网络数据…