目录
String,StringBuilder,StringBuffer的区别,字符串拼接有什么区别:
字符串:
从概念上讲
,
Java
字符串就是
Unicode
字符序列
。
例如
,
串
“
Java
\
u
2122
”
由
5
个
Unicode
字符 J
、
a
、
v
、
a
和™
。
Java
没有内置的字符串类型
,
而是在标准
Java
类库中提供了
一个预定义类
,
很自然地叫做
String
。
常见字符串StringAPI:
- char charAt(int index)
- 返回给定位置的代码单元。除非对底层的代码单元感兴趣, 否则不需要调用这个方法。
- int codePointAt(int index)5.0
- 返回从给定位置开始的码点。
- int compareTo(String other)
- 按照字典顺序,如果字符串位于 other 之前, 返回一个负数;如果字符串位于 other 之 后,返回一个正数;如果两个字符串相等,返回 0。
- new String(int[] codePoints,int offset,int count)5.0
- 用数组中从 offset 开始的 count 个码点构造一个字符串。
- boolean equals(boject other)
- 如果字符串与 other 相等, 返回 true。
- boolean startWith(String prefix)
- boolean endsWith(String suffix)
- 如果字符串以 suffix 开头或结尾, 则返回 true。
- int indexOf(String str)
- int indexOf(String str,int fromIndex)
- int indexOf(int cp)
- int indexOf(int cp,int fromIndex)
- 返回与字符串 str 或代码点 cp 匹配的第一个子串的开始位置。这个位置从索引 0 或fromlndex 开始计算。 如果在原始串中不存在 str,返回 -1。
- int length()
- 返回字符串的长度。
- String replace(CharSequence oldString,CharSequence newString)
- 返回一个新字符串。这个字符串用newString 代替原始字符串中所有的oldString。可以用String或StringRuilder对象作为CharSequence参数
- String substring(int beginIndex)
- String substring(int beginIndex,int endIndex)
- 返回一个新字符串。这个字符串包含原始字符串中从beginIndex到串尾或endIndex-1的所有代码单元
- String toLowerCase()
- String toUpperCase()
- 返回一个新字符串。这个字符串将原始字符串中的大写字母改为小写,或者将原始字符串中的所有小写字母改成了大写字母。
- String trim()
- 返回一个新字符串。这个字符串将删除原始字符串头部和尾部的空格
- String[] split(String a) 分割
- 可以根据字符串里面你选中的标记字符进行分割,形成多个子字符串
- String[] a = "aassaassaassddffggssaa".split("ss");
- 意思是根据字符串ss进行分割,形成aa,aa,aa,ddffgg,aa5个子字符串,存入a数组中
public class Demo{
public static void main(String[] str){
String a=" String API演示abcdefg123456qwe ";//创建一个字符串a;
char x1 = a.charAt(3);//查找第3位字符;
int x2 = a.codePointAt(5);//查询第6位字符的编码(索引是5);
int x3 = a.compareTo("c");//比较编码值,从第一位开始比较;
String b = new String("a");
boolean x4 = a.equals(b);//判断字符串b和字符串字面值是否相等;
boolean x5 = a.startsWith(" String");//字符串是否以“ String开头”;
boolean x6 = a.endsWith("qwe ");//字符串是否以”qwe “结尾;
int x7 = a.indexOf("P");//字符串中”P“第一次出现的位置;
int x8 = a.indexOf("f",10);//从第10位开始,查找字符”f“的位置;
String x = new String("API");
int x9 = a.indexOf(x); //子字符串x在字符串a中首次出现的位置;
int x10 = a.indexOf(x,5);//从第5位开始查找子字符串x出现的位置;
int x11 = a.length(); //字符串a的长度;
String x12 = a.replace("e","m");//将字符串a中的字符e用字符m替换;
String x13 = a.substring(8);//查询从第8位开始到末尾的字符;
String x14 = a.substring(8,10);//查询第8位到第10位的字符(前闭后开:包括第8位不包括第10位);
String x15 = a.toLowerCase();//将字符串中所有字母小写;
String x16 = a.toUpperCase();//将字符串中所有字母大写;
String x17 = a.trim();//去除字符串开头结尾的空格;
String[] c = " String API演示abcdefg123456qwe ".split("g");//将字符串按g处分割;
System.out.println("x1:"+x1);
System.out.println("x2:"+x2);
System.out.println("x3:"+x3);
System.out.println("b:"+b);
System.out.println("x4:"+x4);
System.out.println("x5:"+x5);
System.out.println("x6:"+x6);
System.out.println("x7:"+x7);
System.out.println("x8:"+x8);
System.out.println("x9:"+x9);
System.out.println("x10:"+x10);
System.out.println("x11:"+x11);
System.out.println("x12:"+x12);
System.out.println("x13:"+x13);
System.out.println("x14:"+x14);
System.out.println("x15:"+x15);
System.out.println("x16:"+x16);
System.out.println("x17:"+x17);
System.out.println("c:"+c);
}
}
输出结果:
字符串为什么不可变:
字符串不可变:指的是不可在原地址修改,原地址空间不可控
引用类型的值大小会发生变化,对空间的要求不固定
等号左侧叫做句柄,右侧叫做值,在内存中,基本类型句柄和值是在一块的,引用类型不在一块;引用类型的句柄记录着值的地址,用来找到他的值,每修改一次值句柄内就换一次新地址,原来的地址就不要了(一般情况下 如果某一块地址没人记录他了 就会被删掉了但是 只有在字符串里面 他会重新指回来 因为有字符串常量池(常量池1.7版本及以前不在堆里面 1.8版本 及以后在堆里面了 要是修改回原来的值 句柄内还是用旧地址)
String,StringBuilder,StringBuffer的区别,字符串拼接有什么区别:
后两种拼接速度远远快于第一种;StringBuilder多线程之下不安全;StringBuffer在多线程之下安全,因为内部加锁了;这俩速度差不多,StringBuffer稍微慢。
buffer:原地址内存空间预留大,对拼接有缓冲,对内存消耗大大降低。如果见到其他类型带buffer的,它的核心存储区域是数组,带有很大缓冲空间的数组。目的就是在于节省内存。他是性能最好的