1.Scanner final修饰,不能继承
文本扫描器,遇到\r\n 结束
2.String类概述
String
类代表字符串。Java 程序中的所有字符串字面值(如 "abc"
)都作为此类的实例实现。
3.String构造方法
将字节数组、字符数组转换成字符串,可以选择索引起始
4.String面试题
String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2)); //true
System.out.println(s1 == s2); //true
String s3 = new String("abc");
System.out.println(s1.equals(s3)); //true
System.out.println(s1 == s3); //false
String s4 = "a" +"b"+"c";
System.out.println(s1 == s4); //true,java中有常量优化机制
System.out.println(s1.equals(s4)); //true
String s1_1 = "ab";
String s5 = s1_1 + "c";
System.out.println(s5.equals(s1)); //true
System.out.println(s5 == s1); //false,任何数据与字符串用+串联都会产生新的字符串
分为常量池与堆内存
4.String 方法
boolean isEmpty()
String s = null;
s.isEmpty(); // nullpointer 错误
subString() 包含头不包含尾
/**
* getBytes()
*/
String s1 = "abc";
byte[] arr = s1.getBytes();
for (byte b:arr){
System.out.print(b+" "); //97 98 99
}
String s2 = "你好你好";
byte[] arr2 = s2.getBytes(); //通过gbk码表将字符串装换成字节数组
for (byte b:arr2){
System.out.print(b +" "); //-28 -67 -96 -27 -91 -67 -28 -67 -96 -27 -91 -67
//gbk码表一个中文代表两个字节,gbk码表第一个字节肯定是负数
}
/**
* toCharArray
* valueof
*/
String ss1 = "abc";
char[] ss_arr = ss1.toCharArray();
for (char c: ss_arr){
System.out.println(c);
}
char[] arrs = {'a','b','c'};
String ss2 = String.valueOf(arrs); //底层是由String类的构造方法完成的
System.out.println(ss2);
trim()只去掉首尾的空格
compareTo()按照码表值比较,查找的是unicode码表值
先比较首字符,再次是第二个字符,都一样后,比较长度
String s1 = "abc";
String s2 = "bcd";
String s3 = "abc";
String s4 = "acd";
String s5 = "abcedf";
System.out.println(s1.compareTo(s2)); //-1
System.out.println(s1.compareTo(s3)); //0
System.out.println(s1.compareTo(s4)); //-1
System.out.println(s1.compareTo(s5)); //-2
String ss1 = "我";
String ss2 = "你";
System.out.println(ss1.compareTo(ss2)); //4785
5.StringBuffer
(1)概述 线程安全的可变字符序列 (String是一个不可变的字符序列)
(2)方法
append、insert、deleteCharAt、delete、replace、reverse 返回值为StringBuffer
substring 返回值为String
(3)StringBuffer和String的相互转换
* A:String -- StringBuffer
* a:通过构造方法
* b:通过append()方法
* B:StringBuffer -- String
* a:通过构造方法
* b:通过toString()方法
* c:通过subString(0,length);
6.StringBuilder
面试题:
* String,StringBuffer,StringBuilder的区别
* StringBuffer和StringBuilder的区别
* StringBuffer是jdk1.0版本的,是线程安全的,效率低
* StringBuilder是jdk1.5版本的,是线程不安全的,效率高
* String和StringBuffer,StringBuilder的区别
* String是一个不可变的字符序列
* StringBuffer,StringBuilder是可变的字符序列
public static void main(String[] args) {
String s = "abc";
change(s);
System.out.println(s); //abc
StringBuffer sb = new StringBuffer();
sb.append("abc");
change(sb);
System.out.println(sb.toString()); //abcabc
}
public static void change(String s){
s += "abc";
}
public static void change(StringBuffer sb){
sb.append("abc");
}
要点必看
1. +
“+”和“+=”是Java中仅有的两个被重载的操作符,为String对象所重载。
String s = "abc"+"def"+mango+47;
在上述代码中生成了4个String对象,每使用一次 + 的操作符就会生成一个新的对象,实际上执行过程中是创建一个StringBuilder对象,然后调用append()方法,最后再使用toString()方法,转成String类型。
(1)直接使用String + 在执行循环体中创建StringBuilder对象,每一次循环创建一个StringBuilder对象
(2)直接使用StringBuilder append 在执行循环体外创建StringBuilder对象,只有一个StringBuilder对象,可以避免创建更多的StringBuilder对象。