Object Scanner String Math System 各类的定义概念和常用方法
很多方法大致记下有个概念就行,不必完全背熟,等有需求时知道在哪查看下再用就行
Object
Object类是所有类的根类,是一个顶层父类,是所有引用数据类型(包括数组)都拥有这个类的所有方法
Object的构造方法:Object();
-
可以创建一个Object对象
-
这个构造方法会被所有的子类调用
-
这个方法不会调用super语句
Object可以被引用成一切类的对象
例如:Object obj = new Person();
常用的方法
toString()
返回一个对象的打印结果
不重写toString()方法的话输出的就是一个内存地址:getClass().getName() + “@” +Integer.toHexString(hashCode());
实质:类名 + @ +十六进制的哈希值 这样没有意义,所以需要重写
重写的原则:返回该对象中所有成员变量的值 以后记住自定义类的时候要重写toString方法
equals(Object obj):
-
用于比较两个对象是否相等的方法,比较的是调用者和参数这两个对象
-
在Object类型中,比较的是两个引用是否指向了同一个对象,如返回是true,相当于比较两个对象的地址值是否相同
-
实际生活中,比较的是两个对象的属性值,比较地址值没有意义,所以在自定义子类中都要重写这个方法
-
写的原则:一般用于比较两个对象中所有属性,是否相同
package Test2;
public class Tt {
public static void main(String[] args) {
Object ob1 = new Object();
Object ob2 = new Object();
System.out.println(ob1.equals(ob2));//比较地址值是否相同
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person(27,"马内");
Person p4 = new Person(28,"萨拉赫");
System.out.println(p1.equals(p2));//true
System.out.println(p3.equals(p4));//false
System.out.println("============================");
System.out.println(p1);//没重写方法前输出Test2.Person@3c1
System.out.println(" || ");
String className = p1.getClass().getName();
String hexString = Integer.toHexString(p1.hashCode());//16进制
System.out.println(className + "@" + hexString);
System.out.println(p1);//重写toString()方法后 输出Person [age=0, name=null]
}
}
class Person{
int age;
String name;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {//重写equals()
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 String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
}
==和equals的比较
==和equals都是用来比较数据是否相等的方式
区别
比较的内容不同:
-
==基本数据类型和引用数据类型都可比较
-
equals只能比较引用数据类型,不能比较基本数据类型
比较规则不同:
-
==对于基本数据类型比较的是数值,对于引用数据类型,比较的是地址
-
equals重写之前,比较的是地址,重写之后比较的是属性值
package Test2;
public class Tt {
public static void main(String[] args) {
int a = 1;
int b = 6;
System.out.println(a == b);
// System.out.println(a.); equals只能比较引用数据类型
String str = "abc", str2 = "bcd", str3 = "abc";
// abc 常量字符串,只在常量池中存储一份 所以地址就一样
System.out.println(str == str2);// false
System.out.println(str == str3);// true
System.out.println(str.equals(str3));// true
System.out.println(str.equals(str2));// false
System.out.println("==============================");
Person p1 = new Person(21, "阿诺德");
Person p2 = new Person(25, "罗伯逊");
System.out.println(p1 == p2);// false 比较地址
System.out.println(p1.equals(p2));// false 比较属性
}
}
class Person {
int age;
String name;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {// 重写equals()
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711141523382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FqdW40,size_16,color_FFFFFF,t_70)
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 String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
}
Scanner
就是一个文本扫描器,可以扫描指定的数据,用于获取键盘输入
属于java.util包,不是属于java.lang包下,所以都要导包
常用的构造方法
-
Scanner(File f):扫描指定文件
-
Scanner(String path):扫描指定路径
-
Scanner(InputStream source) :指定一个输入流对象,这个输入流对象就是System.in(系统输入流),此时默认关联到键盘设备,控制台等待输入,直到敲回车键结束,把输入的内容传给Scanner作为扫描对象。如果要获取输入的内容,就调用Scanner的nextLine()等方法即可。
基本数据类型的扫描
(1) nextByte() 获取一个byte类型
(2) nextShort() 获取short类型
(3) nextInt();
(4) nextLong()
(5) nextFloat()
(6) nextDouble()
(7) nextBoolean()
没有nextChar,因为只要输入字符就把他当做String来看待了
一次性想要录入多个数据,可以使用空格进行分隔
引用数据类型的扫描
(1) next():获取一段字符串数据,遇到空格扫描结束,即next()不能得到带有空格的字符串
注:一定要读取到有效字符后才可以结束输入,对读取到有效字符之前遇到的空白,自动将其去掉
(2) nextLine();获取一个字符串数据,扫描一行,遇到回车换行符结束,返回的是输入回车之前的所有字符
package Test2;
import java.util.Scanner;
public class Tt {
public static void main(String[] args) {
show1();//连续调用nextLine第一就会将空串吃掉,第二次就会等待继续录入
show2();//创建两个Scanner对象,第一个录入以换行为间隔的,第二个录入以空格为间隔的
show3();//所有的录入都以字符串形式录入,然后进行数据类型之间的转换
}
private static void show3() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串");
String str = sc.nextLine();//所有的录入都以字符串形式录入,然后进行数据类型之间的转换
int num = Integer.parseInt(str);
System.out.println(str);
}
private static void show2() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串");
String str = sc.next();
System.out.println(str);
System.out.println("==================");
System.out.println("请输入字符串");
Scanner sc1 = new Scanner(System.in);//创建两个Scanner对象,第一个录入以换行为间隔的,第二个录入以空格为间隔的
String str3 = sc1.nextLine();
System.out.println(str3);
}
private static void show1() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串");
String str = sc.next();
System.out.println(str);
System.out.println("==================");
System.out.println("请输入字符串");
String str2 = sc.nextLine();
String str3 = sc.nextLine();//连续调用nextLine第一就会将空串吃掉,第二次就会等待继续录入
System.out.println(str3);
}
}
String
属于java.lang包
所有的字符串常量,都是String类型的对象,双引号引起来的字符串都是常量,存储在方法区中的常量池
String是一个不可变的字符串,这个指的是字符串指向的那块区域中存储的字符是不可以变的
不可变的原因,String类型只提供了构造方法,没有提供set方法,因此只能在创建对象的时候,初始化成员变量,将来对象创建完成之后,无法通过方法来修改
String的构造方法
String():空参数构造
String(String orignal): 调用构造方法时会在堆内存创建一个指定字符串的副本(参数是常量区的字符串,创建副本,存储在堆内存中)
new出来的两个对象str和str2都同时指向JVM字符串常量池中的"aaa"对象
String(byte[] arr): 将一个byte数组中的元素转为字符串
String(byte[] arr,int offset, int length):将指定的byte数组,从offset位置开始,length个长度的元素转为字符串,包含offset位置的元素
String(char[] arr):同上
String(char[] arr,int offset, int length):同上
package Test2;
public class Tt {
public static void main(String[] args) {
show();
show_byte();
show_char();
}
private static void show() {
String s = new String("一二三四");
String s2 = "在我心中,豪哥最帅";
System.out.println(s == s2);//false
}
private static void show_char() {
char[] arr = {'一','二','三','四'};
String s = new String(arr);
System.out.println(s);
String s2 = new String(arr,1,3);//从1位置开始,3个长度的元素转为字符串,包含1位置的元素
System.out.println(s2);
}
private static void show_byte() {
byte[] arr = {65,66,67,68,69};
String s = new String(arr);
System.out.println("{65,66,67,68,69}是"+s);
String s2 = new String(arr,2,2);
System.out.println(s2);//CD
}
}
String判断相关的方法
-
equals(Object obj): 判断两个字符串是否相等,(比较的是内容值,不是地址)
-
equalsIgnoreCase(String otherStr):不区分大小写比较两个字符串的内容(常用于验证码比较)
-
contains(String str) 判断一个字符串是否包含某个字符串
-
startWith(String str) 判断一个字符串是否以指定前缀开头
-
endWith(String str) 判断是否以指定后缀结尾
-
IspEmpty() 判断一个字符串是否为空
package Test2;
public class Tt {
public static void main(String[] args) {
String s1 = "https://www.baidu.com";//判断是否 以http://开头
System.out.println(s1.startsWith("https://www"));//true
String s2 = "我是学生";//判断是否以 学生 后缀结尾
System.out.println(s2.endsWith("学生"));//true
String s3 = "";//判断是否是空字符串
System.out.println(s3.isEmpty());//true
String s4 = "利物浦是冠军";//判断是否包含 利物浦
System.out.println(s4.concat("利物浦"));
String s5 = new String("111");
String s6 = "111";
System.out.println(s5 == s6);//比较的是地址 false
System.out.println(s5.equals(s6));//比较的是内容 true
String s7 = "abc";
String s8 = "ABc";
System.out.println(s7.equalsIgnoreCase(s8));//忽略大小写进行比较 true
}
}
String类型中关于获取的方法
-
length() 获取字符串长度
-
charAt(int index) 获取字符串中指定位置的某个字符
-
subString(int beginindex) 获取字符的某个子串,从指定位置开始,获取后面的所有的字符串包含指定位置的元素
-
subString(int beginindex,int endIndex) 获取字符的某个子串,从指定位置开始,到指定位置结束,含头不含尾
-
indexOf家族
(1) indexOf(int ch): 返回ch字符在当前字符串中第一次出现的位置
(2) indexOf(int ch, int fromindex):返回指定fromindex向后第一次出现ch字符的位置
(3) indexOf(String ch): 返回ch字符串在当前字符串中第一次出现的位置
(4) indexOf(String ch, int fromindex):返回指定fromindex向后第一次出现ch字符串的位置
package Test2;
public class Tt {
public static void main(String[] args) {
String s1 = "利物浦是冠军,欧洲的冠军";
int ind = s1.indexOf("冠军");
System.out.println(ind);//4
int ind1 = s1.indexOf("冠军",6);//从6左边后 出现的下标位
System.out.println(ind1);//10
//获取字符同理,这里偷懒不写了
String str = s1.substring(3);//获取下标3后的所有内容 是冠军,欧洲的冠军
System.out.println(str);//是冠军,欧洲的冠军
String str2 = s1.substring(3,6);//获取下标3-下标6后的所有内容 不包括6,含头不含尾
System.out.println(str2);//是冠军
System.out.println(s1.length());//12 下标范围 0 ~ length() -1
char c = s1.charAt(2);//获取下标2的字符串
System.out.println(c);//浦
}
}
String类型转换相关的方法
-
byte[] getBytes() 将当前字符串,转为byte数组
-
char[] toCharArray() 将当前字符串转为char数组
-
String toUpperCase() 将字符串变为大写
-
String toLowerCase() 转为小写
-
concat(String s) 字符串拼接,是一个指定字符串和调用此方法的字符串拼接到一起,一般使用+拼接
-
valueOf() 可以将任意数据类型转为字符串对象 一般 使用 +”” 静态方法
package Test2;
public class Tt {
public static void main(String[] args) {
int a = 100;
boolean b = true;
String s1 = String.valueOf(b);//可以将任意数据类型转为字符串对
System.out.println(s1);//true
String s2 = a+"";//+"" 这个更简单和常用
System.out.println(s2);
String str1 = "莫雷诺";
String str2 = "天下无敌";
String str3 = str1.concat(str2);
System.out.println(str3);//莫雷诺天下无敌
String str4 = str1+str2;
System.out.println(str4);//+拼接 这个更简单和常用 莫雷诺天下无敌
String str5 = "hhh";
System.out.println(str5.toUpperCase());//全部转为大写 HHH
String str6 = "AAA";
System.out.println(str6.toLowerCase());//全部转为小写 aaa
String s = "莫雷诺天下无敌";
char[] arr = s.toCharArray();
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);//遍历输出 莫雷诺天下无敌
}
byte[] bytes = s.getBytes();//byte数组也一样遍历输出,这里也不多写了
}
}
Math
数学运算的一个工具类,还提供了一些常用的字段
-
abs(int a) : 返回a的绝对值
-
ceil(double d): 返回d的向上取整
-
round(double d):返回d的四舍五入
-
min(int a,int b):
-
random() 返回一个大于等于0.0 小于1.0的随机数
-
pow(double a,double b) a的b次幂
-
cbrt(double d):d的立方根
-
sqrt(double d):d 的正平方根
package Test2;
public class Tt {
public static void main(String[] args) {
System.out.println(Math.abs(-10));//返回绝对值 10
System.out.println(Math.cbrt(-8));//返回立方根 -2.0
System.out.println(Math.sqrt(64));//返回正的平方根 8.0
System.out.println(Math.ceil(10.34));//向上取整 11.0
System.out.println(Math.ceil(-10.34));//向上取整注意正负 -10.0
System.out.println(Math.floor(10.34));//向下取整 10.0
System.out.println(Math.floor(-10.34));//-11.0
System.out.println(Math.max(11, 1));//取最大值 11
System.out.println(Math.min(11, 1));//取最小值 1
System.out.println(Math.pow(2, 3));//2的三次幂 8.0
System.out.println(Math.round(5.5));//四舍五入 6
System.out.println(Math.round(5.2));//四舍五入 5
}
}
System
用于描述系统资源的类,该类的属性和方法都是静态的,所以不能创建对象实例化
常用的字段
(1) System.in:标准输入流,默认关联到键盘设备
(2) System.out:标准输出流,默认输出到控制台
(3) System.err:标准错误输出流,默认输出到控制台,用于打印错误信息,在eclipse打出字体是红色的
常用的方法
(1) exit(int status):用于结束虚拟机
(2) gc() 手动强制执行垃圾回收机制
(3) currentTimeMillies():返回当前的时间,以毫秒为单位,可以用来测试程序的性能,时间是从1970年1月1日00分00秒到此时此刻的毫秒值,开始获取一次,结束获取一次最后计算差值
package Test2;
public class Tt {
public static void main(String[] args) {
System.err.println("打印红色错误信息");
System.out.println(System.currentTimeMillis());//当前时间距离1970年1月1日00时00分的毫秒值
new Person1();
System.gc();//手动强制执行垃圾回收机制
System.out.println("-----------------");
System.exit(0);//到这虚拟机就结束了,不会再执行其他内容了
System.out.println("+++++++++++++++++");
}
}
class Person1{
@Override
protected void finalize() throws Throwable {//垃圾回收机制一定会走的方法
super.finalize();
System.out.println("aaaaaaa");//被回收前执行
}
}