String类型详解

1. Java为何要创造String类

        在C语言中,是没有String这个类型的,通常使用字符数组中存放一个个字符,再加上最后一个'\0'来表示/存放一个字符串.也可以使用一个字符指针指向字符串的首元素,直到遇到'\0'停止,再加上C语言头文件string.h中封装的函数,对于字符串的操作已经够用了.

        Java为何要创建String类呢?因为Java是一种面向对象的语言,C语言的操作并不符合面向对象的思想,而是更注重底层的实现.因此,Java中创建了String类,将字符串作为了一个对象,符合"万物都是对象"的准则.

2. String是一种引用类型

        何为引用,我们来举一个例子:

String s = "hello world";

        例如这么一条语句,我们实例化了一个String对象s,这个s内部并没有包含整个"hello world"字符串,而s中存储的是内存中存放"hello world"这个字符串的地址.这就是引用.

        类比C语言中,这个s代表的含义是指向"hello world"中首元素'h'字符的char*类型字符指针.

3. 强大的String类型

        String类型的引入减少了许多程序猿的工作量,String类内部封装了许多实用,功能强大的方法,对于String类型对象的操作也十分便捷.以下举几个例子,来体会一下:

3.1 字符串拼接

在Java中,Object类对于'+' 操作符进行了重载,当左右两个操作数有一个为字符串时,得到的结果就是一个两个量字面上拼接起来的字符串.这种操作的便捷是C程序猿可望而不可及的.

//字符串+字符串
String s1 = "hello"+"world";// 等同于String s1 = "helloworld"
//字符串+整型
int a = 10;
String s2 = "123"+a;//等同于String s2 = "12310";

3.2 字符串查找

这里可以调用的方法比较多,直接列出常用方法,读者可以自己尝试:

char charAt(int index) 返回index位置上字符,如果index为负数或者越界,抛出
IndexOutOfBoundsException异常int indexOf(int ch) 返回ch第一次出现的位置,没有返回-1int indexOf(int ch, int fromIndex) 从fromIndex位置开始找ch第一次出现的位置,没有返回-1int indexOf(String str) 返回str第一次出现的位置,没有返回-1int indexOf(String str, int fromIndex) 从fromIndex位置开始找str第一次出现的位置,没有返回-1int lastIndexOf(int ch) 从后往前找,返回ch第一次出现的位置,没有返回-1int lastIndexOf(int ch, int fromIndex)从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1int lastIndexOf(String str) 从后往前找,返回str第一次出现的位置,没有返回-1int lastIndexOf(String str, int fromIndex)从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1

3.3 字符串替换

常用方法介绍:

String replaceAll(String regex, String replacement) 替换所有的指定内容String replaceFirst(String regex, String replacement) 替换收个内容

以下述代码为例:

String str = "helloworld";
System.out.println(str.replaceAll("l", "_"));//"he__owor_d"
System.out.println(str.replaceFirst("l", "_"));//"he_loworld"

3.4 字符串分割

常用方法介绍:

String[] split(String regex) 将字符串全部拆分String[] split(String regex, int limit) 将字符串以指定的格式

以下述代码为例:

String str = "hello world hello" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {System.out.println(s);
}
//打印结果
hello
world
hello

3.5 字符串截取

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

这里使用时要注意,第二个方法使用时的参数取到的区间为左开右闭区间.

4. String类型的不可变性

String类型的不可变性是我们理解String类型特性的关键.

我们先来看一下String类型的源码(jdk8):

从这张图片中我们就可以看出,String类底层是使用一个char类型的value数组来维护字符串中的字符.该图还可以看出:
1. String类被final修饰,表明该类不能被继承.
2. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组(对应的关系不可以改变),但是其引用空间中的内容可以修改.

但是,即使如此,字符串仍然是不可变的,这也说明了上图中的两个final并非是字符串不可变的原因.

Java为了减少字符串对象的重复创建,在内存中开辟了一块空间----字符串常量池.

实际上,字符串设计成不可变就意味着,每当我们需要引用一个字符串时,会在字符串常量池中查找是否存在这个字符串常量.由于字符串不可变,因此要么这个字符串不存在,要么这个字符串只会在一个固定的地方,可以利用hashcode精准的定位.如果不存在,就在这个位置直接创建一个字符串常量然后引用,如果存在,直接引用即可.

字符串设计成不可变的好处(了解):

1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了.
2. 不可变对象是线程安全的.
3. 不可变对象更方便缓存 hashcode, 作为 key 时可以更高效的保存到 HashMap 中.

因此,我们应该尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下.
 


 

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

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

相关文章

学完Python的7大就业方向,哪个赚钱最多?

“ 我想学Python,但是学完Python后都能干啥 ?” “ 现在学Python,哪个方向最简单?哪个方向最吃香 ?” “ …… ” 相信不少Python的初学者,都会遇到上面的这些问题。大家都知道Python很吃香,薪资…

进程管理与计划任务管理

进程管理 1、查看进程 静态 ps -auxps -elf 动态 top pgrep 查看特定条件的进程 pgrep -l “log” pgrep -l "ssh"pgrep -l -U redhat pstree 查看进程树 pstree -aup 所有用户、进程id\详细信息pstree -ap redhat 查看redhat用户的进程 任务调…

如何实现在固定位置的鼠标连点

鼠大侠的鼠标连点功能是免费的 浏览器搜索下载鼠大侠,指定连点间隔和启动快捷键 点击设置,指定点击位置

Linux 常用操作命令大全

目录 一、命令大集合 1.1 whereis 1.2 which 1.3 sudo 1.4 grep 1.5 free 1.6 top 动态显示进程的状态 1.7 ps 静态显示进程信息 1.8 df 1.9 iostat 看IO性能状态 1.10 yum安装插件命令 1.11 rpm 1.12 scp远程拷贝 1.13 uname 二、linux网络命令 2.1 centos7 防火…

SpringCloudAlibaba Nacos配置及应用

Nacos搭建及配置 nacos本机服务搭建 windows上搭建单机nacos: Releases alibaba/nacos GitHub 下载安装包 下载本地,解压,直接运行(保证安装包的绝度路径只有英文字符,有中文会导致运行失败)&#xff…

开发语言详解(python、java、Go(Golong)。。。。)

是语言决定行业,还是行业决定语言,说不清,只是觉得,当你做这一行的时候,如果你还有精力感兴趣的话,可以再做些了解,一下是自己个人见解以及官网做的整合。希望对大家有用。 目录 Python 概念&…

MySQL 多表查询与事务的操作

一,多表联查 有些数据我们已经拆分成多个表,他们之间通过外键进行连接.当我们要查询两个表的数据,各取其中的一列或者多列. 这时候就需要使用多表联查. 数据准备: # 创建部门表 create table dept(id int primary key auto_increment,name varchar(20) ) insert into dept (n…

DevEco Studio 项目创建

安装DevEco Studio后开始使用,双击桌面DevEco Studio 快捷方式弹出界面: 选择Application —> Empty Ability,点击Next 项目配置 Project name:工程的名称,可以自定义,由大小写字母、数字和下划线组成。…

vscode搜索总是搜到修改记录文件如何处理

如图每次搜索出来的结果总是有好多编辑记录中的文件,给自己找文件及提交代码时带来很大困扰,每次都得删特别麻烦。 解决办法: 如上图在插件里找到 local history 点击 ”禁用“ 即可。以后再编辑代码就不会产生修改记录文件了。 如果直接搜索…

深入浅出前端本地储存

引言 2021 年,如果你的前端应用,需要在浏览器上保存数据,有三个主流方案: CookieWeb Storage (LocalStorage)IndexedDB 这些方案就是如今应用最广、浏览器兼容性最高的三种前端储存方案 今天这篇文章就聊一聊这三种方案的历史…

前端Prettier 插件的使用配置(详细)

各个参数代表的意思:printWidth:每行代码的最大长度限制。 tabWidth:选项用于控制制表符的宽度。 useTabs:指定是否使用制表符代替空格。 semi:指定是否在语句的末尾添加分号。 singleQuote:指定是否使用单引号或双引号…

【Java程序员福音】每个 Java 开发人员都应该知道的 10 个基本工具

我试图在代码库,项目规划,构建和部署,测试自动化和基础设施自动化中包含工具。作为负责端到端管理项目的高级 Java 开发人员,这些工具将帮助您更有效地完成工作。 让我们看到 Java 程序员的一些基本工具 1、Git 我认为 Git 和 Github 应该是所有 Java 程序员应该学习和掌…

②免费AI软件开发工具测评:通义灵码 VS 码上飞

前言 我又双叒叕来测评了!上次给大家带来的是iFlyCode和CodeFlying两款产品的测评,受到了大家的一致好评~ 今天咱就继续来聊聊,这次我们选的的对象是通义灵码和码上飞,从名字上也能看到出来这两款产品一定是跟软件开发有关系的&…

Zerotier 异地组网方案初探

前言 我之前想要异地组网的话,一般都采用内网穿透的方法,但是这个内网穿透有弊端就是都是要通过公网服务器转发流量,对于大流量的传输就比较不方便,我发现了Zerotier 这个工具非常的好用,是基于p2p的 这是一个类似于…

驶向高效巅峰:Nginx高并发性能优化实战指南与场景案例拆解

身处瞬息万变的互联网世界,高并发场景下服务器的性能优化尤为重要,而Nginx正是这一领域的超级舵手。本文将深入浅出地揭示Nginx在高并发环境下的性能优化之道,并通过具体场景配置案例,助你掌握这一关键技术,提升服务器…

静态网络配置

一、查看网络命令 1.命令行查看网络配置 1、查看ip\硬件设备-网卡 ifconfig -a ifconfig ens160 网卡名称 ip addr show ip addr show ens160 nmcli device show ens160 nmcli con up ens160 2、主机名称 hostname hostname hfj.huaxia.com 3、查看路由和网关 rou…

慎投!共10本「On Hold」期刊被剔除,2本中科院TOP仍在调查中!

2024年3月18日,科睿唯安本年度第三次更新了Web of Science核心期刊目录。 此次SCIE/SSCI期刊目录共8本期刊发生变动,情况如下: 经小编查询,此次更新后,共有7本“On Hold”期刊被数据库剔除,其中还包括2024年…

手撕算法-最长公共子序列(二)

最长公共子序列(二) 分析:典型的动态规划,直接看代码了。 代码: import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** longest common sub…

VS+QT Debug正常但Release无法识别头文件

!!!,这个问题一般是在第一次编译的时候遇见的,包括之前使用debug也是 在Qt Installation一定要修改成自己版本的编译器,修改一次以后基本是不用再修改的