11_Java字符串

发布时间:2022-06-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了11_Java字符串脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

常用操作

字符串创建

  • 字面量创建
String name1 = "JOJO";
String name2 = new String("苏轼");
char[] charArr = {'A','B','C'};
String str = new String(charArr);
public String(byte[] VAR1)
// var2 : 指定编码
public String(byte[] var1, String var2) throws UnsupportedEncodingException 
byte[] byteArr = new byte[1024];
String str1 = new String(byteArr);
String str2 = new String(byteArr,"GBK");

字符串长度

  • length
public int length() {
  return this.value.length; // this.value :char[] 数组
}

字符串拼接

  • +

字符串可以通过 + 和其他类型数据拼接,转为字符串。

String name = "苏" + "轼";
String str = null + ""; // 
  • concat
public String concat(String var1) 
String name = "苏".concat("轼");

字符串截取

  • substring
public String substring(int start)
public String substring(int start,int end) // 含左不含右

字符或字符串查找

  • indexOf

顺序查找字符或字符串,返回第一次出现的索引,没找到返回 -1。

lastIndexOf 从后面开始查找。

public int indexOf(int ch)  
public int indexOf(String str) 

字符串包含判断

  • contains
public boolean contains(CharSequence var1)

CharSequence 是一个描述字符串结构的接口,有三种常见的子类:Stirng、StringBuilder、StringBuffer。

字符串内容比较

  • equals

比较的是字符串的内容,即字面量。

public boolean equals(Object var1) 

字符串大小比较

  • compareTo

如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

public int compareTo(String var1) 

字符串开头或结尾判断

  • startsWITh
public boolean startsWith(String var1) 
  • endsWith
public boolean endsWith(String var1) 

去除头尾空格

  • trim
public String trim()

转字符数组

  • toCharArray
public char[] toCharArray()

转字节数组

  • getBytes
public byte[] getBytes()
// var1 :指定编码
public byte[] getBytes(String var1) throws UnsupportedEncodingException

字符串替换

  • replace

替换字符串中的某个字符或子字符串

public String replace(char var1, char var2) 
public String replace(CharSequence var1, CharSequence var2)
  • replaceAll
public String replaceAll(String regex, String var2) 

字符串分割

  • split

根据 正则表达式 将字符串拆分成某字符串数组

public String[] split(String regex) 

字符串深入

内部结构

String 类内部用一个字符数组表示字符串。(Java 9 前)

String 中的大部分方法内部也都是操作的这个字符数组。

PRivate final char[] value;

不可变性

java.lang.Stringfinal 类,不可继承。

字符数组也是 final ,一旦赋值,不可改变

对字符串的修改实际不会改变原字符数组,而是创建一个新的字符数组。

如果需要频繁修改字符串,一般使用 StringBuilder(线程不安全) 或 StringBuffer。

字符串常量

Java 中的字符串常量除了可以直接赋值给 String 变量外,本身也可以直接调用 String 的各种方法。

实际上,这些常量就是 String 类型的对象,在内存中,它们被放在一个共享的地方,称为字符串常量池,它保存所有的常量字符串,每个常量只会保存一份,被所有使用者共享。当通过常量的形式使用一个字符串的时候,使用的就是常量池中的那个对应的String类型的对象。

public String(String var1) {
  this.value = var1.value;
  this.hash = var1.hash;
}

通过 new String( String str) 创建 String 对象的时候,实际是将常量池中对象的值赋给新建 String 对象。

hashCode

public int hashCode() {
    int var1 = this.hash;
    if (var1 == 0 && this.value.length > 0) {
        char[] var2 = this.value;

        for(int var3 = 0; var3 < this.value.length; ++var3) {
            var1 = 31 * var1 + var2[var3];
        }

        this.hash = var1;
    }

    return var1;
}

如果缓存的 hash 不为0,就直接返回了,否则根据字符数组中的内容计算 hash。

hash值与每个字符的值有关,也与每个字符的位置有关,位置i(i>=1)的因素通过31的(n-i)次方表示。

使用31大致是因为两个原因:一方面可以产生更分散的散列,即不同字符串hash值也一般不同;另一方面计算效率比较高,31*h与32*h-h即(h<<5)-h等价,可以用更高效率的移位和减法操作代替乘法操作。

StringBuilder

如果字符串修改操作比较频繁,应该采用StringBuilder或者StringBuffer类,这两个类的方法基本是一样的,不同在于StringBuffer类是线程安全的,而StringBuilder类不是。

线程安全是有成本的,影响性能,而字符串对象及操作大部分情况下不存在线程安全问题,适合使用StringBuilder类。

基本用法

StringBuilder sb = new StringBuilder();
sb.apPEnd("JoJo");
sb.append(" 悟空");
System.out.println(sb.toString());

基本原理

char[] value;
int count;

StringBuilder 内部封装了一个字符数组,与 String 不同,这是可以修改的。

count 表示字符数组中已经使用的字符个数。

new StringBuilder()代码内部会创建一个长度为16的字符数组,count的默认值为0。

  • append 方法
public AbstractStringBuilder append(String var1) {
  if (var1 == null) {
    return this.appendNull();
  } else {
    int var2 = var1.length();
    this.ensureCapacityInternal(this.count + var2);
    var1.getchars(0, var2, this.value, this.count);
    this.count += var2;
    return this;
  }
}

append会直接复制字符到内部的字符数组中,如果字符数组长度不够,会进行扩展,实际使用的长度用count体现。具体来说,ensureCapacityInternal(count+len)会确保数组的长度足以容纳新添加的字符,str.getChars会复制新添加的字符到字符数组中,count+=len会增加实际使用的长度。

  • indexOf 位置查找
 public int indexOf(String var1)
  • insert
public AbstractStringBuilder insert(int var1, String var2) 

在确保有足够长度后,首先将原数组中 var1 开始的内容向后挪动n个位置,n为待插入字符串的长度,然后将待插入字符串复制进var1 位置。

String 的 + 和 +=

String可以直接使用+和+=运算符,Java编译器一般会生成StringBuilder,+和+=操作会转换为append。

但是,在稍微复杂的情况下,Java编译器可能没有那么智能,它可能会生成过多的StringBuilder,尤其是在有循环的情况下。

因此对于简单的情况,可以直接使用String的+和+=,对于复杂的情况,尤其是有循环的时候,应该直接使用StringBuilder。

脚本宝典总结

以上是脚本宝典为你收集整理的11_Java字符串全部内容,希望文章能够帮你解决11_Java字符串所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。