String
定义String的几种方式:
String str1 = "lit";
String str2 = new String("lit");
char[] ch = {'l','i','t','a','o'};
String str3 = new String(ch);
String str4 = new String(ch,1,2);//从1位置开始截取2个字符
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
System.out.println(str4);
intern
intern方法:也叫入池方法,检测常量池中是否已经有该字符串,如果有,则直接指向该字符串,如果没有再进行创建。
若两个字符串进行比较,用equals,如果比较字符串变量中存储的地址,则用==:
String str1 = "lit";
String str2 = new String("lit");
System.out.println(str1==str2);
char[] ch = {'l','i','t','a','o'};
String str3 = new String(ch);
System.out.println(str1==str3);
String str4 = new String(ch,0,3);
System.out.println(str1==str4);
String str5 = new String("lit");
System.out.println(str2==str5);
String str9 = str1 + "";
System.out.println(str1==str9);
//以上都为false
String str6 = new String("lit").intern();
System.out.println(str1==str6);
String str7 = new String("l"+"i"+"t").intern();
System.out.println(str1==str7);
String str8 = "li"+"t";
System.out.println(str1==str8);
临时对象
临时对象:代码如下,此时虽然改变了变量str中的值,但是在这个过程中却会产生一些临时变量,在变量改变次数较少时,影响较小,但在次数较大时,影响就比较大了。
String str = "lit";
str = str+"...";
str = str+"!!!";
获取指定位置的字符
toCharArray():
public static void main(String[] args) {
String str = "lit-.-";
char[] arr = str.toCharArray();
for (int i = 0; i < arr.length; i++) {//arr.length是一个属性
System.out.println(arr[i]);
}
}
charAt():
public static void main(String[] args) {
String str = "lit-.-";
for (int i = 0; i < str.length(); i++) {//sre.length()是一个方法
System.out.println(str.charAt(i));
}
}
判断是否有不是数字的字符:ASCII表,通过给char的值加减32也可转换英文字符大小写
public static void main(String[] args) {
String str = "1234567";
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if(ch<'0'||ch>'9'){
System.out.println("有不是数字的字符");
break;
}
}
}
字节码转字符
把字节码转字符:
public static void main(String[] args) {
byte[] bytes ={97,98,99,100};
String str = new String(bytes,2,2);//从第二个元素开始,取两个元素转为字符存到str里
System.out.println(str);
str = new String(bytes,0,4);
byte[] byte = str.getBytes();//字符转字节
System.out.println(Arrays.toString(byte));//反向
}
字符转字节(选):
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "中国人";
byte[] bytes = str.getBytes("GBK");//把str中的字符转为GBK字节码,也可转成其他字节码
System.out.println(Arrays.toString(bytes));
}
字符串的比较
字符串的比较一般用equals来比较
字符串不区分大小写比较:eaualsIgnoreCase
public static void main(String[] args) {
String str1 = "abc";
String str2 = "AbC";
System.out.println(str1.equals(str2));
System.out.println(str1.equalsIgnoreCase(str2));
}
字符串的比较并排序:compareTo
compareTo对汉字字符串也可进行比较
反射(选)
String str = "ait";
//反射
Class cl = String.class;//指向String类源码
Field valueField = cl.getDeclaredField("value");//在源码中寻找value变量
valueField.setAccessible(true);//把value的访问属性修改为true
char[] value = (char[]) valueField.get(str);//定义一个新char[]类型数组的变量来接收String中的final char[] value
value[0] = 'l';//修改这个a为l
System.out.println(str);
StringBuilder
单线程
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("qqq");
sb.append("eee");
String str = sb.toString();
System.out.println(sb);//虽然结果与直接用String拼接结果一样,但是此时是没有临时对象的产生。
System.out.println(str);
}
StringBuffer
多线程
synchronized 保证线程安全
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer();
sb1.append("qqq");
sb1.append("weq");
String str = sb1.toString();
System.out.println(str);
System.out.println(sb1);//虽然结果与直接用String拼接结果一样,但是此时是没有临时对象的产生。
}
区别
1、String的拼接会产生新的对象,但是StringBuilder和StringBuffer使用append方法来进行拼接,返回的是当前对象,这样就可以避免临时对象的产生。
2、String的拼接会被优化为StringBuilder
3、String的内容不可修改,而StringBuilder和StringBuffer的内容可以修改
3、StringBuilder采用异步处理,属于线程不安全操作,而StringBuffer采用同步处理,属于线程安全操作
PS:过时方法:如果一个方法被Deprecated注解,则此方法已经过时。(注解就是写在方法上一行用@来表示的,如重写方法的注解为@Override)