Scanner类、String类的说明与使用

一、Object

(一)API

1、API:Application Programming Interface,应用程序编程接口

2、接口:用于规定方法名称的规则的集合。定义方法名称、修饰符、返回值类型、参数列表、方法功能等。

3、实际:应用程序编程接口,也包含了Java中的接口、类、枚举以及他们其中的方法

4、学习中,更多侧重于基本的使用,以及一些底层原理,这些内容不需要我们自己去定义,只需要我们调用

(二)类库
1、Java代码编译之后会生成.class文件,.class文件包含了代码中所有的内容,Java程序执行时会执行.class文件,就算没有了源代码,.class文件也能够照常使用

2、Java中可以将.class文件,打成压缩包,形成一个Java特有的压缩文件——jar文件:
(1)jar文件,是Java特有的压缩包格式,一旦获取到了jar文件(jar包),我们就能得到里面所有的.class文件了
(2)jar包的生成:在Eclipse中,我们在需要生成jar文件的工程或者包上,右键选择export -> Java -> jar File -> 选择生成的jar文件存储的路径
(3)jar包的使用:在要是用jar包的工程下,创建一各lib文件夹,用于存放已经生成好的jar包,将jar包粘贴进lib目录下,之后再jar包上右键 -> Build Path -> Add to Build Path(将当前jar包下的类,添加到当前工程的编译路径)
(4)jar包的移除:既需要将jar文件从物理结构删除,也要从逻辑结构删除(在当前工程上右键 -> Build Path -> Configure Build Path -> libraries选项卡中,找到对应的jar文件,选择remove,之后apply)
3、类库:
(1)jar包容量还是太小,一系列的jar文件,就组成了一个类库,library
(2)一旦导入了类库,就相当于拥有了这个类库下的所有jar文件,相当于得到了其中所有的.class文件,就可以使用了
(3)添加类库的方式:
右键工程 -> Build Path -> Add libraries -> 选择要添加的类库即可

(三)Object概述
1、Object是所有类型的顶层父类,是所有类的直接或者间接的父类,所有类型中,都可以使用Object类型的方法(包括数组)

2、随意定义一个Java类型,不显式表示继承哪个类型,都会默认继承Object类

3、Object类型的构造方法:
(1)用于自己创建对象
(2)用于让子类的构造来访问
(3)Object类型创建对象时,Object的构造不会再访问别的类型的构造,因为它就是顶层了,它没有父类了

(四)toString方法
1、getClass() 获取到当前对象所属的类型

2、hashCode() 根据对象的情况,计算出对象的哈希码值

3、toString() 返回对象的字符串表示形式

4、推导过程:
(1)我们直接打印一个自定义类型的对象,打印的是对象的地址值
(2)我们通过对象调用继承而来的toString()方法打印而来的还是对象的地址值
(3)在Object类中,toString()方法确实是在计算并且返回对象的地址,计算公式:
getClass().getName() + “@” + Integer.toHexString(hashCode())
(4)我们通过(1)和(2)得到,直接打印对象的声明引用,会自动调用Object类中的toString()方法,得到地址
(5)但是我们作为人类,不需要地址值,拿到也没用
(6)结合方法重写前使用父类的方法,重写后使用子类的方法,我们在子类中重写toStirng要求返回对象的属性值
(7)在子类中重写toString()方法后,打印的就是对象的属性值

5、重写的原则:不要返回地址值,返回属性值

6、最终操作:我们可以自动生成重写:alt + shift + s S

7、如果以后要打印一个对象,先要显示对象的属性值而非地址值,就要在对象所属的类型中重写toString()方法,让其返回属性值而非地址值

代码示例

public class Demo01_ToString {

public static void main(String[] args) {
	Person p = new Person("张三", 23);
	
	//1.getClass方法能够获取到当前对象所属类型
	//System.out.println(p.getClass());
	
	//2.直接打印对象的声明引用,展示的是对象的地址值
	System.out.println(p);//地址值
	
	//3.对象的地址值由所属类型,艾特符号,十六进制数字三部分组成
	
	//4.toString方法调用后,打印的还是对象的地址值
	System.out.println(p.toString());
	
	//5.我们猜测:对象的地址值就是由toString方法得来的
	
	//6.计算对象的哈希码值
	System.out.println(p.hashCode());
	
	//7.将哈希码值转换为十六进制数字
	System.out.println(Integer.toHexString(p.hashCode()));
	
	//8.toString得到地址值的过程
	System.out.println(p.getClass().getName() + "@" + Integer.toHexString(p.hashCode()));
}
}



public class Person {
private String name;
private int age;

public Person() {
	super();
}

public Person(String name, int age) {
	super();
	this.name = name;
	this.age = age;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getAge() {
	return age;
}

public void setAge(int age) {
	this.age = age;
}

@Override
public String toString() {
	return "Person [name=" + name + ", age=" + age + "]";
}

/*@Override
public String toString() {
	return name + "..." + age;
}*/
}

(五)equals方法

1、用于比较两个对象是否相等。这两个对象分别为:调用者对象,参数对象

2、在Object类型中,比较的是两个对象的地址值是否一致

3、实际上,比较两个对象的地址不具有太多的实际意义,我们更希望比较对象的属性值来判断对象是否相等,我们就需要在对象所属类型中重写equals方法

4、最终操作:自动生成equals的快捷键:alt + shift + s H

代码示例

public class Demo02_Equals {

public static void main(String[] args) {
	Person p1 = new Person("张三", 23);
	Person p2 = new Person("李四", 24);
	Person p3 = new Person("张三", 23);
	
	System.out.println(p1.equals(p2));
	
	//false 地址不一样
	//true 属性都一样
	//equals方法比较是按照地址比较的
	System.out.println(p1.equals(p3));
	
	
}
}


public class Person {
private String name;
private int age;

public Person() {
	super();
}

public Person(String name, int age) {
	super();
	this.name = name;
	this.age = age;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getAge() {
	return age;
}

public void setAge(int age) {
	this.age = age;
}

@Override
public String toString() {
	return "Person [name=" + name + ", age=" + age + "]";
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Person other = (Person) obj;
	if (age != other.age)
		return false;
	if (name == null) {
		if (other.name != null)
			return false;
	} else if (!name.equals(other.name))
		return false;
	return true;
}

/*@Override
public boolean equals(Object obj) {//Object obj = new Person("张三", 23);
	
	//1.向下转型,将参数对象从父类引用转为本类引用
	Person p = (Person)obj;
	
	return this.name.equals(p.name) && this.age == p.age;
}*/

/*@Override
public String toString() {
	return name + "..." + age;
}*/
}

六)==和equals的区别
1、共同点:都是用于比较数据是否相等的方式
2、不同点:
(1)==是运算符,equals是方法
(2)比较的内容不同:==既可以基本数据类型,也可以比较引用数据类型;equals只能比较引用数据类型
(3)比较规则不同:==比较基本数据类型,比较值,比较引用数据类型,比较地址;equals重写前比较地址,重写后比较值

代码示例

public class Demo03_Question {

public static void main(String[] args) {
	System.out.println(123 == 123);
	
	Person p1 = new Person("zhangsan", 23);
	Person p2 = new Person("zhangsan", 23);
	
	System.out.println(p1 == p2);
	
	//p1.equals(p2);
	
	//123.equals(123);
}

}

二、Scanner类型

(一)概述

1、Scanner类型是一个可以扫描基本类型和字符串的简单文本扫描器,可以指定扫描设备

2、构造方法:
(1)Scanner(File source) 扫描指定的文件
(2)Scanner(String source) 扫描指定的字符串
(3)Scanner(InputStream source) 扫描指定的输入流

3、其中,我们使用过第三个构造方法,Scanner(System.in),其中System.in就是一个输入流,标准输入流,默认关联到键盘

4、扫描器可以解析基本数据类型和字符串

(二)录入基本数据类型

1、方法:
(1)nextByte()
(2)nextShort()
(3)nextInt()
(4)nextLong()
(5)nextFloat()
(6)nextDouble()
(7)nextBoolean()

2、注意事项:
(1)没有nextChar()方法
(2)键盘录入时要符合数据类型的取值范围
(3)当录入float数据的时候,没有必要加F,因为键盘录入的内容,不属于Java代码
(4)多个数据同时录入的时候,每个数据之间用空格也可以作为结束标志

代码示例

import java.util.Scanner;

public class Demo05_InputBasicData {

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	
	//byte b = sc.nextByte();
	//System.out.println(b);
	
	float f = sc.nextFloat();
	int num = sc.nextInt();
	
	System.out.println(f);
	System.out.println(num);
}
}

(三)录入字符串

1、方法:
(1)next():可以将空格作为分隔标记
(2)nextLine():通过换行来作为结束标记

代码示例

import java.util.Scanner;

public class Demo06_InputString {

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	
	//String str1 = sc.next();//将空格或者回车作为技术标志,不能解析空格
	//System.out.println(str1);
	
	String str2 = sc.nextLine();//只以回车(换行)作为结束标志,可以解析空格
	System.out.println(str2);
	
}
}

(四)Scanner类型的小问题以及避免方式

1、问题:当我们使用了可以以空格作为分隔和结束标志的方法后,再紧接着使用nextLine()方法,nextLine()会直接被消耗掉

2、解决办法:
(1)创建两个Scanner对象,新的Scanner上次没有录入数据,内部是干净的,用来录入第二个数据
(2)连续调用两次nextLine方法,第一个消耗掉对象中剩余的内容,第二个等待重新录入
(3)所有录入的内容都是用nextLine方法,之后将字符串表示形式的数据再解析为数据本身所对应的类型

代码示例

import java.util.Scanner;

public class Demo07_QuestionAndAnswer {

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	//Scanner sc1 = new Scanner(System.in);
	
	//int num = sc.nextInt();
	//String str = sc.nextLine();
	//sc.nextLine();
	
	String str1 = sc.nextLine();//"123"
	
	int num = Integer.parseInt(str1);
	
	String str2 = sc.nextLine();
	
	System.out.println(num + 1);
	System.out.println(str2);
}

public static void test1(Scanner sc) {
	//以空格作为结束标志或者分隔符的方法不能解析空格
	
	//int num = sc.nextInt();//录入int数可以忽略空格
	//String str = sc.next();//
	
	String str1 = sc.nextLine();
	float f = sc.nextFloat();
	
	//System.out.println(num);
	//System.out.println(str);
	System.out.println(f);
	System.out.println(str1);
}
}

三、String类型

(一)概述
1、String类型表示字符串,属于java.lang包,不用导包

2、所有的字符串常量(“abc”)也是String类型的对象

3、字符串字面值常量,存储在方法区的常量池中

4、String类型表示的字符串本身是一个常量,创建后就无法修改(不可变字符序列)

5、不可变的原因:String没有提供任何的set方法能够修改字符串本身

6、图示:
在这里插入图片描述

代码示例

public class Demo08_StringIntro {

public static void main(String[] args) {
	
	String str = "abc";
	String str1 = "abc";
	
	System.out.println(str);
	
	str = "qwe";
	
	System.out.println(str == str1);
}
}

(二)构造方法

1、String() 创建一个空字符串

2、String(byte[] arr, int offset, int length) 将byte数组的一部分解析为字符串

3、String(char[] arr, int offset, int length) 将char数组的一部分解析为字符串

4、String(String str) 返回参数字符串的副本
5、在这里插入图片描述

6、总结**:其他基本数据类型转换为String,可以参考String类型的构造方法**

代码示例

public class Demo09_StringConstructor {

public static void main(String[] args) {
	String s = new String();//""
	System.out.println(s);
	
	String str = new String("abc");
	System.out.println(str);
	
}

public static void test2() {
	char[] arr = {'a', 'z', 'b', 'q'};
	
	//char -> char[] -> String
	String str = new String(arr, 1, 3);
	System.out.println(str);
}

public static void test1() {
	//byte -> byte[] -> String
	byte[] arr = {97, 98, 99, 100};
	String str = new String(arr);
	
	System.out.println(str);
	
	String str1 = new String(arr, 1, 2);
	System.out.println(str1);
}
}

(三)String类型的判断功能

1、equals(Object obj) 判断调用者字符串和参数字符串内容是否相等

2、equalsIgnoreCase(String anotherString) 忽略大小写判断调用者和参数字符串内容是否相等

3、contains(String str) 判断参数字符串是否为调用者字符串的子字符串

4、startsWith(String str) 判断调用者是否为参数字符串开头

5、endsWith(String str) 判断调用者是否为参数字符串结尾

6、isEmpty() 判断调用者是否为空串

代码示例

public class Demo10_Judge {

public static void main(String[] args) {
	/*String name = "张三";
	
	System.out.println(name.startsWith("张"));
	
	String sen = "你吃了吗,思密达";
	
	System.out.println(sen.endsWith("思密达"));*/
	
	
	String str = "";
	String str1 = "a";
	
	System.out.println(str.isEmpty());
	System.out.println(str1.isEmpty());
}

public static void test1() {
	String str = "qwertyuiop";
	String str1 = "qwe";
	String str2 = "qwe";
	String str3 = "abc";
	String str4 = "ABC";
	
	System.out.println(str1.equals(str2));
	System.out.println(str1.equals(str3));
	System.out.println("admin".equals("aaa"));
	System.out.println(str3.equals(str4));
	System.out.println(str3.equalsIgnoreCase(str4));
	System.out.println(str.contains("123"));
	System.out.println(str.contains("qwe"));
	System.out.println(str.contains("qwertyuiop"));
}
}

(四)String类型的获取功能

1、length() 返回调用者字符串的长度

2、charAt(int index) 从调用者字符串上获取到指定索引的字符并返回

3、substring(int beginIndex) 从指定索引开始,截取调用者字符串的一部分,直到字符串结尾

4、substring(int beginIndex, int endIndex) 截取调用者字符串的任意一部分,范围:[beginIndex, endIndex)

5、indexOf重载:
(1)indexOf(int ch) 顺序查找指定字符第一次出现的索引
(2)indexOf(int ch, int fromIndex) 从指定位置开始顺序查找指定字符的索引
(3)indexOf(String str) 顺序查找指定字符串第一次出现的索引
(4)indexOf(String str int fromIndex) 从指定位置开始顺序查找指定字符串的索引

6、lastIndexOf重载:和indexOf相反

代码示例

public class Demo11_Get {

public static void main(String[] args) {
	String str = "abcabcabc";
	
	System.out.println(str.indexOf('b'));
	System.out.println(str.indexOf('b', 2));
	
	System.out.println(str.indexOf("cab"));
	System.out.println(str.indexOf("cab", 3));
	
	System.out.println(str.lastIndexOf("cab", 7));
}

public static void test1() {
	System.out.println("qwertyuiop".length());
	
	//String -> char
	System.out.println("qwertyuiop".charAt(3));
	
	System.out.println("qwertyuiop".substring(5));
	System.out.println("qwertyuiop".substring(2, 5));
}
}

(五)String类型的转换功能

1、byte[] getBytes() 将调用者字符串转为byte数组

2、char[] toCharArray() 将调用者字符串转为对应的字符数组

3、toUpperCase() 将字符串转为纯大写

4、toLowerCase() 将字符串转为纯小写

5、concat(String str) 将参数字符串追加到调用者字符串之后(拼串)

6、ValueOf重载:都是静态方法,用于将其他数据类型转换为String类型

代码示例

import java.util.Arrays;

public class Demo12_Transition {

public static void main(String[] args) {
	//System.out.println("abcdefg".concat("1234567890"));
	
	
	String str = String.valueOf(123);
	
	System.out.println(str + 1);
}

public static void test2() {
	String str = "HeLlOwORld";
	
	System.out.println(str.toUpperCase());
	System.out.println(str.toLowerCase());
}

public static void test1() {
	String str = "abc";
	
	byte[] arr = str.getBytes();
	System.out.println(Arrays.toString(arr));
	
	char[] arr1 = str.toCharArray();
	for (int i = 0; i < arr1.length; i++) {
		System.out.println(arr1[i]);
	}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值