Java 知识点整理-6.Java常用类Scanner类 + String类

1、Scanner的概述:一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。java.util包下,使用需要导包;被final修饰,不能被继承。

2、Scanner的构造方法原理:Scanner(InputStream source) InputStream输入流。

3、System类下有一个静态的字段:public static final InputStream in; 标准的输入流,对应着键盘的录入。例如:System.in是标准的键盘输入流。

4、Scanner的两个一般方法:Ⅰ.hasNextXxx() 判断是否还有下一个输入项,其中Xxx可以是Int,Double等。如果需要判断是否包含下一个字符串,则可以省略Xxx。

5、Scanner的两个一般方法:Ⅱ.nextXxx() 获取下一个输入项。Xxx的含义和hasNextXxx()中的Xxx相同,默认情况下,Scanner使用空格,回车为分隔符。

Scanner获取数据出现的小问题及解决方案:

两个常用方法:

public int nextInt():获取一个int类型的值。

public String nextLine():获取一个String类型的值。

问题:同时先后用nextInt()和nextLine()方法接收整数和字符串,但控制台在输入整数后会立刻打印结果且只输出整数结果,无字符串结果。

问题解析:nextInt()是键盘录入整数的方法,当我们录入整数的时候,其实在键盘上录入的是该整数和\r\n,nextInt()方法只获取该整数就结束了。而nextLine()是键盘录入字符串的方法,可以接收任意类型。通过\r\n获取一行,只要遇到\r\n就证明一行结束。

解决方案:

第一种:先获取一个数值后,再创建一个新的键盘录入对象获取字符串,但是浪费堆内存空间。

第二种:把所有的数据都先按照字符串获取,再对应转换成你想要的类型。

7、String概述:String类代表字符串。java.lang包下,不需要导包;被final修饰,不能被继承。

8、Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现(可以看成是一个字符串对象)。

9、 字符串是常量,一旦被赋值,就不能被改变,除非变成垃圾被扔了,重新赋值。当字符串变量被再次赋值时,原对象就会变成垃圾,变量将存储新字符串对象的地址值。

10、String类重写了toString方法,返回的是该对象本身。

11、String类的常见构造方法:

ⅰ.空构造 public String()。

ⅱ.把字节数组转成字符串 public String(byte[] bytes)。通过使用平台的默认字符集GBK解码指定的byte数组,构造一个新的String。 解码:将计算机读得懂的转换成我们读得懂的。

ⅲ.把字节数组的一部分转成字符串 public String(byte[] bytes,int index,int length)。int index表示从哪个索引开始,int length表示解码多少个。

ⅳ.把字符数组转换成字符串 public String(char[] value)。 char[] 字符数组名 = {'a','b','c'}; String字符串变量名 = new String(字符数组名); 等效于 String 字符串变量名 = "abc";

ⅴ.把字符数组的一部分转成字符串 public String(char[] value,int index,int count)。int index表示从哪个索引开始,int length表示转换多少个。

ⅵ.把字符串常量值转成字符串 public String(String original)。初始化一个新创建的String对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。由于String是不可变的,所以无需使用此构造方法,除非需要original的显式副本。

12、String是引用数据类型。

13、public boolean equals(Object anObject) 将此字符串与指定的对象比较。当且仅当该参数不为null,并且是与此对象表示相同字符序列(值相同)的String对象时,结果才为true。

14、常量池特点:常量池中没有这个字符串对象,就创建一个,如果有直接用即可。

15、Alt+Shift+M 抽取方法快捷键。

16、Java语言提供对字符串串联符号(“+”)以及将其他对象转换为字符串的特殊支持。字符串串联是通过StringBuilder(或StringBuffer)类(字符串缓冲区)及其append方法实现的。字符串转换是通过toString方法实现的。

17、解析:当字符串在加一个其他数据类型的时候,底层先创建一个StringBuilder对象,然后调用append方法把其他的数据类型添加进来,相当于转成了对应的字符串。再调用toString()方法将StringBuilder对象转换成String。

18、面试题:

//Ⅰ.判断定义为String类型的s1和s2是否相等?
String s1 = "abc";    //abc准备进常量池,先看池子里有没有abc,没有,创建;否则,不创建。
String s2 = "abc";    //常量池已经有abc,不再创建。所以两个引用指向一个对象,记录同一个地址值。
System.out.println(s1 == s2);       //ture 
System.out.println(s1.equals(s2));  //true
//Ⅱ.下面这句话在内存中创建了几个对象?
String s1 = new String("abc");   /*解析:ⅰ.常量池没有,创建一个对象。new String()进堆,创建一个对象。把abc拷贝了一份副本给了堆,堆内存内的对象把地址值赋给了s1。共创建两个对象。注:常量池的地址值和堆内存的地址值不一样。
ⅱ.根据构造方法 public String(String original),参数即常量池的abc,堆内的abc属于副本。原本加副本共两个对象。*/
//Ⅲ.判断定义为String类型的s1和s2是否相等?
String s1 = new String("abc");    //记录的是堆内存对象的地址值
String s2 = "abc";    //记录的是常量池中的地址值
System.out.println(s1 == s2);    //false
System.out.println(s1.equals(s2));   //true
//Ⅳ.判断定义为String类型的s1和s2是否相等?
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2);    /*true,java中有常量优化机制,在编译时就变成了abc进入常量池。 例如:byte b = 3 + 4;  在编译时就变成了7,把7赋给b,常量优化机制。*/
System.out.println(s1.equals(s2));    //true
//Ⅴ.判断定义为String类型的s1和s2是否相等?
String s1 = "ab";
String s2 = "abc";   //ab和abc是两个对象,分别将常量池中的地址值传给s1和s2。
String s3 = s1 + "c";   /*字符串变量用加号和别的字符串进行串联。底层堆内存先创建一个Stringbuffer对象,通过append方法将ab和c加在一起。再在堆内存中调用该对象的toString方法,将toString转换成String,并将此产生的新地址值赋给s3。Stringbuffer的地址值不能直接给s3,s3是String类型的。*/
System.out.println(s3 == s2);   //false/*s3记录的是堆内存中的地址值。s2记录的是常量池中的地址值。*/
System.out.println(s3.equals(s2));   //true

19、String类的判断功能:

ⅰ.boolean equals(Object obj):比较字符串的内容是否相同,区分大小写。

ⅱ.boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写。

ⅲ.boolean contains(String str):判断大字符串中是否包含小字符串(传入的字符串)。

ⅳ.boolean startsWith(String str):判断字符串是否以某个指定的字符串(传入的字符串)开头。

ⅴ.boolean endsWith(String str):判断字符串是否以某个指定的字符串(传入的字符串)结尾。

ⅵ.boolean isEmpty():判断字符串是否为空。

20、空字符串和null的区别:空串是字符串常量,同时也是一个String类的对象,既然是对象,当然可以调用String类中的方法。null是空常量,不能调用任何的方法,否则会出现空指针异常。null常量可以给任意的引用数据类型赋值。

21、字符串常量和字符串变量作比较,最好把字符串的常量放在前面调用equals()方法。因为常量肯定不能是null,将变量当做参数传递,防止空指针异常。

22、String类的获取功能:

Ⅰ.int length():获取字符串的长度。数组的length是属性,String的length()是方法,获取的是每一个字符的个数。

Ⅱ.char charAt(int index):获取指定索引位置的字符。

Ⅲ.int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。

Ⅳ.int indexOf(String str):返回指定字符串在此字符串中第一次出现处的第一个字符的索引。

Ⅴ.int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。

Ⅵ.int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的第一个字符的索引。

Ⅶ.int lastIndexOf(int ch):返回指定字符在此字符串中最后一次出现处的索引。

Ⅷ.int lastIndexOf(String str):返回指定字符串在此字符串中最后一次出现处(最右边出现处)的第一个字符的索引。

Ⅸ.int lastIndexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置前(即从指定的索引处开始进行反向搜索,大白话:倒着找)最后一次出现处的索引。

Ⅹ.int lastIndexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置前(API:从指定的索引开始反向搜索)最后一次出现处的第一个字符的索引。

Ⅺ.String substring(int start):从指定位置开始截取字符串,默认到末尾。

Ⅻ.String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。包含头,不包含尾。左闭右开。

23、StringIndexOutOfBoundsException字符串索引越界异常。

24、参数接收的是int类型的,传递char类型的会自动提升。

25、lastIndexOf是从后往前找,但索引不变。

26、无论正着找,反着找,找不到,返回就是-1。

27、subString会产生一个新的字符串,需要用新的变量将新的字符串记录,原字符串创建后是不能被改变的。

28、字符串是由字符组成的,而字符的值都是有范围的,通过范围来判断字符串中是否包含该字符。

29、 String的转换功能:

Ⅰ.byte[] getBytes():把字符串转换为字节数组(通过GBK码表 )。

编码:把我们读得懂的转换为计算机读得懂的。

格式:

ⅰ.String 字符串变量名 = “ ”;

ⅱ.byte[] 字节数组名 = 字符串变量.getBytes();

ⅲ.for(int i=0; i<字节数组名.length;i++){System.out.print(字节数组名[i] + " ");}

Ⅱ.char[] toCharArray():把字符串转换为字符数组。拿到每一个字符。

格式:

ⅰ.String 字符串变量名 = “ ”;

ⅱ.char[] 字节数组名 = 字符串变量.toCharArray();

ⅲ.for(int i=0; i<字节数组名.length;i++){System.out.print(字符数组名[i] + " ");}

Ⅲ.static String valueOf(char[] chs):把字符数组转成字符串。

格式:

char[] 字符数组名 = {'a','b','c'};

String 字符串变量名 = String.valueOf(字符数组名);

System.out.println(字符串变量名); 其实底层用的就是String的构造方法。

Ⅳ.static String valueOf(int i):把int类型的数据转成字符串。

Ⅴ.String toLowerCase():把字符串转成小写。

Ⅵ.String toUpperCase():把字符串转成大写。

Ⅶ.String concat(String str):把字符串拼接。

30、用加号拼接字符串更强大,可以用字符串与任意类型相加。concat方法调用的和传入的都必须是字符串。

31、String类的valueOf()方法可以把任意类型的数据转成字符串。底层调用的是对象的toString()方法。

32、GBK码表一个中文代表两个字节。GBK码表特点,中文的第一个字节肯定是负数,第二个字节有可能是正数。

33、遍历字符串两种方式:

Ⅰ.先将字符串转换成字符数组,再去遍历字符数组。

Ⅱ.先获取字符串中每一个索引,根据charAt()方法根据索引去获取字符。

34、链式编程:只要保证每次调用完方法返回的是对象,就可以继续调用。

35、String类的特换功能:

Ⅰ.String replace(char old,char new) 用新字符替换旧字符,若指定的旧字符不存在,则打印原字符串。

Ⅱ.String replace(String old,String new) 用新字符串替换旧字符串,若指定的旧子字符串不存在,则打印原字符串。

36、String类去除字符串两端的空格:String trim()

37、String类按字典顺序比较两个字符串:

Ⅰ.int compareTo(String str) 按照unicode码表值对首个不同字符进行计算比较。如果其中一字符串全体字符与另一字符串的正序(从头开始)一部分字符相同,则返回长度的差值。

Ⅱ.int compareToIgnoreCase(String str)

38、char类型的转换都是遵循Unicode码表。而字节与字符串的转换遵循的是GBK码表,硬盘到内存的操作。 

猜你喜欢

转载自blog.csdn.net/from_heat/article/details/83716523