java中String类型的相关知识的简单总结
java中String类型的相关知识总结
一、常用方法:
1.构造方法:
byte数组
可指定offset和length
可指定charset
char数组
- 可指定offset和count
字符序列
- String
- StringBuffer
- StrngBuilder
2. 实例方法:
- 获取字符/码点/字节
charAt(int index) char
codePointAt(int index) int
getBytes() byte[]
getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin) void
toCharArray() char[]
- 长度
length() int
codePointCount(int beginIndex,int endIndex) int
- 字符串操作
concat(String str) String
substring(int beginIndex,int endIndex) String
split(String regex) String[]
trim() String
toUpperCase()/toLowerCase String
replace(char oldChar,char newChar) String
replace(CharSequence target,CharSquence replacement) String
replaceAll(String regex,String replacement) String
replaceFirst(String regex,String replacement) String
- 判断
contains(CharSequence s) boolean
endsWith(String suffix)/startsWith(String prefix) boolean
equals(Object anObject) boolean
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;
}
matches(String regex) boolean
- 序号
indexOf(int ch/String str)/lastIndexOf()
3. 静态方法:
String.format(String format,Obect... args) String
String.valueOf(xxx) String
二、底层实现:
jdk1.8中String类型底层就是一个char数组:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
三、不可变性:
String最为人所津津乐道的便是它的不可变性(immutable),这里就引出两个问题,String如何做到不可变的,以及不可变的好处
1. 如何实现不可变:
jdk1.8中String的字符存储在一个char数组里
- char数组final,不可变
- 没有提供任何可以修改数组内容的方法
2. 不可变的好处:
- 不可变,线程绝对安全
- 作为参数不可变,更安全
- 字符串常量池的需要,可以共享而不用担心被谁改变
- hash值不可变,只要算一次,可以缓存hash
3. String和StringBuffer和StringBuilder的区别:
String不可变,线程安全
StringBuffer可变,线程安全
StringBuilder可变,线程不安全
四、缓存池:
1.字符串常量池(String pool)里存放着所有的字符串字面量
String a="aaa";
String b="aaa";
//a,b引用到的String pool里的同一个对象
a==b//true
2. new 出来的String对象放在堆区
String a=new String("aaa");
String b=new String("aaa");
a==b//false
a=="aaa"//false
//这里实际是先创建字面量"aaa",再去创建对象的
new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址(注意,此时不需要从堆中复制到池中,否则,将使得堆中的字符串永远是池中的子集,导致浪费池的空间)!
关于
String str=new String("123")创建了几个对象的问题 很显然,new只调用了一次,也就是说只创建了一个对象。而这道题目让人混淆的地方就是这里,这段代码在运行期间确实只创建了一个对象,即在堆上创建了"abc"对象。而为什么大家都在说是2个对象呢,这里面要澄清一个概念,该段代码执行过程和类的加载过程是有区别的。在类加载的过程中,确实在运行时常量池中创建了一个"abc"对象,而在代码执行过程中确实只创建了一个String对象(堆上)。
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
3. intern()方法
先判断字符串常量池里是否已经有了这个字符串,如果有就返回常量池中该字符串的引用,没有就在常量池中添加并返回常量池中的引用。
String a=new String("aaa");
a=="aaa"//false
a=a.intern()
a=="aaa"//true
五、参考资料
鄙人只是一名在读的软件工程专业的本科生,正在复习找工作,故而将复习时遇到的一些有意思的东西总结出来,既是加深理解,也是便于日后复习。
鄙人才疏学浅,若文中有谬误之处,还望诸位不吝斧正,以免误人子弟。若有同道中人想一同讨论学习,也可以联系我=>2938189276@qq.com。未经作者允许,请勿转载!
路漫漫其修远兮,吾将上下而求索。
java中String类型的相关知识的简单总结的更多相关文章
- java中String类型的相关知识
String类方法整理说明: ·Length()用来求字符串的长度,返回值为字符串的长度: ·charAt()取该字符串某个位置的字符,从0开始,为char类型: ·getChars()将这个字符串中 ...
- Java中String类型细节
Java中String类型细节 一 . String两种初始化方式 1 . String str1= “abc”;//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测”abc”是否 ...
- Java中String类型详解
这篇博客是我一直想总结的,这两天一直比较忙,先上传下照片吧,过后有时间再弄成正常的. 本文主要是对Java中String类型的总结,包括其在JVM中是怎么存储的...
- java中string内存的相关知识点
(一):区别java内存中堆和栈: 1.栈:数据可以共享,存放基本数据类型和对象的引用,其中对象存放在堆中,对象的引用存放在栈中: 当在一段代码块定义一个变量时,就在栈中 为这个变量分配内存空间,当该 ...
- 【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
- 关于JAVA中String类型的最大长度
前些天看到一道面试题,题目很容易理解:String的长度限制是多少? 针对这个题目,浏览了网友的回答,大概得到了3个层次的答案. 最浅的层次: 近似计算机内存大小的长度.这是作为一个程序员最浅显的回答 ...
- Java中String类型的数据比较
在Java中如果想比较两个字符串是否相等,可以使用string1==string2 或string1.equal(string2)来比较. 但是,第一种方法过于局限.例如, String string ...
- Java中String类型的不可变性和驻留池
一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创 ...
- java中String类型
string对象常用方法 string对象比较方法: string类获取包含子串的方法: 字符串和数字的转换: String类 String对象是不可改变的,字符串一旦创建,内容不能再改变. 构造字符 ...
- Java中String类型的部分用法
1.如何将字符串转换为整型数值? int i = Integer.parseInt("20"); 2.如何用“==”还是equals比较两个字符串? “==”是用来比较俩引用是不是 ...
随机推荐
- Spring Boot 配置 jar 包外面的 Properties 配置文件
一.概述 Properties 文件是我们可以用来存储项目特定信息的常用方法.理想情况下,我们应该将其保留在 jar 包之外,以便能够根据需要对配置进行更改. 在这个教程中,我们将研究在 Spring ...
- FJOI2007轮状病毒 行列式递推详细证明
题目链接 题目给了你一个奇怪的图,让你求它的生成树个数. 开始写了一个矩阵树: #include<cstdio> #include<cstdlib> #include<c ...
- 2022网刃杯ics
目录 easyiec Ncsubj 喜欢移动的黑客 xyp07 ICS6-LED_BOOM 根据大佬的wp后,自己做了一遍 这次学到很多东西 ICS easyiec tcp追踪流直接能看到 编辑 ...
- LeetCode------移动零(5)【数组】
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/move-zeroes 1.题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末 ...
- 浅尝 ECDHE 协议流程
前言 ECDHE 我之前是听都没听过, 但是新业务需要对前后端通信进行加密, 经过大佬推荐才知道有这个东西, 经过几天的学习和踩坑, 才大致明白其流程和使用方式. 过程坎坷, 好在最后还是成功运用到了 ...
- Python3.11正式版,它来了!
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/b055fbf2.html 你好,我是测试蔡坨坨. 就在前几天,2022年10月24日,Python3.11正式版发布了! P ...
- gin-巧用Context传递多种参数
目录 引言: 1.巧妙包装gin.Context为NewContext 2 在使用gin.Use对每一个请求的Context进行组装 3 在路由绑定时解析出NewContext来为应用层函数提供参数, ...
- xshell调整字体大小
1. 进入设置 %default%:默认对全部终端生效 如果想对单一终端单独设置,可先进入会话管理,针对单一会话单独调整 2. 点击外观配置,修改字体大小
- Kubernetes安装GitLab
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying Kubernetes安装GitLab Step 1 ...
- c3 linearization详解
MRO MRO 全称方法解析顺序(Method Resolution Order),在多重继承和多继承存在的时候,寻找属性及方法的顺序. 深度优先(DFS)与广度优先(BFS) python2 所用的 ...