Scanner:
键盘录入工具,通过观察API发现,该类方法没有被static修饰,所以需要创建对象去使用,因此了解一下关于Scanner的构造方法
Scanner的构造方法:
public Scanner(InputStream source):构造一个新的Scanner
API解释:产生从指定的输入流扫描的值,流中的字节将使用底层平台的dafault charset转换为字符,Java默认使用的编码是Unicode 万国码
参数:InputStream source:InputStream指的是字节流类型、
简单理解为从键盘录入的数据
之前提到过:对于录入字符串类型的数据有两种方式:next(),nextLine()
public String next():查找并返回此扫描仪的下一个完整令牌
public String nextLine():将此扫描仪推进到当前行并返回跳过的输入
nextLine可以接收一些特殊字符,如换行符:\r\n,\n,\t等
String字符串:
概述:简单理解为由一个签子将若干个字符串穿起来的串。
API官方理解:
字符串是由多个字符组成的一串数据(字符序列)
字符串可以看成是字符数组
通过观察API发现:
1、String代表的是字符串,属于java.lang包下,所以在使用时不需要导包
2、String类字符串,Java程序中的所有字符串文字(如:"abc")都被实现为此类的实例(对象)
3、字符串不变;他的值在创建后不能被改变:字符串是常量,一旦被赋值,字符串本身不能被修改。
字符串的构造方法:
public String():无参构造方法
public String(byte[] bytes):
根据一个字节数组创建出一个字符串对象
public String(byte[] bytes,int offset,int length):
将字节数组中的一部分转化为字符串,从index索引处开始,长度为length的部分
public String(char[] value):
将字符数组转成一个字符串
public Stirng(char[] value,int index,int length):
将字符数组的一部分转成字符串,从index索引处开始,长度为length的部分
当转换的长度超过实际在数组中转换的长度时
报错:字符索引越界异常:StringIndexOutOfBoundsException
public String(String original):初始化新创建的字符串
这里引出查看字符串的长度方法:
public int length():返回此字符串的长度。
字符串的各种构造方法案例:
public class StringDemo1 {
public static void main(String[] args) {
//public String()
String s = new String();
System.out.println(s);
//结果显示不是地址值,说明String类中重写toString()方法
//查看字符串的长度
//public int length()返回此字符串的长度。
System.out.println("字符串s的长度为:" + s.length());
//如果字符串中没有字符,返回0
System.out.println("=============================================");
//public String(byte[] bytes)
//根据一个字节数组创建出一个字符串对象
byte[] bytes = {97, 98, 99, 100, 101};
String s2 = new String(bytes);
System.out.println("s2: " + s2);
System.out.println("字符串s2的长度为:" + s2.length());
System.out.println("=============================================");
//public String(byte[] bytes,int index,int length)
//将字节数组中的一部分转化成字符串
String s3 = new String(bytes, 1, 3);
System.out.println("s3: " + s3);
System.out.println("字符串s3的长度为:" + s3.length());
System.out.println("=============================================");
//public String(char[] value)
//将字符数组转成一个字符串
char[] c = {'a', 'b', 'c', 'd', '我', '爱', '冯', '提', '莫'};
String s4 = new String(c);
System.out.println("s4: " + s4);
System.out.println("字符串s4的长度为:" + s4.length());
System.out.println("=============================================");
//public String(char[] value,int index,int length)
//将字符数组的一部分转成字符串
String s5 = new String(c, 4, 5);
System.out.println("s5: " + s5);
System.out.println("字符串s5的长度为:" + s5.length());
System.out.println("=============================================");
//StringIndexOutOfBoundsException
// String s6 = new String(c,4,10);
// System.out.println("s6: "+s6);
// System.out.println("字符串s5的长度为:" + s6.length());
System.out.println("=============================================");
//public String(String original)
String s7 = "你好";
String s8 = new String(s7);
System.out.println("s8: " + s8);
System.out.println("字符串s8的长度为:" + s8.length());
}
}
输出结果:
字符串的拼接与常量池 :
字符串是常量,值在创建之后不可改变。以下代码:
public class StringDemo2 {
public static void main(String[] args) {
String s = "hello";
s += "world";
System.out.println(s);
}
}
输出结果为helloworld
解释:
当对s进行初始化时,先在常量池中开辟一处空间,存放hello字符串,再将该空间的地址值赋值给栈内存中的s,
当进行s+="world"操作时,JVM会先在常量池中查找是否有world字符串,没有则会在常量池中再开辟一块空间用于存放world。
在进行+操作时会先将hello与world做字符串拼接,再在常量池中寻找是否有helloworld字符串,没有则再开辟另外的一个空间存放helloworld,最后将helloworl的地址值赋值给s,自始至终,常量池中的值始终没有改变。