这个课程在狂神中没有教程,所以只能自己学习整理。文章可能会存在个人的误解,恳请大佬指正。
Java自学(八、Java常用类)
Java常用类
Object类
Java的Object类是所有类的父类。也就是所有类都继承了Object类,所以子类可以使用Object的所有方法。
- clone():返回克隆的一个新的对象出来
- hashCode():返回对象的哈希值
- toString():返回对象的字符串表示
- getClass():返回对象运行时对象的类
- equals():比较两个对象是否相等
- wait():让当前线程进入等待状态,直到其他线程调用此对象的notify()方法或者notifyAll()方法
- notify()和notifyAll():唤醒在该对象上等待的某个线程,唤醒在该对象上等待的所有线程
实例:
实现clone的类
package com.hbq.commonclass;
// 使用Clone要实现Cloneable接口,不然会有java.lang.CloneNotSupportedException: com.hbq.commonclass.CloneUse 报错
public class CloneUse implements Cloneable {
String name;
int age;
@Override
public CloneUse clone() { //同理,这里必须有对clone方法的重写,因为clone方法在object里是protected类型的,显然我们的类与object类不在同一个包下,所以无法调用。
CloneUse cloneuse = null;
try {
cloneuse = (CloneUse) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cloneuse;
}
public void printMessage() {
System.out.println("name=" + name + " ,age=" + age);
}
}
实现hashCode的类
package com.hbq.commonclass;
public class HashcodeUse {
}
实现toString的类
package com.hbq.commonclass;
// 自己重写toString方法以完成自己想要的输出格式
public class ToStringUse {
String name;
int age;
public ToStringUse(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名是" + name + "。年龄是" + age;
}
}
package com.hbq.commonclass;
import java.util.Arrays;
public class ObjectUse {
public static void main(String[] args) {
// clone()方法的使用
// clone方法可以克隆一个新的对象出来
CloneUse ob = new CloneUse();
ob.name = "张三";
ob.age = 17;
ob.printMessage();
CloneUse ob2 = (CloneUse) ob.clone(); // ob2是ob的克隆
ob2.printMessage();
System.out.println(ob);
System.out.println(ob2);
// hashCode()方法的使用
// hashCode()可以返回该对象的hash值
Object obh = new Object();
System.out.println(obh.hashCode());
Object obh2 = obh;
System.out.println(obh2.hashCode()); // 如果两个对象相等,则哈希值是一样的
HashcodeUse obh3 = new HashcodeUse();
System.out.println(obh3.hashCode());
HashcodeUse obh4 = new HashcodeUse();
System.out.println(obh4.hashCode()); //不同对象的哈希值不同
// toString()方法的使用
String[] array = {"中国", "北京", "上海"};
System.out.println(Arrays.toString(array));
System.out.println(array[1].toString());
ToStringUse tsu = new ToStringUse("李四", 5);
System.out.println(tsu.toString()); // 自己重写后的toString方法
// getClass()方法的使用
// 获取对象的运行时对象的类,只取决于右边new 后面的类型,和左边无关
Object gc = new CloneUse();
System.out.println(gc.getClass());// class com.hbq.commonclass.CloneUse
CloneUse gc2 = new CloneUse();
System.out.println(gc2.getClass());//class com.hbq.commonclass.CloneUse
//equals()方法的使用
// 判断两个对象是否相等,相等返回true,否则返回false
System.out.println(gc.equals(gc2));//false,两个对象都是new的新的对象
System.out.println(ob.equals(ob2));//false,克隆的也是新的对象
System.out.println(obh.equals(obh2));//true,两个对象是相等的,对象引用,内存相等
// String类里重写了equals()方法,用于比较两个字符串是否相等,而不是比较他们的内存地址
String s1 = new String("中国");
String s2 = new String("上海");
String s3 = new String("上海");
System.out.println(s2.equals(s3));//true,他们的内容相同
System.out.println(s1.equals(s2));//false,他们的内容不同
}
}
Math类
一些常用的数学方法
方法 | 作用 |
---|---|
Math.abs() | 返回参数的绝对值 |
Math.ceil() | 返回大于等于( >= )给定参数的的最小整数,类型为double。也就是向上取整 |
Math.floor() | 返回小于等于(<=)给定参数的最大整数 。也就是向下取整 |
Math.rint() | 返回与参数最接近的整数。返回类型为double |
Math.round() | 四舍五入,具体计算方法是Math.floor(x+0.5),将原来的数字加0.5后向下取整。所以Math.round(-11.5)返回的是-11 |
Math.max() | 返回两个参数中的最大值 |
Math.min() | 返回两个参数中的最小值 |
Math.random() | 返回一个[0.0,1.0)的随机小数 |
Math.pow() | 返回第一个参数的第二个参数次方 |
Math.sqrt() | 返回参数的算术平方根 |
Random类
包含一些生成随机数方法的类
方法 | 作用 |
---|---|
new Random(); | 以系统时间作为随机种子 |
new Random(long seed); | 以形参seed的值作为随机种子 |
nextBoolean() | 随机返回一个true或false |
nextDouble() | 随机返回一个[0,1.0)之间的数 |
nextInt() | 随机生成一个int值(-231到231-1) |
nextInt(int n) | 随机生成一个[0,n)的int值 |
setSeed(long seed) | 重新设置随机种子为seed |
具体用例:
package com.hbq.commonclass;
import java.util.Random;
public class RandomUse {
public static void main(String[] args) {
Random r = new Random(); //以当前系统时间作为随机种子
double db = r.nextDouble(); //随机生成一个[0,1.0)的数
float ft = r.nextFloat(); //随机生成一个[0,1.0)的数
int it = r.nextInt(10); //随机生成一个[0,10)的数
int ni = r.nextInt(10) + 5; //随机生成一个[5,15)的数
System.out.println(db);
System.out.println(ft);
System.out.println(it);
System.out.println(ni);
}
}
File类
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。
方法 | 作用 |
---|---|
exists() | 测试此抽象路径名表示的文件或者目录是否存在 |
createNewFile() | 当不存在此抽象路径指定的名称文件时,创建一个新的空文件 |
delete() | 删除此抽象路径名表示的文件或目录 |
mkdir() | 创建此抽象路径名指定的目录 |
mkdirs() | 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录 |
list() | 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组 |
listFiles() | 返回一个抽象路径名类数组,这些路径名表示此抽象路径名所表示目录中的文件 |
package com.hbq.commonclass;
import java.io.File;
public class FileUse {
public static void main(String[] args) {
// 注意路径是从项目源开始
String dirname = "code/Java基础语法/src/com/hbq/commonclass/javafile";
File f1 = new File(dirname);
System.out.println(f1);
if (f1.isDirectory()) {
System.out.println("Directory of " + dirname);
String s[] = f1.list(); //获取f1目录下的所有文件名
for (int i = 0; i < s.length; i++) {
File f = new File(dirname + "/" + s[i]);
if (f.isDirectory()) {
System.out.println(s[i] + "is a directory");
} else {
System.out.println(s[i] + "is a file");
}
}
}
}
}
包装类
因为Java是面向对象的语言,而基本数据类型不是对象,所以需要把基本数据类型转换成对象。
下面是基本数据类型和其转换成的对象。
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | character |
boolean | Boolean |
自动装箱与自动拆箱
自动装箱就是自动将基本数据类型转换成对象,比如 Integer total = 99;
自动拆箱就是自动将对象转换成基本数据类型,比如int tl=total;
Date类
方法 | 作用 |
---|---|
Date() | 使用当前日期和时间初始化对象 |
getTime() | 返回1970年1月1日到这个对象的毫秒数 |
toString() | 把Date对象转换成"dow mon dd hh:mm:ss zzz yyyy"字符串 |
package com.hbq.commonclass;
import java.util.Date;
public class DateUse {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date.getTime());//打印现在到1970年1月1日的毫秒数
System.out.println(date.toString());//打印一个Sat Apr 03 20:23:14 CST 2021
}
}
String类
String类是不可变的,源码里加了final修饰符。适用于操作量较少的字符串。
思考:
String str=“a”+1+2; str是什么?
答:是"a12"
‘a’+1+2结果是什么?
答:是100
1+2+“a”;结果是什么?
答:是"3a"
StringBuffer类和StringBuilder类
StringBuffer类和StringBuilder类与String类不同的是,StringBuffer类和StringBuilder类的对象可以被多次修改,并且不产生新的对象。
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
但是StringBuilder相较于StringBuffer有速度优势。所以在单线程下建议使用StringBuilder类
StringBuffer类和StringBuilder类方法
方法 | 作用 |
---|---|
append(String s) | 将s追加到此字符串序列 |
reverse() | 将此字符串序列用其反转形式取代 |
delete(int start,int end) | 移除此序列的子字符串中的字符 |
insert(int offset,data) | 将data参数的字符串表示插入此序列的 |
replace(int start,int end,String str) | 使用给定的String参数中的字符串替换此序列的子字符串的字符 |
package com.hbq.commonclass;
public class StringBufferUse {
public static void main(String[] args) {
StringBuffer sa = new StringBuffer();
sa.insert(0, "0123456789十abcdefghijklmn");
System.out.println(sa.toString());
sa.delete(4, 6);//删除4和5下标的元素,删除方法就是后面的覆盖到前面
System.out.println(sa.toString());
sa.append(55);
System.out.println(sa.toString());
sa.replace(0, 2, "ABCDE");//把下标为0和1的字符替换成了ABCDE
System.out.println(sa.toString());
sa.replace(0, 2, "A");//把下标0和1的字符替换成A
System.out.println(sa.toString());
StringBuilder sb = new StringBuilder(10);//设置初始容量为10
sb.append("abcdefg");
System.out.println(sb);
sb.append("!");
System.out.println(sb);
sb.insert(8, "Java"); //长度被扩展成12
System.out.println(sb);
sb.delete(5, 8);
System.out.println(sb);
}
}
此外StringBuffer类和StringBuilder类也有String类的一些方法,比如charAt()、capacity()、indexOf()、getChars()、lastIndexOf()、length()、setCharAt()、substring()