Scanner遇到的问题:
package cn.njupt;
import java.util.Scanner;
public class ScannerTest {
private static Scanner sc;
public static void main(String[] args) {
sc = new Scanner(System.in);
System.out.println("请输入第一个整数:");
int num = sc.nextInt();
System.out.println("请输入第二个字符串:");
String str = sc.nextLine();
System.out.println("整数:" + num + ",字符串:" + str);
// 测试:
System.out.print("111111111111");
System.out.print(str);
System.out.print("222222222222");
}
}
输出:
原因:
因为输入整数的时候,并不是输入单纯的整数,后面还有/r/n回车换行符 “12/r/n” ,nextInt是只扫描0到整数,后面的回车换行被sc扫描后被nextLine截取,那么nextLine凭什么获取一行呢?是因为他遇到/r/n就证明一行结束了,就停止扫描了,所以会出现错误
解决方法:1、创建两个sc对象 2、都用nextLine()(目前使用的)
String常见问题:
1、" " 和 null的区别:
" ":字符串常量,同时也是一个String类对象,既然是对象就可以调用String类的方法
null:是空常量,不能调用任何方法,否则会出现空指针异常,null可以给任何引用数据类型赋值
String s1 = "";
String s2 = null;
System,out.println(s1.isEmpty()); %%%输出true
System,out.println(s1.isEmpty()); %%%空指针异常nullPointerException
2、关于String的对象创建问题:
下面的两个输出是什么?
package cn.njupt;
public class StringPointer {
public static void main(String[] args) {
String s1 = "aaa";
String s2 = "aaa";
System.out.println(s1 == s2); %%%输出true
System.out.println(s1.equals(s2)); %%%输出true
}
}
解析,直接画个内存图:String和别的类不同,其对象直接创建在方法区的常量池里!!!,所以引用的地址都一样
3、关于String的对象创建问题(2):
问:下面的语句创建了几个对象??
答:两个!一开始在常量池里创建一个字符串,然后再栈里再创建一个此字符串的副本
综合以上两个问题:下面的输出是什么??
String里的equals已经被override过了,是看两者的内容是否相等,而不是看地址
package cn.njupt;
public class StringPointer {
public static void main(String[] args) {
String s1 = new String("aaa");
String s2 = "aaa";
System.out.println(s1 == s2); %%%输出false
System.out.println(s1.equals(s2)); %%%输出true
}
}
4、关于String的常量优化机制:
可以直接将几个小的String拼凑起来,而地址统一给定
package cn.njupt;
public class StringPointer {
public static void main(String[] args) {
String s1 = "a" + "a" + "a";
String s2 = "aaa";
System.out.println(s1 == s2); %%%输出true
System.out.println(s1.equals(s2)); %%%输出true
}
}
5、关于String的拼凑+的什么什么机制:
之前说过,一个String类型+别的基本类型还是String类型,那么是怎恶魔实现的呢??string + 另一个类型 = string
先在堆里创建一个StringBuilder对象,将两个拼接起来,然后再用toString方法将其变成String,地址传给引用
package cn.njupt;
public class StringPointer {
public static void main(String[] args) {
String s1 = "aaabbb";
String s2 = "bbb";
String s3 = "aaa" + s2;
System.out.println(s1 == s3); %%%输出false
System.out.println(s1.equals(s3)); %%%输出true
}
}