脚本宝典收集整理的这篇文章主要介绍了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");
public int length() {
return this.value.length; // this.value :char[] 数组
}
字符串可以通过 + 和其他类型数据拼接,转为字符串。
String name = "苏" + "轼";
String str = null + ""; //
public String concat(String var1)
String name = "苏".concat("轼");
public String substring(int start)
public String substring(int start,int end) // 含左不含右
顺序查找字符或字符串,返回第一次出现的索引,没找到返回 -1。
lastIndexOf 从后面开始查找。
public int indexOf(int ch)
public int indexOf(String str)
public boolean contains(CharSequence var1)
CharSequence 是一个描述字符串结构的接口,有三种常见的子类:Stirng、StringBuilder、StringBuffer。
比较的是字符串的内容,即字面量。
public boolean equals(Object var1)
如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
public int compareTo(String var1)
public boolean startsWith(String var1)
public boolean endsWith(String var1)
public String trim()
public char[] toCharArray()
public byte[] getBytes()
// var1 :指定编码
public byte[] getBytes(String var1) throws UnsupportedEncodingException
替换字符串中的某个字符或子字符串。
public String replace(char var1, char var2)
public String replace(CharSequence var1, CharSequence var2)
public String replaceAll(String regex, String var2)
根据 正则表达式 将字符串拆分成某字符串数组。
public String[] split(String regex)
String 类内部用一个字符数组表示字符串。(Java 9 前)
String 中的大部分方法内部也都是操作的这个字符数组。
PRivate final char[] value;
java.lang.String
是 final
类,不可继承。
字符数组也是 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 对象。
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或者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。
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会增加实际使用的长度。
public int indexOf(String var1)
public AbstractStringBuilder insert(int var1, String var2)
在确保有足够长度后,首先将原数组中 var1 开始的内容向后挪动n个位置,n为待插入字符串的长度,然后将待插入字符串复制进var1 位置。
String可以直接使用+和+=运算符,Java编译器一般会生成StringBuilder,+和+=操作会转换为append。
但是,在稍微复杂的情况下,Java编译器可能没有那么智能,它可能会生成过多的StringBuilder,尤其是在有循环的情况下。
因此对于简单的情况,可以直接使用String的+和+=,对于复杂的情况,尤其是有循环的时候,应该直接使用StringBuilder。
以上是脚本宝典为你收集整理的11_Java字符串全部内容,希望文章能够帮你解决11_Java字符串所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。