java中的一些常用类
Object类
hashcode()
返回该对象的哈希码值,默认情况下会根据对象的地址值计算
不同对象的hashCode()一般不会相同,但是同一个对象的hashCode()值肯定是相同的
public class TestObject01 {
public static void main(String[] args) {
Object obj1 = new Object();
System.out.println(obj1.hashCode());
Object obj2 = new Object();
System.out.println(obj2.hashCode());
}
}
返回的结果为:
2133927002
1836019240
toString()
返回对象的字符串表示形式。
Object obj1 = new Object();
System.out.println(obj1.toString());
//结果为 java.lang.Object@7f31245a
上面的结果不是我们想要的,所以一般都会进行toString()方法的重写
getClass()
Object obj1 = new Object();
Object obj2 = new Object();
Class class1 = obj1.getClass();
Class class2 = obj1.getClass();
System.out.println(class1==class2)
//结果 true
equals()
判断两个对象是否相等,是通过地址来判断的
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1.equals(obj2));
//结果为 false
可以对equals()进行重写,使其判断内容是否相等,相等为true,否则为false
clone()
创建并返回此对象的副本。
notify()
唤醒一个在这个对象的监视器上等待的单个线程。
wait()
使当前线程等待另一个线程调用此对象的方法
这三个方法都是和线程有关,这里就不多说明了
包装类
包装类都是位于java.lang中
什么是包装类:基本数据类型所对应的引用数据类型
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
在这八各类中,除了Character和Boolean类以外,其它六个都是“数字型”
//基本数据类型转为Integer对象
Integer i = Integer.valueOf(100);
//Integer类型转为int
int a = i.intValue();
//字符串转为Integer对象
Integer i = Integer.parseInt("334");
//Integer对象转为字符串
String str = i.toString();
自动装箱和拆箱:就是指再基本数据类型和包装类之间进行自动的转换
自动装箱:自动将基本数据类型的数据转化为包装类对象,而不需要手动转换
自动拆箱:相应的包装类对象自动转为基本数据类型的数据,而不需要手动转换
用一句话来总结就是:自动装箱过程是通过调用包装类的valueOf()方法来实现的,而自动拆箱过程则是通过调用包装类的##Value()方法实现的(##代表对应的基本数据类型,如intValue(),doubleValue())
Integer i = 100;//自动装箱
//相当于编译器自动为用户以下的操作
Integer i = Integer.valueOf(100);
//调用的是valueOf(100),而不是new Integer(100)
Integer i = 100;
int j = i;//自动拆箱
//相当于编译器自动为用户以下的操作
int j = i.intValue();
还有一个包装类的缓存问题
Integer i = 127;
Integer j = 127;
System.out.println(i == j);
System.out.println(i.equals(j));
Integer i = 1127;
Integer j = 1127;
System.out.println(i == j);
System.out.println(i.equals(j));
结果为
true
true
false
true
包装类在自动装箱时为了提高效率,对于-128~127之间的值会进行缓存处理。超过这个范围后,对象之间不能使用==进行数值比较,而应使用equals方法
String类
不可变性 final 操作量少推荐
位于java.lang包,默认会导入java.lang包下所有的类
String str1 = "a"+1+2;//a12
String str2 = 'a'+1+2;//d
String str3 = 1+2+"a";//3a
//a和b都会放进方法区的常量池里面,而c就是一个普通常量
String a ="cyg";
String b ="cyg";
String c = new String("cyg");
System.out.println(a == b);
System.out.println(b == c);
//输出结果
//true
//false
//通常我们比较字符串都是采用equals()方法,来比较他们的值是否一样
System.out.println(b.equals(c));
//输出true
下面来介绍一下String类中一些常用的方法
char charAt(int index)//返回指定索引的 `char`值。范围从 `0`到 `length() - 1`
boolean equals()//判断两个字符串是否相等,相等返回true,否返回false
boolean equalsIgnoreCase()//判断两个字符串是否相等(忽略大小写),相等返回true,否返回false
int indexOf()//从头开始查找某个字符在字符串的位置,找到返回,没有找到返回-1
int lastIndexOf()//从尾开始查找某个字符在字符串的位置,找到返回(返回的索引是从头开始数处的索引),没有找到返回-1
int length()//返回字符串的长度
String replace(a,b)//将字符串中所有的a换成b
boolean startsWith()//判断是否以某个字符串为开头,是返回true,否返回false
boolean endsWith()//判断是否以某个字符串为结尾,是返回true,否返回false
String subString(int index)//返回从索引处到末尾的字符串
String subString(int index,int index)//返回两个索引处之间的字符串
String toLowerCase()//将字母改成小写
String toUpperCase()//将字母改成大写
String trim()//去除收尾的空格
StringBuffer类
可变性 append() 多线程数据量较大,效率低,安全
StringBuffer 和 StringBuilder,方法都一样,就是两者的使用时机不同
StringBuilder类
可变性 单线程数据量大,效率高,不安全
除了String类中比较常用的方法,还有一些新的方法
append()//在尾部添加字符
reverse()//将字符串反转
setCharAt(int index,char a)//将指定索引处的字符替换成a
insert(int index,char a)//在指定索引处添加一个字符a
delete(int index,int index)//删除区间内的字符
Date类
位于java.util包下
Date(不推荐使用)
SimpleDateFormat yyyy-MM-dd HH:mm:ss
//获取现在的时间,国外形式的
Date date = new Date();
System.out.println(date);
//这里是指定时间格式,常用的三种
SimpleDateFormat now1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat now2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
SimpleDateFormat now3 = new SimpleDateFormat("yyyy-MM-dd");
//获取具体的时间,new Date()就是获取当前时间,并转换格式
String str1 = now1.format(new Date());
String str2 = now2.format(new Date());
String str3= now3.format(new Date());
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
结果
Tue Nov 03 21:15:23 CST 2020
2020-11-03 21:15:23
2020年11月03日 21:15:23
2020-11-03
GregorianCalendar(建议使用)
//获得日期的相关元素
GregorianCalendar calendar = new GregorianCalendar(2020,11,3,21,35,12);
int year = calendar.get(Calendar.YEAR);//获得年份
int month = calendar.get(Calendar.MONTH);//获得月份
int day = calendar.get(Calendar.DAY_OF_MONTH);//获得日,也可以是Calendar.DATE
//可以这样设置,每个星期的第一天是星期几:
calendar.setFirstDayOfWeek(Calendar.MONDAY);
//获得星期几,1-7,1表示星期天,2表示星期一,...
int dayWeek = calendar.get(Calendar.DAY_OF_WEEK);
//设置日期的相关元素
GregorianCalendar c2 = new GregorianCalendar();
c2.set(Calendar.YEAR,2018);
//日期的计算
GregorianCalendar c3 = new GregorianCalendar();
c3.add(Calendar.YEAR,100);//往后一百年
c3.add(Calendar.YEAR,-100);//往前一百年
c3.add(Calendar.MONTH,2);
//日期对象和时间对象对转化
Date date = c3.getTime();
设计一个打印时间的方法
public static void main(String[] args) {
GregorianCalendar c1 = new GregorianCalendar();
printCalendar(c1);
}
public static void printCalendar(Calendar c){
//打印时间+星期几
int year = c.get(Calendar.YEAR);//获得年份
int month = c.get(Calendar.MONTH)+1;//获得月份
int day = c.get(Calendar.DAY_OF_MONTH);//获得日,也可以是Calendar.DATE
int dayWeek = c.get(Calendar.DAY_OF_WEEK)-1;
String dayWeek3 = "";
switch (dayWeek){
case 0:
dayWeek3 = "日";
break;
case 1:
dayWeek3 = "一";
break;
case 2:
dayWeek3 = "二";
break;
case 3:
dayWeek3 = "三";
break;
case 4:
dayWeek3 = "四";
break;
case 5:
dayWeek3 = "五";
break;
case 6:
dayWeek3 = "六";
break;
}
int hour = c.get(Calendar.HOUR);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
System.out.println(year+"年"+month+"月"+day+"日"+" "+hour+"时"+minute+"分"+second+"秒"+" 周"+dayWeek3);
}
//结果 2020年11月3日 10时19分21秒 周二
Random类
生成随机数
Random rand = new Random();
//随机生成[0,1)之间的double类型的数据
System.out.println(rand.nextDouble());
//随机生成[0,1)之间的float类型的数据
System.out.println(rand.nextFloat());
//随机生成True或者False
System.out.println(rand.nextBoolean());
//随机生成[0,10)之间的int类型的数据
System.out.println(rand.nextInt(10));
//随机生成[20,30)之间的int类型的数据
System.out.println(20+rand.nextInt(10));
//随机生成int类型允许范围之内的整形数据
System.out.println(rand.nextInt());
//随机生成[20,30)之间的int类型的数据,相比之下更复杂
System.out.println(20+(int)rand.nextDouble()*10);
Math类
常见的数学运算
System.out.println(Math.abs(-2.0)); //绝对值
System.out.println(Math.sqrt(64.0)); //立方根
System.out.println(Math.max(56,78)); //两者之间较大的
System.out.println(Math.min(56,78)); //两者之间较小的
System.out.println(Math.random()); //随机数
System.out.println(Math.pow(2,10)); //幂
System.out.println(Math.ceil(18.36)); //向上取整
System.out.println(Math.floor(18.66)); //向下取整
System.out.println(Math.round(11.5)); //四舍五入
System.out.println(Math.round(-11.5)); //四舍五入
输出结果
绝对值:2.0
立方根:8.0
两者之间较大的:78
两者之间较小的:56
随机数:0.8657276690731889
幂:1024.0
向上取整:19.0
向下取整:18.0
四舍五入:12
四舍五入:-11
File类
java.io.File类代表文件和目录。在开发中读取文件、生成文件、删除文件、修改文件的属性时会经常用到该类
相对路径:只有文件名
绝对路径:什么都很清楚,以磁盘开头
方法 | 说明 |
---|---|
public boolean exists() | 判断File是否存在 |
public boolean isDirectory() | 判断File是否有目录 |
public boolean isFile() | 判断File是否有文件 |
public long lastModified() | 返回FIle最后修改的时间 |
public long length() | 返回FIle大小 |
public String getName() | 返回文件名 |
public String getPath() | 返回文件的目录路径 |
创建文件或者目录
方法 | 说明 |
---|---|
createNewFile() | 创建新的File |
mkdir() | 创建一个目录,中间某个目录缺失,则失败 |
mkdirs() | 创建一个目录,中间某个目录缺失,则创建该缺失目录 |
File f = new File("d:/b.txt");
f.createNewFile();//通过绝对路径来创建文件
File f = new File("d:/电影/华语/大陆")
f.mkdir();//如果这里华语或者电影目录缺失,则大陆目录不会创建
f.mkdirs();//即使这里华语或者电影目录缺失,大陆目录也会创建,前面缺失的也会被创建
查看文件
//这里的"d:/b.txt"不是创建文件的意思,而是获取的意思
File f = new File("d:/b.txt");
System.out.println(f.exists());
System.out.println(f.isDirectory());
System.out.println(f.isFile());
System.out.println(new Date(f.lastModified()));
System.out.println(f.length());
System.out.println(f.getName());
System.out.println(f.getPath());
结果为
true
false
true
Wed Nov 04 10:56:40 CST 2020
0
b.txt
d:\b.txt
使用递归算法,以树状结构展示目录树
public static void printFile(File file,int leave){
//输出层次数
for(int i = 0;i<leave;i++){
System.out.print("-");
}
//输出文件名
System.out.println(file.getName());
//如果File是目录,则获取子文件列表,并对每个子文件进行相同的操作
if(file.isDirectory()){
File[] files = File.listFiles();//列出所有的文件或者文件夹对象
for(File temp : files){
//递归调用该方法,注意leave+1
printFile(temp,leave + 1);
}
}
}
public static void main(String[] args){
File f = new File("d:/电影");
printFile(f,0);
}
结果为:
电影
-华语
--大陆
---人民的名义.mp4
-好莱坞
--国王的演讲.mp4
修改文件
这里一般都不会进行这个操作
删除文件
File f = new File("d:/b.txt");
f.delete();