Java --- String类

(一)String 

     java.lang.String 类代表字符串。Java 程序中所有的字符串文字(例如 "hello" )都可以看作是实现此类的实例。
  •  字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。

  •  字符串 String 类型本身是 final 声明的,意味着 String不能继承 。

  •  String 对象的字符内容是存储在一个字符数组 value[]中的。"abc" 等效于 char[] data={'h','e','l','l','o'}

   jdk8 中的 String 源码:

public final class String implements java . io . Serializable , Comparable < String >,
CharSequence {
/** The value is used for character storage . */
private final char value []; //String 对象的字符内容是存储在此
数组中
/** Cache the hash code for the string */
private int hash ; // Default to 0
private 意味着外面无法直接获取字符数组,而且 String 没有提供 value 的
get 和 set 方法。
final 意味着字符数组的引用不可改变,而且 String 也没有提供方法来修改
value 数组某个元素值
因此字符串的字符数组内容也不可变的,即 String 代表着不可变的字符序
列。即,一旦对字符串进行修改,就会产生新对象。
  只JDK9有,底层使用 byte[]数组。
public final class String implements java . io . Serializable , Comparable < String >, CharSequence {
@Stable
private final byte [] value ;
}
  Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持 (toString()方法)。

(二)String 的内存结构

概述

       因为字符串对象设计为不可变,那么所以字符串有常量池来保存很多常量对象。在JDK6 中,字符串常量池在方法区。JDK7 开始,就移到堆空间,直到目前 JDK17版本。
       举例内存结构分配:

(三)String 的常用 API 

 1、构造器

①public String() :初始化新创建的 String 对象,以使其表示空字符序列。
②String(String original): 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;简言之,新创建的字符串是该参数字符串的副本。
③public String(char[] value) :通过当前参数中的字符数组来构造新的String。
④public String(char[] value,int offset, int count) :通过字符数组的一部分来构造新的 String。
⑤public String(byte[] bytes) :通过使用平台的 默认字符集 解码当前参数中的字节数组来构造新的 String。
⑥public String(byte[] bytes,String charsetName) :通过使用指定的字符集解码当前参数中的字节数组来构造新的 String。
//字面量定义方式:字符串常量对象
String str = "hello";
//构造器定义方式:无参构造
String str1 = new String();
//构造器定义方式:创建"hello"字符串常量的副本
String str2 = new String("hello");
//构造器定义方式:通过字符数组构造
char chars[] = {'a', 'b', 'c','d','e'}; 
String str3 = new String(chars);
String str4 = new String(chars,0,3);
//构造器定义方式:通过字节数组构造
byte bytes[] = {97, 98, 99 }; 
String str5 = new String(bytes);
String str6 = new String(bytes,"GBK");
public static void main(String[] args) {
char[] data = {'h','e','l','l','o','j','a','v','a'};
String s1 = String.copyValueOf(data);
String s2 = String.copyValueOf(data,0,5);
int num = 123456;
String s3 = String.valueOf(num);
 System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}

2.String 的常用方法

      String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、 提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。

(1)boolean isEmpty():字符串是否为空

(2)int length():返回字符串的长度

(3)String concat(xx):拼接,运行效果等价于+

(4)boolean equals(Object obj):比较字符串是否相等,区分大小写

(5)boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写

(6)int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小

(7)int compareToIgnoreCase(String other):比较字符串大小,不区分大小写

(8)String toLowerCase():将字符串中大写字母转为小写

(9)String toUpperCase():将字符串中小写字母转为大写

(10)String trim():去掉字符串前后空白符

(11)public String intern():结果在常量池中共享

(12)boolean contains(xx):是否包含xx

(13)int indexOf(xx):从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1

(14)int lastIndexOf(xx):从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1

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

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

(17)char charAt(index):返回[index]位置的字符

(18)char[] toCharArray(): 将此字符串转换为一个新的字符数组返回

(19)String(char[] value):返回指定数组中表示该字符序列的 String。

(20)String(char[] value, int offset, int count):返回指定数组中表示该字符序列的 String。

(21)static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String

(22)static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String

(23)static String valueOf(char[] data, int offset, int count) : 返回指定数组中表示该字符序列的 String

(24)static String valueOf(char[] data) :返回指定数组中表示该字符序列的 String

(25)byte[] getBytes():编码,把字符串变为字节数组,按照平台默认的字符编码方式进行编码

byte[] getBytes(字符编码方式):按照指定的编码方式进行编码

(26)new String(byte[] ) 或 new String(byte[], int, int):解码,按照平台默认的字符编码进行解码

new String(byte[],字符编码方式 ) 或 new String(byte[], int, int,字符编码方式):解码,按照指定的编码方式进行解码

(27)boolean startsWith(xx):是否以xx开头

(28)boolean endsWith(xx):是否以xx结尾

(29)boolean matchs(正则表达式):判断当前字符串是否匹配某个正则表达式。

(30)String replace(被替换字符 , 替换后的字符):不支持正则

(31)String replaceFirst(正则,value):替换第一个匹配部分,当前字符串中第一个匹配正则的部分会被替换为value

(32)String repalceAll(正则, value):替换所有匹配部分,当前字符串中所有匹配正则的部分会被替换为value

(33)String[] split(正则):按照某种规则进行拆分

3、StringBuffer和StringBuilder常用API

为什么有StringBuffer和StringBuilder?

因为 String 对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低,空间消耗也比较高。因此,JDK 又在 java.lang 包提供了可变字符序列 StringBuffer 和 StringBuilder 类型。

StringBuffer 与 StringBuilder 的理解

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

 

 

 简言之,StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能

的方法也一样。
 
区分 String、StringBuffer、StringBuilder
StringStringBufferStringBuilder
String:不可变的字符序列; 底层使用 char[]数组存储(JDK8.0 中)
StringBuffer:可变的字符序列;线程安全(方法有 synchronized 修饰),效
率低;底层使用 char[]数组存储 (JDK8.0 中)
可变的字符序列:jdk1.5 引入,线程不安全的,效率高;底层使用 char[]数组存储(JDK8.0 中)

3.常用的API

常用的API,StringBuilder、StringBuffer的API是完全一致的

(1)StringBuffer append(xx):拼接,追加

(2)StringBuffer insert(int index, xx):在[index]位置插入xx

(3)StringBuffer delete(int start, int end):删除[start,end)之间字符

StringBuffer deleteCharAt(int index):删除[index]位置字符

(4)void setCharAt(int index, xx):替换[index]位置字符

(5)StringBuffer reverse():反转

(6)void setLength(int newLength) :设置当前字符序列长度为newLength

(7)StringBuffer replace(int start, int end, String str):替换[start,end)范围的字符序列为str

(8)int indexOf(String str):在当前字符序列中查询str的第一次出现下标

int indexOf(String str, int fromIndex):在当前字符序列[fromIndex,最后]中查询str的第一次出现下标

int lastIndexOf(String str):在当前字符序列中查询str的最后一次出现下标

int lastIndexOf(String str, int fromIndex):在当前字符序列[fromIndex,最后]中查询str的最后一次出现下标

(9)String substring(int start):截取当前字符序列[start,最后]

(10)String substring(int start, int end):截取当前字符序列[start,end)

(11)String toString():返回此序列中数据的字符串表示形式

(四)String 与其他结构间的转换

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

    Integer 包装类的 public static int parseInt(String s):可以将由“数字”字符组成的字符串转换为整型。类似地,使用 java.lang 包中的 Byte、Short、Long、Float、Double 类调相应的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型。
⑵基本数据类型、包装类 --> 字符串:
    
    调用 String 类的 public String valueOf(int n)可将 int 型转换为字符串相应的 valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double d)、valueOf(boolean b)可由参数的相应类型到字符串的转换。
⑶字符数组 --> 字符串:
String 类的构造器:String(char[]) 和 String(char[],int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象。
⑷字符串 --> 字符数组: 
    ① public char[] toCharArray():将字符串中的全部字符存放在一个字符数组中的方法。
    ② public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):提供了将指定索
引范围内的字符串存放到数组中的方法。
⑸字符串 --> 字节数组:(编码)
   ① public byte[] getBytes() :使用平台的默认字符集将此 String 编码为 byte 序列,并
将结果存储到一个新的 byte 数组中。
   ② public byte[] getBytes(String charsetName) :使用指定的字符集将此 String 编码到
byte 序列,并将结果存储到新的 byte 数组。
⑹字节数组 --> 字符串:(解码)
        ① String(byte[]):通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的String。
        ② String(byte[],int offset,int length) :用指定的字节数组的一部分,即从数组起始位置 offset 开始取 length 个字节构造一个字符串对象。
        ③ String(byte[], String charsetName ) 或 new String(byte[], int, int,String charsetName ):解码,按照指定的编码方式进行解码。
public void test01() throws Exception {
 String str = "中国";
 System.out.println(str.getBytes("ISO8859-1").length);
 // ISO8859-1 把所有的字符都当做一个 byte 处理,处理不了多个字节
 System.out.println(str.getBytes("GBK").length);// 4 每一个中文都是
对应 2 个字节
 System.out.println(str.getBytes("UTF-8").length);// 6 常规的中文都
是 3 个字
 /*
 * 不乱码:(1)保证编码与解码的字符集名称一样(2)不缺字节
 */
 System.out.println(new String(str.getBytes("ISO8859-1"), "ISO8859
-1"));// 乱码
 System.out.println(new String(str.getBytes("GBK"), "GBK"));// 中
国
 System.out.println(new String(str.getBytes("UTF-8"), "UTF-8"));//
中国
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘 关

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值