天天看点

javaSE (九)Scanner遇到的问题、String编译常见问题

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");
	}
}
           

输出:

javaSE (九)Scanner遇到的问题、String编译常见问题

原因:

因为输入整数的时候,并不是输入单纯的整数,后面还有/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和别的类不同,其对象直接创建在方法区的常量池里!!!,所以引用的地址都一样

javaSE (九)Scanner遇到的问题、String编译常见问题

3、关于String的对象创建问题(2):

问:下面的语句创建了几个对象??

答:两个!一开始在常量池里创建一个字符串,然后再栈里再创建一个此字符串的副本

javaSE (九)Scanner遇到的问题、String编译常见问题
javaSE (九)Scanner遇到的问题、String编译常见问题

综合以上两个问题:下面的输出是什么??

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

	}

}

           
javaSE (九)Scanner遇到的问题、String编译常见问题