Java常用类(1)--字符串相关类String、StringBuffer、StringBuilder全面知识

文章目录

    • String类
    • StringBuffer类
    • StringBuilder类



String:不可变的字符序列;底层使用char[]存储
StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
StringBuilder:可变的字符序列; jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储



String类

String类:代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现

String:字符串,使用一对""引起来表示

①String声明为final的, 不可被继承。

②String实现了Serializable接口:表示字符串是支持序列化的。

③实现了Comparable接口:表示String可以比较大小。

④String内部定义了final char[] value用于存储字符串数据,它们的值在创建后不能更改。

⑤String:代表不可变的字符序列,即不可变性。
体现: 1. 当对字符串类型变量重新赋值时,不是修改原理的value,而是重新指定内存区域赋值。2. 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值。

⑥通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

⑦字符串常量池中是不会存储相同内容的字符串的。

在这里插入图片描述


String的不同实例化方式比较

方式一:通过字面量定义的方式
方式二:通过new + 构造器的方式

//通过字面量定义的方式:此时的s1和s2的数据“Hello”声明在方法区中的字符串常量池中
String s1 = "Hello";
String s2 = "Hello";//通过new+构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟的空间所对应的地址值
String s3 = new String("Hello");
String s4 = new String("Hello");system.out.print(s1 == s2); //true
system.out.print(s1 == s3); //false
system.out.print(s3 == s4); //false

在这里插入图片描述

在这里插入图片描述


String的不同拼接对比

String s1 = "Hello";
String s2 = "World";
final String sf = "world";String s3 = "HelloWorld";
String s4 = "Hello" + "World";String s5 = s1 + "World";
String s6 = "Hello" + s2;
String s7 = s1 + s2;
String sfx = "hello" + sf;system.out.print(s3 == s4); //true
system.out.print(s3 == s5); //false
system.out.print(s3 == s6); //false
system.out.print(s3 == s7); //false
system.out.print(s5 == s6); //false
system.out.print(s5 == s7); //false
system.out.print(sfx == s3); //trueString s8 = s5.intern(); 
system.out.print(s3 == s8); //trueString s9 = s7.intern(); 
system.out.print(s8 == s9); //true

常量与常量的拼接结果在常量池,且常量池中不会存在相同内容的常量;
只要其中有一个是变量,结果就在堆中,虽然堆中存储的地址值也是指向常量池;
如果拼接的结果调用intern()方法,返回值就在常量池中。


String类常用方法

int length():返回字符串的长度: return value.length

char charAt(int index): 返回某索引处的字符return value[index]

boolean isEmpty():判断是否是空字符串:return value.length == 0

String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写

String trim():返回字符串的副本,忽略前导空白和尾部空白

boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):忽略大小写比较内容

String concat(String str):将指定字符串连接到此字符串的结尾,等价于用“+”

int compareTo(String anotherString):比较两个字符串的大小,加减

String substring(int beginIndex):返回一个新的字符串,它是此字符串的从
beginIndex开始截取到最后的一个子字符串

String substring(int beginIndex, int endIndex):返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串

boolean endsWith(String suffix):此字符串是否以指定的后缀结束
boolean startsWith(String prefix):此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):此字符串从指定索引开始的子字符串是否以指定前缀开始

boolean contains(CharSequence s):此字符串是否包含指定的序列

int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始

int lastIndexOf(String str):返回指定子字符串在此字符串中最后一次出现处的索引
int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
(注:indexOf和lastIndexOf方法如果未找到都是返回-1)

String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
String replaceAll(String regex, String replacement): 使 用 给 定 的replacement 替换此字符串所有匹配给定的正则表达式的子字符串
String replaceFirst(String regex, String replacement): 使 用 给 定 的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串

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

String[] split(String regex):根据给定正则表达式的匹配拆分此字符串
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中


String类与其他类型的转换

①String与基本数据类型及其包装类的转换:
String–>基本数据类型、包装类:例如Integer.parseInt(String s)Xxx包装类.parseXxx(str)
基本数据类型、包装类–>String:String.valueOf(xxx)或者xxx + ""

②String与字符数组char[ ]的转换:
String–>字符数组char[ ]:str.toCharArray()getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)提供了将指定索引范围内的字符串存放到数组中的方法
字符数组char[ ]–>String:String 类的构造器:String(char[])String(char[],int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象

③String与字节数组byte[ ]转换:
String–>字节数组byte[ ](编码):str.getBytes()使用平台的默认字符集将此 String 编码为byte序列;str.getBytes(String charsetName)使用指定的字符集将此 String编码为byte序列
字节数组byte[ ]–>String(解码):String(byte[])通过使用平台的默认字符集解码指定的byte数组,构造一个新的 String;String(byte[],int offset,int length)用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象



StringBuffer类

对字符串内容进行增删,不会产生新的对象。

在这里插入图片描述
在这里插入图片描述
StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:

StringBuffer():初始容量为16的字符串缓冲区
StringBuffer(int size):构造指定容量的字符串缓冲区
StringBuffer(String str):将内容初始化为指定字符串内容

public class StringBufferTest {public static void main(String[] args) {StringBuffer sb1 = new StringBuffer(); //底层创建了一个长度为16的char型数组,char[16]System.out.println(sb1.length()); //0,因为该length()方法返回的不是value(char[])的长度,而是重写的一个返回count的方法sb1.append('a'); //value[0]='a'sb1.append('b'); //value[1]='b'StringBuffer sb2 = new StringBuffer("abc"); //char[] value = new char["abc".length() + 16]System.out.println(sb2.length()); //3}
}

扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
默认情况下,扩容为原来容量的2倍+ 2,同时将原有数组中的元素复制到新的数组中,第一次相当于(16 * 2 + 2 = 34)。


StringBuffer类的常用方法

StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接

StringBuffer delete(int start,int end):删除指定位置的内容

StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str

StringBuffer insert(int offset, xxx):在指定位置插入xxx

StringBuffer reverse():把当前字符序列逆转

当append和insert时,如果原来value数组长度不够,可扩容。如上这些方法支持方法链操作。

int indexOf(String str)
String substring(int start,int end)
int length()
char charAt(int n )
void setCharAt(int n ,char ch)



StringBuilder类

StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样。不存在多线程问题的时候,考虑使用StringBuffer。



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

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

相关文章

hybbs接口php,HYBBS

#HYBBS官方地址: http://bbs.hyyyp.com论坛基于HYPHP框架开发MVC结构支持HOOK机制PDO操作SQL,支持众多数据库论坛特性服务器环境要求:支持子目录安装论坛PHP 5.3 包括5.3 , 5.3以上环境Apache || Nginx || IIS需要开启伪静态,否则无法安装~!数据库支持 : MYSQL , MSSQL ,Oracle…

Java常用类(2)--日期时间相关类Date、Calendar、LocalDateTime、Instant全面

文章目录java.lang.System类java.util.Date类java.sql.Date类java.text.SimpleDateFormat类java.util.Calendar(日历)类java.time类java.time.Instant类java.time.format.DateTimeFormatter 类其它APIjava.lang.System类 System类提供的public static long currentTimeMillis(…

apache camel_Apache Camel简介

apache camelApache Camel是著名的企业集成模式的开源实现。 Camel是一个路由和中介引擎,可帮助开发人员以各种特定于域的语言(DSL)(例如Java,Spring / XML,scala等)创建路由和中介规则。 骆驼…

Angular5 JWT身份验证(Spring Boot安全性)

欢迎使用带有Spring Security的angular5 jwt身份验证。在本教程中,我们将在一个angular5单页应用程序中使用jwt身份验证创建一个完整的堆栈应用程序,该应用程序具有由spring boot支持并集成了spring security的后备服务器。带有集成了HttpInterceptor的示…

Java常用类(4)--System类

System类代表系统,系统级的很多属性和控制方法都放置在该类的内部,该类位于java.lang包。 由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,可以…

Java常用类(5)--不可变的任意精度BigInteger、BigDecimal类

文章目录BigInteger类BigDecimal类BigInteger类 Integer类作为int的包装类,能存储的最大整型值为2^31-1,Long类也是有限的, 最大为2^63-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类 都无能为力。 java.math包的…

Java枚举类(1)--枚举类的定义、方法使用和接口实现

文章目录枚举类的理解枚举类的定义Enum类的主要方法枚举类实现接口枚举类的理解 当类的对象只有有限个,且确定的,称此类为枚举类。 当需要定义一组常量时,强烈建议使用枚举类。 如果枚举类中只有一个对象,则可以作为单例模式的…

java备忘录_Java 8备忘单中的可选

java备忘录Java 8 java.util.Optional<T>是scala.Option[T]和Data.Maybe在Haskell中的较差表亲。 但这并不意味着它没有用。 如果您不熟悉此概念&#xff0c;请将Optional想象为可能包含或不包含某些值的容器。 就像Java中的所有引用都可以指向某个对象或为null &#xf…

IDEA中注解注释快捷键及模板

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 文章目录单行注释多行注释文档注释(块注释)方法说明注解自动注…

让别人和自己看懂自己的程序代码?一文掌握Java单行多行、文档注释以及注解(Annotation)超详细的理解使用,IDEA注释注解快捷键和模板,提高程序代码更有可读性

文章目录单行和多行注释文档注释&#xff08;Java特有&#xff09;Annotation(注解)的理解常见的Annotation示例IDEA注释注解快捷键及模板自定义 AnnotationJDK 中的元注解单行和多行注释 注释的内容不参与编译&#xff0c;即编译以后的.class的字节码文件中不包含注释的内容。…

Java集合(1)--集合概述

Java 集合可分为 Collection 和 Map 两种体系 Collection接口&#xff1a;单列数据&#xff0c;定义了存取一组对象的方法的集合 ——List&#xff1a;元素有序、可重复的集合 ——Set&#xff1a;元素无序、不可重复的集合 Map接口&#xff1a;双列数据&#xff0c;保存具有…

win7下oracle10g安装,专门针对win7下oracle10g安装的详解

Window 7 下面安装Oracle 10g今在win7下安装oracle 10g client的时候遇到下面问题&#xff1a;在执行先决条件的时候&#xff0c;报目前只支持6.0的版本&#xff0c;修改oraparam.ini文件中的以下内容&#xff1a;[Certified Versions]#You can customise error message shown …

Java集合(3)--Iterator迭代器

Iterator对象称为迭代器(设计模式的一种)&#xff0c;主要用于遍历 Collection 集合中的元素。Collection接口继承了java.lang.Iterable接口&#xff0c;该接口有一个iterator()方法&#xff0c;那么所有实现了Collection接口的集合类都有一个iterator()方法&#xff0c;用以返…

Java集合(4)--List接口及其实现类ArrayList、LinkedList和Vector

文章目录List接口概述List接口常用方法ArrayList实现类LinkedList实现类Vector实现类List接口概述 List集合类中元素有序、且可重复&#xff0c;集合中的每个元素都有其对应的顺序索引 List容器中的元素都对应一个整数型的序号记载其在容器中的位置&#xff0c;可以根据 序号…

java hadoop_单元测试Java Hadoop作业

java hadoop在我以前的文章中&#xff0c;我展示了如何设置一个完整的基于Maven的项目&#xff0c;以用Java创建Hadoop作业。 当然并没有完成&#xff0c;因为它缺少单元测试部分。 在这篇文章中&#xff0c;我将展示如何将MapReduce单元测试添加到我之前开始的项目中。 对于单…

软件连接oracle失败怎么办,【编程开发工具】navicat连接oracle失败怎么办

Navicat连接oracle数据库时连接失败&#xff0c;出现ORA-28547错误。原因&#xff1a;navicat Primium版本的OCi和本地数据库的OCI版本不一致。解决方法&#xff1a;1、把navicat Primium版本自带oci.dll替换本地Oracle安装路径里的oci.dll。我的本地navicat Primium版本自带oc…

Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet

文章目录Set接口概述HashSet实现类LinkedHashSet实现类TreeSet实现类Set接口概述 1、Set接口是Collection的子接口&#xff0c;set接口没有定义额外的方法&#xff0c;使用的都是Collection接口中的方法。 2、Set 集合不允许包含相同的元素&#xff0c;如果试把两个相同的元素…

Java集合(6)--Map接口

文章目录Map接口概述Map结构的理解Map接口常用方法Map接口概述 Map与Collection并列存在&#xff0c;用于保存具有映射关系的数据:key-value Map中的 key 和 value 都可以是任何引用类型的数据 常用String类作为Map的“键”。key 和 value 之间存在单向一对一关系&#xff0…

Java集合(7)--Map接口的实现类HashMap、LinkHashMap、TreeMap和Properties

文章目录HashMap类LinkedHashMap类TreeMap类Hashtable类Properties类HashMap类 1、HashMap类概述 HashMap是 Map 接口使用频率最高的实现类&#xff0c;允许使用null键和null值&#xff0c;与HashSet一样&#xff0c;不保证映射的顺序。 所有的key构成的集合是Set&#xff1a…

为什么SpringBoot如此受欢迎,以及如何有效地学习SpringBoot?

SpringBoot是最流行和使用最广泛的Java框架。 有时这种讨论“为什么SpringBoot如此受欢迎&#xff1f;” 来我和我的朋友/同事之间。 另外&#xff0c;我确实收到了许多人发来的电子邮件&#xff0c;询问“春天很大&#xff0c;如何快速学习&#xff1f;” 。 在这篇文章中&…