Java常用类(一)
创始人
2024-02-19 09:34:33

目录

字符串相关的类

一、String

String的特性

String不可变性的体现

String的实例化方式一:字面量的定义方式

String实例化方式二:通过new构造器的方式

 字符串的特性

 String使用陷阱

面试题

 String的常用方法

​编辑 String与基本数据类型转换

String与字符数组的转换

 String与字节数字转换

二、StringBuffer类(线程安全)

源码分析

StringBuffer扩容问题

StringBuffer常用方法

三、StringBuilder类(线程不安全)

String、StringBuffer、StringBuilder的区别


字符串相关的类

一、String

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

字符串是常量,用双引号引起来表示,它的值在创建后不能更改。 

String的特性

  • String实现了Serializable接口,表示字符串是支持序列化的
  • String实现了Comparable接口,表示字符串是可比较大小的
  • String是一个final的,表示不可变序列,且不可以被继承。
    • 实质:String内部定义了final char[] value用于存储字符串内容
  • 当字面量(区别于new)赋值方式给字符串赋值时,此时字符串声明在字符串常量池中
    • 字符串常量池中不会存储两个相同内容的字符串

String不可变性的体现

  • 当字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value赋值
  • 当对字符串进行连接操作时,也需要重新指定内存赋值,不能使用原有的value赋值
  • 当调用String的replace()方法修改值ID那个字符串是,也需要重新指定内存区域赋值

String的实例化方式一:字面量的定义方式

import org.junit.Test;public class StringTest {@Testpublic void test1(){String s1="abc";//字面量的定义方式String s2="abc";s1="hello";System.out.println(s1 == s2);//比较地址值System.out.println(s1);//helloSystem.out.println(s2);//abc}
}

输出结果为

内存解析

String实例化方式二:通过new构造器的方式

import org.junit.Test;public class StringTest {@Testpublic void test2(){//* 方式一:通过字面量定义的方式String s1="JavaEE";String s2="JavaEE";//* 方式二:通过new+构造器的方式String s3=new String("JavaEE");String s4=new String("JavaEE");System.out.println(s1 == s2);//trueSystem.out.println(s1 == s3);//falseSystem.out.println(s3 == s4);//falseSystem.out.println(s1 == s4);//false}
}

运行结果为

内存解析

 

 字符串的特性

  • * 1、常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
  • * 2、只要其中有一个是变量,结果就在堆中
  • * 3、如果拼接的结果调用intern()方法,返回值就在常量池中

 

import org.junit.Test;
public class StringTest {@Testpublic void test3(){String s1="java";String s2="ee";String s3="javaee";String s4="java"+"ee";String s5=s1+"ee";String s6="java"+s2;String s7=s1+s2;System.out.println(s3 == s4);//trueSystem.out.println(s3 == s5);//falseSystem.out.println(s3 == s6);//falseSystem.out.println(s4 == s5);//falseSystem.out.println(s3 == s7);//falseString s8=s5.intern();//返回值的得到的s8使用的常量值中已经存在的"javaee "System.out.println(s3 == s8);//true}
}

运行结果 

true
false
false
false
false
true

 String使用陷阱

  • String s1 = "a";
    • 说明:在字符串常量池中创建了一个字面量为"a"的字符串。
  •  s1 = s1 + "b";
    • 说明:实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符串s1+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。
  • String s2 = "ab";
    • 说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。
  • String s3 = "a" + "b";
    • 说明:s3指向字符串常量池中已经创建的"ab"的字符串。
  • String s4 = s1.intern();
    • 说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串赋值给s4。

面试题

String s=new String("abc");方式创建对象,在内存中创建了几个对象?

  答:两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:"abc"

 String的常用方法

 

 String与基本数据类型转换

字符串--->基本数据类型、包装类

  • Interger包装类的public static parseInt(String s):可以将“数字”字符组成的字符串转换为整型
  • 类似的使用java.lang包下的Byte、Short、Long、Double、Float类调用相应的类方法可以将“数字”字符组成的字符串转换为相应的基本数据类型

基本数据类型、包装类---->字符串 

  • 调用String类的public String valueOf(int n):可以将int型转换为字符串
  • 相应的valueOf(byte b)、valueOf(long l)、 valueOf(float f) 、valueOf(double d)、 valueOf(boolean b)可有参数的相应类型到字符串的转换

String与字符数组的转换

字符数组--->字符串

调用String类的构造器:String(char[]) String(char[],int offset,int length)分别用字符数组中的全部自负和部分字符创建字符串对象

字符串--->字符数组

  • public char[] toCharArray():将字符串的全部字符存放在一个字符数组中
  • public void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):提供了将指定索引范围的字符串存放到数组中的方法

 String与字节数字转换

字节数组--->字符串(调用String的构造器)

  • String(byte[]):使用平台的默认字符集解码指定的btye数组,构造一个新的String
  • String(byte[],int offset,int length):用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象

字符串--->字节数组

  • public byte[] getBytes():使用平台默认字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中
  • public byte[] getBytes(String charsetName):使用指定的字符集将此String编码到byte序列,并将结果存储到新的byte数组
package com.light.java;import org.junit.Test;import java.io.UnsupportedEncodingException;
import java.util.Arrays;public class StringTest {/*** String与byte[]之间的转换* 编码:字符串---->字节* String--->byte[]:调用String的getBytes()** 解码:编码的逆过程,字节---->字符串* byte--->String:调用String的构造器* 说明:解码时使用的字符集必须与编码时所使用的字符集一致,否则会出现乱码*/@Testpublic void test4() throws UnsupportedEncodingException {String str1="abc123战国";System.out.println("********编码*********");//编码byte[] bytes = str1.getBytes();//使用默认字符集编码(utf-8)System.out.println(Arrays.toString(bytes));byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码System.out.println(Arrays.toString(gbks));System.out.println("********解码*********");//解码//调用String的构造器String s = new String(bytes);//默认(utf-8)System.out.println(s);String s1 = new String(gbks,"gbk");//gbk字符集解码System.out.println(s1);}
}

运行结果为

二、StringBuffer类(线程安全)

java.lang.StringBuffer代表可变字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新对象

StringBuffer内部也是用char[]存储 

源码分析

  •  StringBuffer str2=new StringBuffer();//char[] value=new char[16];
    • 底层创建了长度为16的字符型数组
  • * StringBuffer str3=new StringBuffer("abc");//char[] value=new char["abc".length+16];
    • 底层创建了长度为"abc".length+16的字符型数组

StringBuffer扩容问题

如果要添加的数据底层装不下,那就需要扩容数组,默认情况下,扩容为原来的两倍+2,同时将原有数组复制到新数组中

StringBuffer常用方法

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

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

改: public char charAt(int n )

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

长度:public int length()

三、StringBuilder类(线程不安全)

StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样

String、StringBuffer、StringBuilder的区别

 * String:不可变的字符序列,底层用char[]存储

* StringBuffer:可变的字符序列,线程安全的,效率低,底层用char[]存储

* StringBuilder:可变的字符序列,线程不安全的,效率高,JDK5.0新增,底层用char[]存储

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...