java基础复习(十一)

java基础第十一天

常见对象Scanner类:一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。

java.util.Scanner

A Scanner分隔符模式将输入打破到令牌,默认情况下匹配空格。 然后可以使用各种next方法将得到的令牌转换成不同类型的值。

构造方法

  • Scanner(File source) 构造一个新的Scanner,产生从指定文件扫描的值
  • Scanner(File source,String charseName) 构造一个新的Scanner,产生从指定文件扫描的值
  • Scanner(InputStream source) 构造一个新的 Scanner ,产生从指定输入流扫描的值。
  • Scanner(InputStream source, String charsetName)构造一个新的 Scanner ,产生从指定输入流扫描的值。
  • Scanner(Path source) 构造一个新的 Scanner ,产生从指定文件扫描的值。
  • Scanner(Path source, String charsetName) 构造一个新的 Scanner ,产生从指定文件扫描的值。
  • Scanner(Readable source) 构造一个新的 Scanner ,产生从指定源扫描的值。
  • Scanner(ReadableByteChannel source) 构造一个新的 Scanner ,产生从指定通道扫描的值。
  • Scanner(ReadableByteChannel source, String charsetName) 构造一个新的 Scanner ,产生从指定通道扫描的值。
  • Scanner(String source)构造一个新的 Scanner ,产生从指定字符串扫描的值。
Scanner sc = new Scanner(System.in);
sc.nextInt();
//sc.nextLine();

常用方法

  • public int nextInt():获取一个int类型的值
  • public String nextLine():获取一个String类型的值

案例演示

int i = sc.nextInt();
String line = sc.nextLine();
System.out.println("i = "+i+"line ="+line);
//这里录入的时候只能录取到i的值就执行结束
/*
原因解析:
nextInt()是键盘录入整数的方法,当我们录入的是10的时候
其实键盘上录入的是10和\r\n,nextInt()方法只获取10就结束了
nextLine()是键盘录入字符串的方法,可以接收任意类型,但是他凭什么能获取第一行呢?
通过\r\n,只要遇到\r\n就证明一行结束
所以在这里,第一次读取到10 nextInt()方法,然后第二次遇到了\r\n直接就结束了。
*/

解决方案

  1. 创建两次对象,但是浪费空间
  2. 键盘录入的都是字符串,都用nextLine方法,后面我们会学习讲整数字符串转换成整数的方法。【推荐】

常见对象 String类

java.lang.String

public final class String

String类代表字符串。

Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。

字符串不变;

它们的值在创建后不能被更改。

字符串缓冲区支持可变字符串。

因为String对象是不可变的,它们可以被共享。 例如:

     String str = "abc";  

相当于:

     char data[] = {'a', 'b', 'c'};      String str = new String(data);

如果一个类,打印这个对象,返回的不是该对象加hashcode,那意味着这个类重写了toString方法。

String str = "abc";//"abc"可以看成一个字符串对象
str = "def";//这里将"def"赋值给了str,是可以的。而此时abc是被当作垃圾给丢了的。
System.out.println(str);//所以这里所说的String字符串不可改变,是指的真正的字符串,"abc"不可以被改变,而不是变量str所对应的值不可改变。

常见构造方法:

Constructor and Description
String()初始化新创建的 String对象,使其表示空字符序列。
String(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, Charset charset)构造一个新的String由指定用指定的字节的数组解码charset
String(byte[] ascii, int hibyte)已弃用此方法无法将字节正确转换为字符。 从JDK 1.1开始,首选的方法是通过String构造函数获取Charset ,字符集名称,或者使用平台的默认字符集。
String(byte[] bytes, int offset, int length)通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String
String(byte[] bytes, int offset, int length, Charset charset)构造一个新的String通过使用指定的指定字节子阵列解码charset
String(byte[] ascii, int hibyte, int offset, int count)已弃用此方法无法将字节正确转换为字符。 从JDK 1.1开始,首选的方式是通过String构造函数获取Charset ,字符集名称,或使用平台的默认字符集。
String(byte[] bytes, int offset, int length, String charsetName)构造一个新的 String通过使用指定的字符集解码指定的字节子阵列。
String(byte[] bytes, String charsetName)构造一个新的String由指定用指定的字节的数组解码charset
String(char[] value)分配一个新的 String ,以便它表示当前包含在字符数组参数中的字符序列。
String(char[] value, int offset, int count)分配一个新的 String ,其中包含字符数组参数的子阵列中的字符。
String(int[] codePoints, int offset, int count)分配一个新的 String ,其中包含 Unicode code point数组参数的子阵列中的 字符
String(String original)初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。
String(StringBuffer buffer)分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。
String(StringBuilder builder)分配一个新的字符串,其中包含当前包含在字符串构建器参数中的字符序列。
byte[] arr1 = {97,98,99}
String s2 = new String(arr1);
//解码,将计算机读的懂得转换成哦我们读得懂得
System.our.println(s2);//abc

byte[] arr2 = {97,98,99,100,101,102};
String s3 = new String(arr2,0,3);
System.out.println(s3);//abc

char[] arr3 ={'a','b','c','d','e'}
String s4 = new String(arr3);//将字符数组转换成串
System.out.println(s4);

String s5 = new String(arr3,1,3);
System.our.println(s5);//bcd

面试题:

1.

String s1 = "abc";
//常量池中如果有得话,就不创建,直接使用该引用。
String s2 = "abc";
System.out.println(s1 == s2);//? ==号比较得是地址值 true
System.out.println(s1.equals(s2));//true

2.下面这句话创建了多少个对象?

String s1 = new String("abc");

创建了两个对象

一个在常量池中一个在堆内存中。

常量池中拷了一份到堆中,堆中得是副本。

所以有两份。

1554710051216

3.

//一个是常量池中得地址值,一个是堆中得地址值
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2);//false
System.out.println(s1.equals(s2));//true

4.

String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2);//true,java中有常量优化机制
System.our.ptintln(s1.equals(s2));//true

5.

String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2);//false
System.out.println(s3.equals(s2));//true

//Java语言提供堆字符串串联符号“+”,以及将其他对象转换为字符串得特殊支持。字符串串联是通过StringBuilder类及其append方法实现得。字符串转换是通过toString()方法,转换成String对象得。

1554711018768

String类的判断

1554711195045

isEmpty();

Stirng s1 = "heima";
String s2 = "";
String s3 = null;
System.out.println(s1.isEmpty());
System.out.println(s2.isEmpty());
System.out.println(s3.isEmpty());//java.lang.NullPointException
/*
""和null的区别
""是字符串常量,同时也是一个String类的对象,既然是对象当然可以调用String类中的方法
null是空常量,不能调用任何方法,否则会出现空指针异常,null常量可以给任意的引用数据类型赋值。
*/

模拟用户登录

  • 需求:模拟登录,给三次机会,并提示还有几次。
  • 用户名和密码都是admin

分析:

  1. 模拟登录,需要键盘录入,Scanner
  2. 给三次机会,需要循环,for
  3. 并提示有几次,需要判断,if

如果字符串常量和字符串变量进行比较,尽量的将字符串常量放在前面,将变量当作参数传递,防止空指针异常。

String中的方法

1.length()

数组中的length是属性,而String中的length是方法。

String s1 = "heima";
System.out.println(s1.length());//5
String s2 = "你要减肥,造吗?";
System.out.println(s2.length());//8

char c = s2.charAt(5);
System.out.println(c);//造
char c2 = s2.charAt(10);//StringIndexOutOfBoundsException字符串索引越界异常。
System.out.println(c2);


String s3 = "heima";
int index = s3.indexOf(97);
//int index = s3.indexOf('a');参数接收的是int类型,传递char类型的会自动提升。
System.out.println(index);
//如果不存在,返回的是-1

int index3 = s3.indexOf("ma");//获取字符串中第一个字符出现的位置
System.out.println(index3);

String substring(int start ,int end);索引 左闭右开

String s = "woaiheima";
s.substring(4);//这里产生的是一个新的字符串。
System.out.println(s);//woaiheima 迷惑题

需求:字符串的遍历

通过charAt(index)方法。

需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数,其他字符出现的次数。

ABCDEabcd123456!@#$

  • 分析:字符串是由字符组成的,而字符的值都是由范围的,通过范围来判断是否包含该字符,如果包含就让计数器变量自增。

1554714503743

常见String类的转换

1.把字符串转换为字符数组

2.把字符数组转成字符串

3.把int类型转换成字符串【String类型的valueOf静态方法可以把任意类型的数据转成字符串】

String s2 = "你好你好";
byte[] arr = s2.getBytes();//通过gbk码表将字符串转换成字节数组
for(int i = 0;i < arr.length;i++){
    System.out.println(arr[i]);
    //编码:把我们看的懂得转换为计算机看的懂得
    //gbk表一个中文代表两个字节
    //gbk码表特点,中文得第一个字节肯定是负数
}

案例:

  • 需求:把以恶搞字符串的首字母转成大写,其余小写。

1554717276980

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

String类的其他功能:

1.replace

2.trim

1554720080069

字符串操作相关笔试题可以走起

大串中统计小串出现的次数

1554720584378

本文链接:

https://heyzen.club/index.php/J/237.html
1 + 7 =
快来做第一个评论的人吧~