Java常用类库之String

String

1. String类

  • String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例(对象)。

  • 字符串是不变的; 它们的值在创建后无法更改。

    String str = "abc";
    //相当于:
    char data[] = {'a', 'b', 'c'};
    String str = new Strin(data);
    
  • 因为String对象是不可变的,所以可以共享它们,两个字符串内容如果完全相同,则占用同一块内存地址

    String text1 = "123";
    String text2 = "123";
    System.out.println(text1 == text2);
    //true
    String text3 = new String("123");
    System.out.println(text1 == text3);
    //false, new开辟新的内存空间,生成了两个对象
    

2. 字符串常量池

源码表明字符串可以看作常量:

public final class String
2.1 方法区
  • 方法区(Method Area),又称永久代(Permanent Generation)(永久存放在内存中,只要程序不结束),又称非堆区(Non-Heap space)方法区,常称PermGen.

  • 方法区是被所有线程共享.

    • 所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义.
    • 所有定义的方法的信息都哦保存在该区域,辞去属于共享空间.
    • 这些区域存储的是: 静态变量 + 常量 + 类信息(构造方法/接口定义) + 运行时的常量池。
  • 但是 实例变量 存在 堆内存中,和方法区无关。

  • 以上仅仅是逻辑上的定义。在HotSpot中,方法区仅仅指示逻辑上的独立,实际上还是在java堆中,方法区物理上属于java堆区中的一部分,而永久区(Permanent Gereration)就是方法区的实现。

2.2 堆(heap)
  • 一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类,方法,常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。

  • 堆 在逻辑上分为三部分(Perm):

    • 新生代(Young Generation,常称为YoungGen)
    • 老年代(Old Generation, 常称为OldGen,TenuringGen)
    • 永久代(Permanent Generation, 常称为PermGen)
2.2.1 新生区(New/Young Generation)
  • 新生代位于堆空间,又分为Eden区 和 Survior(幸存区):
    • Eden区:新创建的对象
    • Survior 0、1:经过垃圾回收,但是垃圾回收次数小于15次的对象
2.2.2 老年代(Old Generation)
  • 位于堆空间,新生代中gc()调用很快,如果一个对象连续15次gc都没有被回收,就会被放入老年代
2.2.3 永久代(Permanent Generation)
  • 位于非堆空间,永久区是一个常驻内存区域,用于存放JDK自身所携带的Class, Interface的元数据,也就是说他的运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占用的内存。

3 常用方法

字符串拼接
  • String用 + 拼接会产生大量的内存垃圾
  • 如果使用字符串拼接则不应该使用String,应使用StringBuffer或StringBuilder,使用方式与String类似
//StringBuilder是线程不安全的实现,StringBuffer是线程安全的实现,两者使用方法类似,使用append追加,在使用toString()转换成字符串
StringBuilder sb = new StringBuilder();
sb.append("1");
sb.append("2");
sb.append("3");
String text = sb.toString();
System.out.println(text);

使用 + 拼接字符串造成的内存浪费如图所示:
在这里插入图片描述

public char charAt​(int index)
  • 功能:返回指定索引处的char值。 指数范围为0至length() - 1。序列的第一个char值位于索引0,下一个位于索引1 ,依此类推,就像数组索引一样。
String str1 = "qwertyuio";
char c1 = str1.charAt(3);
System.out.println(c1);
//'r'
public int codePointAt​(int index)
  • 功能:返回指定索引处的字符(Unicode代码点)。索引引用char值(Unicode代码单位),范围从0到length() - 1 。
  • 字母和数字符号Unicode对照表:

    https://blog.csdn.net/xjp_xujiping/article/details/50210533

String str1 = "qwertyuio";
int n1 = str1.codePointAt(3);
System.out.println(n1);
//114
String str1 = "锄禾日当午";
int a1 = str1.codePointAt(3);
System.out.println(a1);
//24403,char可以表示中文字符
  • 类似方法:
    • public int codePointBefore​(int index)
      • 返回指定索引之前的字符(Unicode代码点)。 索引引用char值(Unicode代码单位),范围从1到length 。
    • public int codePointCount​(int beginIndex, int endIndex)
      • 返回此String的指定文本范围内的Unicode代码点数。 文本范围从指定的beginIndex开始,并延伸至char ,索引号为endIndex - 1 。
public int compareTo​(String anotherString)
  • 功能:按字典顺序比较两个字符串。 比较基于字符串中每个字符的Unicode值。 此String对象表示的字符序列按字典顺序与参数字符串表示的字符序列进行比较。 如果此String对象按字典顺序排在参数字符串之前,则结果为负整数。 如果此String对象按字典顺序跟随参数字符串,则结果为正整数。 如果字符串相等,结果为零。
String str1 = "qwertyuio";
String str2 = "123456789";
int n1 = str1.compareTo(str2);
System.out.println(n1);
//64 q->113, 1->49, 'q'-'1'=64
  • 如果没有它们不同的索引位置,那么较短的字符串按字典顺序排在较长的字符串之前。 在这种情况下, compareTo返回字符串长度的差异值:
String str1 = "qw";
String str2 = "qwer";
int n1 = str1.compareTo(str2);
System.out.println(n1);
//-2 str1.length() - str2.length() = -2
public int compareToIgnoreCase​(String str)
  • 功能:按字典顺序比较两个字符串,忽略大小写差异。 此方法返回一个整数,其符号是调用compareTo的整数,其中字符串的规范化版本通过在每个字符上调用Character.toLowerCase(Character.toUpperCase(character))消除了大小写差异。
String str1 = "qw";
String str2 = "QW";
int n1 = str1.compareToIgnoreCase(str2);
System.out.println(n1);
//0
public String concat​(String str)
  • 功能:将指定的字符串连接到此字符串的末尾, 与 + 类似。
String str1 = "qw";
String str2 = "QW";
String str3 = str1.concat(str2);
System.out.println(str3);
//qwQW
public boolean contains​(CharSequence s)
  • 功能:当且仅当此字符串包含指定的char值序列时,才返回true。
String str1 = "qw45fgfgfxc";
String str2 = "5f";
boolean b1 = str1.contains(str2);
System.out.println(b1);
//true
public boolean endsWith​(String suffix)
  • 功能:测试此字符串是否以指定的后缀结尾。
String str1 = "qw45fgfgfxc";
boolean b1 = str1.endsWith("c");
System.out.println(b1);
//true
public boolean equals​(Object anObject)
  • 功能:将此字符串与指定的对象进行比较。 当且仅当参数不是null且是String对象表示与此对象相同的字符序列时,结果为true 。
String str1 = "12345";
String str2 = "12345";
boolean b1 = str1.equals(str2);
System.out.println(b1);
//true
public boolean equalsIgnoreCase​(String anotherString)
  • 功能:忽略大小写,比较字符串
String str1 = "AqWqq";
String str2 = "aqwqq";
boolean b1 = str1.equalsIgnoreCase(str2);
System.out.println(b1);
public byte[] getBytes()
  • 功能:使用平台的默认字符集将此String编码为字节序列,将结果存储到新的字节数组中。
  • byte和char的区别:
    • byte是字节数据类型,是有符号型的,占一个字节,大小范围为-128~127,ASCII码,只能是英文或数字
    • char是字符数据类型,是无符号型的,占2字节,16位,大小范围是0~65535,Unicode码,可以是中文
String str1 = "AqWqq";
String str2 = "aqwqq";
byte[] arr = str1.getBytes(StandardCharsets.UTF_8);
System.out.println(Arrays.toString(arr));
//[65, 113, 87, 113, 113]
public void getChars​(int srcBegin, int srcEnd, char[] dst, int dstBegin)
  • 功能:将此字符串中的字符复制到目标字符数组中。
String str1 = "AqWqq";
char[] c1 = {'a', 'c', 'd', 'w', 'a'};
str1.getChars(1, 4, c1, 0);
System.out.println(Arrays.toString(c1));
//[q, W, q, w, a]
public int indexOf​(int ch)
  • 功能:返回指定字符第一次出现的字符串中的索引。 如果在此String对象表示的字符序列中出现值为ch的字符,则返回第一个此类事件的索引(以Unicode代码为单位)。
String str1 = "AqWqq";
int a = str1.indexOf('W');
System.out.println(a);
//2
  • 类似方法:
    • public int indexOf​(int ch, int fromIndex)
      • 返回指定字符第一次出现的此字符串中的索引,从指定索引处开始搜索。
    • public int indexOf​(String str)
      • 返回指定子字符串第一次出现的字符串中的索引。
    • public int lastIndexOf​(int ch)
      • 返回指定字符最后一次出现的字符串中的索引。
public String intern()
  • intern方法的功能:判断字符串常量池中是否存在一个引用,这个引用指向的字符串对象和当前对象相等(使用equals方法判断相等),如果存在直接返回这个引用,如果不存在则创建一个字符串对象并将其引用存入字符串常量池。

详情跳转至

public boolean isBlank()
  • 功能:如果字符串为空或仅包含 white space个代码点,则返回 true 否则 false。
String str1 = " ";
System.out.println(str1.isBlank());
//true
public boolean isEmpty()
  • 功能:返回 true ,当且仅当, length()是 0 。
String str1 = " ";
System.out.println(str1.isEmpty());
//false
public boolean matches​(String regex)
  • 功能:判断此字符串是否与给定的正则匹配。

正则表达式 https://www.runoob.com/regexp/regexp-syntax.html

public boolean regionMatches​(int toffset, String other, int ooffset, int len)
  • 功能:测试两个字符串区域是否相等。
  • 也可以忽略大小写regionMatches​(boolean ignoreCase, int toffset, String other, int ooffset, int len)
String str1 = "wewewewe";
String str2 = "aaweweweaa";
System.out.println(str1.regionMatches(2, str2, 2, 4));
//true
public String repeat​(int count)
  • 功能:返回一个字符串,其值为此字符串的串联重复count次。
String str1 = "abc";
System.out.println(str1.repeat(4));
//abcabcabcabc
public String replace​(CharSequence target, CharSequence replacement)
  • 功能:将此字符串中与文字目标序列匹配的每个子字符串替换为指定的文字替换序列。 替换从字符串的开头到结尾,例如,在字符串“aaa”中将“aa”替换为“b”将导致“ba”而不是“ab”。
String str2 = "aaaweweweaaa";
System.out.println(str2.replace("aa", "bs"));
//bsawewewebsa
public String replaceAll​(String regex, String replacement)
public String replaceFirst​(String regex, String replacement)
public String[] split​(String regex)
public String[] split​(String regex, int limit)
public boolean startsWith​(String prefix)
  • 功能:测试此字符串是否以指定的前缀开头。
String str2 = "aaaweweweaaa";
System.out.println(str2.startsWith("aaa"));
//true
public String strip()
  • 功能:返回一个字符串,其值为此字符串,并删除了所有前导和尾随white space 。
String str2 = "     aaawewe weaaa       ";
System.out.println(str2.strip());
//aaawewe weaaa
  • 类似:
    • public String stripLeading()
    • public String stripTrailing()
public CharSequence subSequence​(int beginIndex, int endIndex)
  • 功能:返回作为此序列的子序列的字符序列。
String str2 = "锄禾日当午";
System.out.println(str2.subSequence(2, 5));
//日当午
public String substring​(int beginIndex)
  • 功能:返回一个字符串,该字符串是此字符串的子字符串。 子字符串以指定索引处的字符开头,并延伸到此字符串的末尾。
  • public String substring​(int beginIndex, int endIndex)
    • 返回一个字符串,该字符串是此字符串的子字符串。 子字符串从指定的beginIndex开始,并扩展到索引endIndex - 1处的字符。 因此子串的长度是endIndex-beginIndex 。
public char[] toCharArray()
  • 功能:将此字符串转换为新的字符数组
String str2 = "锄禾日当午";
char[] c1 = str2.toCharArray();
System.out.println(Arrays.toString(c1));
//[锄, 禾, 日, 当, 午]
public String toLowerCase()
  • 功能:全部转换为小写
String str2 = "锄禾日当午";
System.out.println(str2.toLowerCase(Locale.ROOT));
String str1 = "HELLO";
System.out.println(str1.toLowerCase(Locale.ROOT));
//锄禾日当午
//hello
  • 类似:
    • public String toUpperCase​()
    • public String toUpperCase​(Locale locale)
public String trim()
  • 功能:返回一个字符串,其值为此字符串,删除了所有前导和尾随空格,其中space定义为其代码点小于或等于’U+0020’ (空格字符)的任何字符。
String str2 = "     锄禾日当午 ";
System.out.println(str2.trim());
//锄禾日当午
public static String valueOf​(double d)
  • 功能:将double转换为字符串
double d = 12.133;
String str1 = String.valueOf(d);
System.out.println(str1);
//12.133
  • String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串
  • String.valueOf(char c) : 将 char 变量 c 转换成字符串
  • String.valueOf(char[] data) : 将 char 数组 data 转换成字符串
  • String.valueOf(char[] data, int offset, int count) : 将 char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串
  • String.valueOf(double d) : 将 double 变量 d 转换成字符串
  • String.valueOf(float f) : 将 float 变量 f 转换成字符串
  • String.valueOf(int i) : 将 int 变量 i 转换成字符串
  • String.valueOf(long l) : 将 long 变量 l 转换成字符串
  • String.valueOf(Object obj) : 将 obj 对象转换成 字符串, 等于 obj.toString()
    har[] data, int offset, int count) : 将 char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串
  • String.valueOf(double d) : 将 double 变量 d 转换成字符串
  • String.valueOf(float f) : 将 float 变量 f 转换成字符串
  • String.valueOf(int i) : 将 int 变量 i 转换成字符串
  • String.valueOf(long l) : 将 long 变量 l 转换成字符串
  • String.valueOf(Object obj) : 将 obj 对象转换成 字符串, 等于 obj.toString()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值