String源码与常用方法

1.栗子

代码:

public class JavaStringClass {

	public static void main(String[] args) {
String s ="hello";
s = "world"; //内存地址已经修改 原来地址上的值还是不变的,只是失去了引用等待垃圾回收
String s2 = "hello"; //从常量池中找到并引用
String s4 = new String("hello"); //new产生一个新的对象 不会从常量池中引用
String s6 = "hel" + "lo";
String s7 = new String("hel") + new String("lo");
System.out.println(s == s2); //引用相等
System.out.println(s2 == s4); //引用不相等
System.out.println(s2.equals(s4)); //值相等 分析equals方法源码
System.out.println(s2 == s6); //引用相等 使用相 常量相加 也是从常量池中找到引用
System.out.println(s2 == s7); //引用不相等 //开头字母大写
System.out.println(s2.substring(0,1).toUpperCase() + s2.substring(1)); System.out.println(s2);
}
}

输出:

2.String的不变性

2-1:字符串常量池

String s ="hello";
String s2 = "hello";
System.out.println(s == s2); //true 说明引用相等(地址相等)

`s与s2引用相等即地址相等,原因是:Java把字符串常量存入字符串常量池

而 String s4 = new String("hello"); s4和 s2的值不相等,是因为new会产生一个新的对象,不会从字符串常量池中找引用

2-2:String的不变性

`主要是因为 String 和保存数据的 char 数组,都被 final 关键字所修饰,所以是不可变的

如下图所示:被final关键字修饰的变量(这里是字符数组),值不可以改变

所以当 String s ="hello"; s = “world”时,s的内存地址(s的引用对象)已经改变了,

说明产生了新的字符串对象,已经不再指向字符串常量池的“hello”,而是指向了“world”。

3.String重写equal方法,判断相等

1.先判断 引用是否相等 this == 传入的参数anobject,地址引用相等说明指向同一个对象,那么值肯定也相等了

2.再使用instanceof 判断类型是否与String类型相等

3.最后逐个判断 底层字符数组中的每一个字符是否相等

public boolean equals(Object anObject) {
// 判断内存地址是否相同
if (this == anObject) {
return true;
}
// 待比较的对象是否是 String,如果不是 String,直接返回不相等
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;
}

4.String常用的操作方法

4-1:字符串截取:

方法1:public String substring(int beginIndex, int endIndex) // beginIndex:开始位置,endIndex:结束位置;

方法2:public String substring(int beginIndex) //beginIndex:开始位置一直到到字符串末尾结束位置

截取原理:substring 方法的底层使用的是字符数组范围截取的方法 :Arrays.copyOfRange(字符数组,开始位置,结束位置)

4-2:字符串大小写:

小写方法:String.toLowerCase() //小写

大写方法:String.toUpperCase()//大写

上面两种常用方法的综合应用:将首字母小写

有时候我们会通过 applicationContext.getBean(className); 这种方式得到 SpringBean,这时 className 必须是要满足首字母小写的

name.substring(0, 1).toLowerCase() name.substring(1);

4-3:字符串替换、删除

public void testReplace(){
String str ="hello word !!";
log.info("替换之前 :{}",str);
str = str.replace('l','d');
log.info("替换所有字符 :{}",str);
str = str.replaceAll("d","l");
log.info("替换全部 :{}",str);
str = str.replaceFirst("l","");
log.info("替换第一个 l :{}",str);
}
//输出的结果是:
替换之前 :hello word !!
替换所有字符 :heddo word !!
替换全部 :hello worl !!
替换第一个 :helo worl !!

4-4:字符串拆分

String s ="boo:and:foo";
// 我们对 s 进行了各种拆分,演示的代码和结果是:
s.split(":") 结果:["boo","and","foo"]
s.split(":",2) 结果:["boo","and:foo"]
s.split(":",5) 结果:["boo","and","foo"]
s.split(":",-2) 结果:["boo","and","foo"]
s.split("o") 结果:["b","",":and:f"]
s.split("o",2) 结果:["b","o:and:foo"]

但是会拆分出空值

String a =",a,,b,";
a.split(",") 结果:["","a","","b"]

使用google的Guava快速去除空值

String a =",a, ,  b  c ,";
// Splitter 是 Guava 提供的 API
List<String> list = Splitter.on(',')
.trimResults()// 去掉空格
.omitEmptyStrings()// 去掉空值
.splitToList(a);
log.info("Guava 去掉空格的分割方法:{}",JSON.toJSONString(list));
// 打印出的结果为:
["a","b c"]

4-5:字符串合并

合并我们使用 join 方法,此方法是静态的,我们可以直接使用。

方法有两个入参,参数一是合并的分隔符,参数二是合并的数据源

不足:join不能连续合并(不能链式合并),无法过滤Join对象是List时的null值

解决办法:使用Guava 提供的 API,Joiner快速合并

// 依次 join 多个字符串,Joiner 是 Guava 提供的 API
Joiner joiner = Joiner.on(",").skipNulls();
String result = joiner.join("hello",null,"china");
log.info("依次 join 多个字符串:{}",result); List<String> list = Lists.newArrayList(new String[]{"hello","china",null});
log.info("自动删除 list 中空值:{}",joiner.join(list)); // 输出的结果为;
依次 join 多个字符串:hello,china
自动删除 list 中空值:hello,china

Java源码解析|String源码与常用方法的更多相关文章

  1. [Java源码解析] -- String类的compareTo(String otherString)方法的源码解析

    String类下的compareTo(String otherString)方法的源码解析 一. 前言 近日研究了一下String类的一些方法, 通过查看源码, 对一些常用的方法也有了更透彻的认识,  ...

  2. 《Flink 源码解析》—— 源码编译运行

    更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...

  3. spring源码解析——spring源码导入eclipse

    一.前言     众所周知,spring的强大之处.几乎所有的企业级开发中,都使用了spring了.在日常的开发中,我们是否只知道spring的配置,以及简单的使用场景.对其实现的代码没有进行深入的了 ...

  4. Java生成与解析二维码

    1.下载支持二维码的jar包qrcode.jar和qrcode_swetake.jar, 其中qrcode_swetake.jar用于生成二维码,rcode.jar用于解析二维码,jar包下载地址(免 ...

  5. Java生成、解析二维码

    今天遇到需求,使用Java生成二维码图片,网搜之后,大神们早就做过,个人总结一下. 目标:借助Google提供的ZXing Core工具包,使用Java语言实现二维码的生成和解析. 步骤如下: 1.m ...

  6. java生成和解析二维码

    前言 现在,二维码的应用已经非常广泛,在线生成器也是诸多,随手生成. 所以就和大家分享一个小案例,用zxing来做一个的二维码生成器,当然这个例子是比较简单,若是写的不好请多多包涵. ZXING项目是 ...

  7. 使用Google提供的ZXing Core,Java生成、解析二维码

    1.maven项目中,pom.xml中引入ZXing Core工具包: <!-- https://mvnrepository.com/artifact/com.google.zxing/core ...

  8. java 生成和解析二维码

    public class QRCode { /** * 解析二维码(QRCode) * @param imgPath * @return */ public static String decoder ...

  9. 微信小程序扫码解析小程序码

    通过微信扫小程序码,跳转到应用小程序内, 如何解析小程序码的参数呢? 一般小程序码会跳转到设置的页面,如首页, 可以直接跳转到小程序首页,然后解析小程序携带的参数,再打开某个页面. (小程序码的路径要 ...

随机推荐

  1. 微擎 人人商城 导出excel表分析

    在 数据处理上 ,有很多时候需要导出excel表  来当报表, 等 ,  php  人人商城导出报表过程简单分析 在导出时候发现 ca('statistics.order.export'); 出于好奇 ...

  2. Linux Centos虚拟机扩容(/dev/mapper/centos-root)

    1:.首先查看我们的根分区大小是多少 df -h 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root xfs 18G 1.1G 17G 6% / devt ...

  3. win8,右键添加notepad++

    1.下载并安装notepad++ 2.创建txt文件test1.txt,内容如下: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\ ...

  4. 【牛客Wannafly挑战赛12】 题解

    传送门:https://www.nowcoder.com/acm/contest/79#question 说是比赛题解,其实我只会前三题: 后面的一定补 T1 题意,在一个长度为n的时间内,问如何选择 ...

  5. hdu 5037 Frog(贪心)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5037 题解:为了让放的石头有意义肯定是没l+1的距离放2个也就是说假设现在位置为pos那么 ...

  6. CodeForces 834D The Bakery

    The Bakery 题意:将N个数分成K块, 每块的价值为不同数字的个数, 现在求总价值最大. 题解:dp[i][j] 表示 长度为j 且分成 i 块的价值总和. 那么 dp[i][j] = max ...

  7. codeforces C. Sonya and Problem Wihtout a Legend(dp or 思维)

    题目链接:http://codeforces.com/contest/713/problem/C 题解:这题也算是挺经典的题目了,这里附上3种解法优化程度层层递进,还有这里a[i]-i<=a[i ...

  8. 使用Elasticsearch7 java api实现pdf全文检索

    前提:pdf的内容是文字形式而不是图片形式! 一.方法 Elasticsearch实现pdf的全文检索,原理是将pdf转换为Base64,然后提取pdf的文字内容然后将其存储起来. Elasticse ...

  9. 2018 Multi-University Training Contest 3(部分题解)

    Problem F. Grab The Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Ja ...

  10. CenTOS7使用ACL控制目录权限,只给某个用户访问特定目录

    前言 Linux 基本的权限控制仅可以对所属用户.所属组.其他用户进行的权限控制,而不能精确地控制每个用户的权限.ACL 规则就是用来解决这个问题的. 使用 ACL 规则,我们可以针对单一账户设置文件 ...