String解析及其方法
String解析及其方法
1.前言
2.什么是字符串(String)
3.字符串(String)的两种创建方式及其区别
4.字符串(String)的方法及其部分原码解析
5.字符串(String)的弊端
1.前言
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享
2.什么是字符串(String)
String类表示字符串,在创建之后不能被更改,可用于检查序列的单个字符,搜索字符串,提取字符串,创建字符串副本并将所有字符串全部转换为大写或小写。
3.字符串(String)的两种创建方式及其区别
字符串有两种创建方式,分别为直接赋值和构造方法。
字符串在创建之后便不会被更改,对于字符串内容的操作都会新创建一个字符串对象
1.直接复制
以双引号内的数据作为字符串存储的数据
String str="hello world";
2.四种构造方法
1.新建一个空字符串
初始化一个新创建的 String 对象,使其表示一个空字符序列
String str1=new String();
空字符串和null的区别
String str2=new String();
String str3=null;
空字符串和null的值都为空
空字符串表示字符串对象引用的值为空,如上str2的值为空,str1指向字符串的内存空间
null表示引用为空,如上str3的引用为空,str3没有指向任何空间
在实际中作用
对字符串的校验过程中,要考虑字符串值的两种"空",既要考虑字符串引用对象值是否为空,又要考虑引用对象是否为空
2.新建String的字符串
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本
String str4=new String("hello world");
生成的str4是对应参数字符串的副本,但str4是对应新创建的对象
3.新建字符数组的字符串,输出时会自动将数组拼接成字符串
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列
char[] chars={'a','b','c'};
String str5=new String(chars);
适用场景:用于改变字符串的数据
由于字符串在创建之后不能被修改,而字符串没有相应的改变字符串的方法,但是由获取对应索引的数据和将数据转化为字符数组的形式,通过该构造方法可以将字符串的数据进行修改
4.新建字节数组的字符串,输出时会自动将数组拼接成字符串
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
byte[] bytes={97,98,99};
String str6=new String(bytes);
使用场景:用于网络中的数据传输,将字节信息转化为字符串时使用
网络中的数据是字节类型,通过该方法可以将字节信息转化为字符串形式再进行处理
3.两者的区别
1.存储
直接赋值:直接赋值进入栈内存中,会进入堆内存的串池中查看是否有相同地址的数据,没有便创建,有的话便复用
构造方法:每new一次便会在堆内存中开辟一个新的空间,生成新对象,不同对象的地址不同
2.字符串的对比

结果为

== 用于比较地址是否相等,equals用于比较具体的值
4.字符串(String)的方法及其部分原码解析
1. boolean equals(Object anObject)
给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false
源码解释
public boolean equals(Object anObject) {
//比较当前对象(this)与给定对象(anObject)的地址是否相等
if (this == anObject) {
return true;
}
//判断anObject是否是String的实例
if (anObject instanceof String) {
//将anObject强制转化为String
String anotherString = (String)anObject;
//获取当前对象对应的字符数据的长度
int n = value.length;
//判断n与给定对象对应的字符数组的长度是否相等
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;
}
2.char charAt(int index)
返回指定索引处的 char 值。索引范围为从 0 到 length() - 1。序列的第一个 char 值位于索引 0 处,第二个位于索引 1 处,依此类推,这类似于数组索引
public char charAt(int index) {
//判断index是否在给定的索引范围之内,若不在则抛出字符串角标越界
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
//如果在对应的范围内,则获取对应的字符数组对应缩影的数据
return value[index];
}
3.public int length()
返回此字符串的长度
public int length() {
//返回对应对象字符数组的长度
return value.length;
}
4.public String concat(String str)
将指定字符串连接到此字符串的结尾。
如果参数字符串的长度为 0,则返回此 String 对象。否则,创建一个新的 String 对象,用来表示由此 String 对象表示的字符序列和参数字符串表示的字符序列连接而成的字符序列
public String concat(String str) {
//判断str是否为空
if (str.isEmpty()) {
return this;
}
int len = value.length;
int otherLen = str.length();
//复制当前对象的值,并指定长度为len+otherLen
char buf[] = Arrays.copyOf(value, len + otherLen);
//将str的值添加到buf之后,getChars()的底层是System的arraycopy()
str.getChars(buf, len);
return new String(buf, true);
}
通常使用"+",和concat()的底层原理是一样
5.public String substring(int beginIndex,int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex
public String substring(int beginIndex, int endIndex) {
//判断给定的起始索引和终止索引是否符合要求
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
//判断终止索引是否大于起始索引
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
//判断起始索引和终止索引是否对应于字符串对应的字符数组的起始位置和终止位置,如果是,便返回对应的字符串,否则便返回索引的数据
return ((beginIndex == 0) && (endIndex == value.length)) ? this: new String(value, beginIndex, subLen);
}
方法的重载
public String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾。
6.public String replace(char oldChar,char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
如果 oldChar 在此 String 对象表示的字符序列中没有出现,则返回对此 String 对象的引用。否则,创建一个新的 String 对象,它所表示的字符序列除了所有的 oldChar 都被替换为 newChar 之外,与此 String 对象表示的字符序列相同
public String replace(CharSequence target, CharSequence replacement) {
//运用正则表达式对字符串进行替换
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
5.字符串(String)的弊端
由于字符串一旦创建后便不能更改,因此在进行字符串的拼接过程中,会不断产生新的对象,对于内存的消耗大,同时,进行字符串的反转,过程复杂,内存的消耗大,因此需要其他的字符串类
String解析及其方法的更多相关文章
- String 的 intern() 方法解析
一.概述 JDK7 之前和之后的版本,String 的 intern() 方法在实现上存在差异,本文的说明环境是 JDK8,会在文末说明 intern() 方法的版本差异性. intern() 方法是 ...
- java String 中 intern方法的概念
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...
- .NET中常用的几种解析JSON方法
一.基本概念 json是什么? JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是一种轻量级的数据交换格式,是存储和交换文本信息的语法. ...
- C# 解析js方法,并调用js方法
本文转载:http://www.cnblogs.com/StudyLife/archive/2013/03/11/2953516.html 本文不是基于B/S的 后台调用前台js方法,而是给你一段js ...
- JavaScript中String.prototype.replace() 方法的使用
摘抄于:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace ...
- String的getBytes()方法 以及 new String()
在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这表示在不同的操作系统下,返回的东西不一样! String.getBytes(Stringdecode) ...
- String的一些方法试探
package countio; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; impo ...
- java String 提供的方法
String类的判断功能: * boolean equals(Object obj):比较字符串的内容是否相同,区分大小写 * boolean equalsIgnoreCase(String str) ...
- Android DOM解析XML方法及优化
在Android应用开发中,我们常常要在应用启动后从服务器下载一些配置文件,这些配置文件包含一些项目中可能用到的资源,这些文件很多情况下是XML文件,这时就要将XML下载到文件中保存,之后再解析XML ...
- IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体
前言: GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 这个教程主要是学习IntelliJ IDEA ...
随机推荐
- python入门教程之二十邮件操作
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...
- [Linux]CentOS7 安装指定版本软件包
以安装openssl-libs为例. 查看当前服务器中YUM源可安装的软件包版本 [root@iz2vc84t88x94kno0u49zwz ~]# yum list | grep openssl-l ...
- [Linux]CentOS7:创建OS用户+授予sudo权限
1 创建OS用户+授予sudo权限 Step1 下载安装Xshell.Xftp工具 Step2 通过Xshell,远程登陆服务器root用户 Step3 使用检查用户的命令查询当前linux环境是否存 ...
- 粘包,自定义协议,struct模块,粘包解决终极大招
粘包: 1.粘包问题出现的原因: (udp不会出现粘包问题) 1.1.tcp是流式协议,数据像水流一样黏在一起,没有任何边界区分 1.2.收数据没收干净,有残留,就会下一次结果混淆在一起去(客户端接受 ...
- 【机器学习入门与实践】数据挖掘-二手车价格交易预测(含EDA探索、特征工程、特征优化、模型融合等)
[机器学习入门与实践]数据挖掘-二手车价格交易预测(含EDA探索.特征工程.特征优化.模型融合等) note:项目链接以及码源见文末 1.赛题简介 了解赛题 赛题概况 数据概况 预测指标 分析赛题 数 ...
- Go/Python RPC使用
Remote Procedure Call 简单RPC调用 server实现 // 注册接口 type HelloService struct{} func (s *HelloService) Hel ...
- C# 笔迹擦除8边形
擦除区域与橡皮大小不一致 测试反馈,擦除区域与真实的橡皮大小不一致: 上图中,橡皮显示是圆形的,但擦除效果是一个"8边形"区域. 找了一台8K屏,确实是能复现的: 看到这个诡异的8 ...
- python 高级函数补充
补充几个高级函数 zip 把两个可迭代内容生成一个可迭代的tuple元素类型组成的内容 # zip 案例 l1 = [ 1,2,3,4,5] l2 = [11,22,33,44,55] z = zip ...
- 一条SQL如何被MySQL架构中的各个组件操作执行的?
摘要:一条SQL如何被MySQL架构中的各个组件操作执行的,执行器做了什么?存储引擎做了什么?表关联查询是怎么在存储引擎和执行器被分步执行的?本文带你探探究竟! 本文分享自华为云社区<一条SQL ...
- 2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
2021-07-14:接雨水.给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 福大大 答案2021-07-14: 左右指针向中间移动.左指针是左边柱 ...