Java常用类
Object类
- 超类、基类,所有类的直接或者间接父类,位于继承树的最顶层
- 任何类如果没有extends显示继承某个类,就默认继承Object类,否则就是间接继承
- Object类中定义的方法,是所有对象都具备的方法,Object类型可以存储任何对象,作为参数可以接收任何对象;作为返回值,可返回任何对象。
1. getClass()
public class application{
public static void main(String[] args){
Student student =new Student("小明",23);
Student student1 = new Student("小王",24);
Class class1 = student.getClass();
Class class2 = student1.getClass();
System.out.println(class1);
System.out.println(class2);
if(class1==class2){
System.out.println("两者属于同一个类");
}else{
System.out.println("两者不属于同一个类");
}
}
}
2. hashCode()
public int hasCode(){}
根据对象的地址或者字符串或者数字使用hash算法计算出来的int类型的数值,一般情况下相同对象返回相同的哈希值
System.out.println(student.hashCode());
System.out.println(student1.hashCode());
Student student3 = student1;
System.out.println(student3.hashCode());
3. toString()
public String toString(){}
返回该对象的字符串表示,可以根据程序需要覆盖该方法。
System.out.println(student.toString());
System.out.println(student1.toString());
@后的值即为2中展示的hash值
重写toString方法
@Override
public String toString() {
return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';}
4. equals()
public boolean equals(Object obi){}
System.out.println(student.equals(student1));
Student student4 = new Student("小张",12);
Student student5 = new Student("小张", 12);
System.out.println(student4.equals(student5));
equals重写
- 比较两个引用是否指向同一个对象
- 判断obj是否为null
- 判断两个引用指向的实际对象类型是否一致
- 强制类型转换
- 依次比较各个属性值是否相同
public boolean equals(Object obj){
//1.判断两个对象是否是同一个引用
if(this==obj)
return true;
//2.判断obj是否为空
if(obj==null)
return false;
//3. 判断对象是否为Student
if(obj instanceof Student){
//4. 强制类型转换
Student s = (Student) obj;
//5. 比较属性
if(this.name.equals(s.getName())&&this.age==s.getAge()){
return true;
}
}
return false;
}
System.out.println(student.equals(student1));
Student student4 = new Student("小张",12);
Student student5 = new Student("小张", 12);
System.out.println(student4.equals(student5));
5. finalize()
当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
垃圾对象:没有有效引用指向此对象时,为垃圾对象。
垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
自动回收机制:JVM内存耗尽,一次性回收所有垃圾对象。
手动回收机制:使用System.gc(),通知JVM执行垃圾回收。
包装类
基本数据类型所对应的引用数据类型,包装类的默认值为null
基本数据类型放在栈中,一旦包装为对象,就会放到堆中
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
装箱与拆箱
装箱 将基本数据类型转为引用数据类型
拆箱 将引用数据类型转为基本数据类型
JDK1.5之前的装箱拆箱方式
//装箱
int num = 10;//存放在栈中
Integer integer1 = new Integer(num); //方式一
Integer integer2 =Integer.valueOf(num);//方式二
//拆箱
Integer integer3 = new Integer(100);
int i = integer3.intValue();
JDK1.5之后提供自动装箱拆箱方式
//自动装箱
int age = 24;
Integer age1 = age;
//自动拆箱
int age2 = age1;
数据转换
基本类型转成字符串
//基本数据类型转为字符串
int num = 10;
//方式一
String num1 = 10+"";
//方式二
String num2 = Integer.toString(num);
System.out.println(Integer.toBinaryString(num));//转为二进制字符串
System.out.println(Integer.toHexString(num)); //转为十六进制字符串
System.out.println(Integer.toOctalString(num));//转为八进制字符串
字符串转为基本类型
String str = "100";
Integer.parseInt(str);
boolean类型的字符串,只有true能够转为基本类型的true,其余全为false
String s = "true";
boolean s1 = Boolean.parseBoolean(s);
System.out.println(s1);
Integer缓冲区
Java预先创建了256个常用的整数包装类型对象 -127-128,在实际应用中,对已创建的对象进行复用。
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1==integer2);
//通过构造函数来构建,相当于创建了两个对象,栈中存放着指向堆中对象的地址,地址是不一样的
Integer integer3 = 100;//自动装箱 相当于 Integer.valueOf(100)
Integer integer4 = 100;
System.out.println(integer3==integer4);
//valueOf中已经定义了范围,Integer缓冲区已经定义了-127-128的对象,只要在这个范围内,栈中的地址都是指向堆中的同一地址
Integer integer5 = 200;
Integer integer6 = 200;
System.out.println(integer5==integer6);
//范围超出了-127-128,会新定义一个对象,两个对象的地址不一样
String类
字符串是常量,创建后不能修改
String name = "zhangsan";
name = "lisi";
String name1 = "lisi";
刚开始创建变量name为zhangsan,之后重新赋值为lisi,此时zhangsan并没有在字符串池中消失,而是变成了垃圾,当再创建name1为lisi时,会去字符串池中去找lisi。
字符串的字面值存储在字符串池中,可以共享
String s = “hello”; //产生一个对象,字符串池中存储
String s1 = new String(“java”); //产生两个对象,堆、字符串池中各存储一个
String str1 = new String("Java");
String str2 = new String("Java");
System.out.println(str1==str2); //结果为false
当创建Java字符串时,会在字符串池中创建Java,又因为有new,所以在堆中创建一个对象,str1在栈中保存对象在堆中的地址,当再次创建str2时,字符串池中有Java,所以在堆中新创建一个对象,实际上在执行过程中,堆中的不存在,还是指向字符串池中的字符串。
常用方法
public int length():返回字符串长度
public char charAt(int index):根据下标获取字符
public boolean contains(String str):判断当前字符串中是否含有str
String str = "我正在学习Java";
System.out.println(str.length()); //输出长度为9
System.out.println(str.charAt(4)); //输出 习
System.out.println(str.contains("学")); //输出 true
System.out.println(str.contains("php"));//输出 false
public char[] toCharArray():将字符串转为数组
public int indexOf(String str):查找str首次出现的下标,存在返回;不存在,返回-1
public int lastIndexOf(String str):查找字符串在当前字符串中最后一次出现的下标索引
String str = "Java我正在学习Java,我能学好Java";
char[] chars = str.toCharArray();
System.out.println(Arrays.toString(chars));
for (char aChar : chars) {
System.out.print(aChar+"");
}
System.out.println();
System.out.println(str.indexOf("Java"));
System.out.println(str.indexOf("Java", 4));
System.out.println(str.lastIndexOf("Java"));
public String trim():去掉字符串前后的空格
public String toUpperCase():将小写转为大写
public String toLowerCase():将大写转为小写
public boolean endsWith(String str):判断字符串是否以str结尾
public boolean startsWith(String str):判断字符串是否以str开头
public String replace(char olfChar,char newChar):将旧字符或者字符串替换成新的字符或字符串
public String[] split(String str):根据str做拆分
split(“[ ,]+”):以空格或者逗号拆分 加上加号后会以多个空格或者逗号拆分
equals:用于字符串值的比较 equalsIgnoreCase:忽略大小写字符串比较
//s1的ascll减去s2
String s1 ="abc";
String s2 ="xyz";
System.out.println(s1.compareTo(s2));//输出为-23
//s3的长度减去s4
String s3 = "abc";
String s4 = "abcxyz";
System.out.println(s3.compareTo(s4));//输出-3
练习
String str = "this is a text";
//1. 将str中的单词单独提取出来
String[] s = str.split(" ");
for (String s1 : s) {
System.out.println(s1);
}
System.out.println("================================");
//2. 将text替换为practice
System.out.println(str.replace("text", "practice"));
System.out.println("================================");
//3. 在text前插入一个easy java是没有insert的
System.out.println(str.replace("text", "easy test"));
//4. 将每个单词的首字母大写
for (String s1 : s) {
char c = s1.charAt(0);
char first = Character.toUpperCase(c);
String s2 = first+s1.substring(1);
System.out.println(s2);
}
StringBuffer,StringBuilder
StringBuffer:可变长字符串,JDK1.0提供,运行效率慢,线程安全
StringBuilder:可变长字符串,JDK5.0提供,运行效率快,线程不安全
两者比String执行效率要高,节省内存
StringBuffer stringBuffer = new StringBuffer();
//1. 追加append
stringBuffer.append("你好啊");
System.out.println(stringBuffer);
//2. 添加
insertstringBuffer.insert(0,"在前面,");
System.out.println(stringBuffer);
//3. 替换 replace 含头不含尾
stringBuffer.replace(0,3,"已替换");
System.out.println(stringBuffer);
//4. 删除
deletestringBuffer.delete(0,3);
System.out.println(stringBuffer);
//5. 清空
stringBuffer.delete(0,stringBuffer.length());
System.out.println(stringBuffer.length());
StringBuilder与StringBuffer一样,只要一替换即可。
BigDecimal
double a = 1.0;double b = 0.9;
System.out.println(a-b);
//面试题
double result = (1.4-0.5)/0.9;
System.out.println(result);
这是因为double、float在存储时用的是近似值
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.3");
//1. 加法
BigDecimal bd3 = bd1.add(bd2);
System.out.println(bd3);
//2. 减法
BigDecimal bd4 = bd1.subtract(bd2);
System.out.println(bd4);
//3. 乘法
BigDecimal bd5 = bd1.multiply(bd2);
System.out.println(bd5);
//4. 除法 除不尽时会报错,使用重载方法,指明保留多少位小数,采取四舍五入
BigDecimal bd6 = bd1.divide(bd2,2,BigDecimal.ROUND_UP);
System.out.println(bd6);
// 计算(1.4-0.5)/0.9
System.out.println(new BigDecimal("1.4")
.subtract(new BigDecimal("0.5"))
.divide(new BigDecimal("0.9")));
Date
Data表示特定的瞬间,精确到毫秒,大部分方法已被Calendar类中的方法所取代
1秒=1000毫秒,1毫秒=1000微秒,1微秒=1000纳秒
//今天
Date date1 = newDate();
System.out.println(date1.toString());
System.out.println(date1.toLocaleString());
//昨天 getTime() 是从1970年1月1日0点起 距离现在多少毫秒
Date date2 = new Date(date1.getTime() - (24 * 60 * 60 * 1000));
System.out.println(date2.toLocaleString());
// before after
System.out.println(date1.before(date2));//true
System.out.println(date1.after(date2)); //false
// equals
System.out.println(date1.equals(date2));//false
//compareTo
System.out.println(date1.compareTo(date2));// 1
System.out.println(date2.compareTo(date1));// -1
Calendar
提供了获取或者设置各种日历字段的方法
构造方法为:protected Calendar() protented修饰,无法直接创建对象
方法名 | 说明 |
---|---|
static Calendar getInstance() | 使用默认的时区或者区域获得日历 |
void set(int year,int month,int date,int hourofday,int minute,int second | 设置日历的年月日时分秒 |
int get(int field) | 返回给定日历字段的值 |
void setTime(Date date) | 用给定的Date设置此日历的时间 |
Date getTime() | 返回一个Date表示此日历的时间 |
void add(int field,int amount) | 按照日历的规则,给指定字段添加或减少时间量 |
long getTimeInMillies() | 毫秒为单位返回该日历的时间值 |
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.toString());
System.out.println(calendar.getTime().toLocaleString());
int year = calendar.get(Calendar.YEAR);
//月从0-11
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
//HOUR 12 HOUR_OF_DAY 24
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.println("现在是"+year+"年"+(month+1)+"月"+day+"日"+hour+":"+minute+":"+second);
//修改时间
Calendar calendar1 = Calendar.getInstance();
calendar1.set(Calendar.DAY_OF_MONTH,9);
System.out.println(calendar1.getTime().toLocaleString());
//add 修改时间 当前小时增加3个小时
calendar1.add(Calendar.HOUR_OF_DAY,3);
System.out.println(calendar1.getTime().toLocaleString());
//当前时间减少5个小时
calendar1.add(Calendar.HOUR_OF_DAY,-5);
System.out.println(calendar1.getTime().toLocaleString());
//获取当月的最小天数
System.out.println(calendar1.getActualMinimum(Calendar.DAY_OF_MONTH));
//获取当月最大天数
System.out.println(calendar1.getActualMaximum(Calendar.DAY_OF_MONTH));
SimpleDateFormat
进行格式化:日期->文本 解析:文本->日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = new Date();
System.out.println(date.toLocaleString());
//格式化日期 日期转为字符串
System.out.println(sdf.format(date));
//字符串转为日期
String date1 = "2022年1月1日 12:20:23";
Date parse = null;
try {
parse = sdf.parse(date1);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(parse);
System
System是系统类,构造方法是私有的,不需要new
方法名 | 说明 |
---|---|
static void arraycopy() | 复制数组 |
static long currentTimeMillis() | 获取当前系统时间,返回值为毫秒 |
static void gc() | 建议JVM启动垃圾回收器回收垃圾 |
static void exit(int status) | 退出JVM,如果参数为0表示正常退出,非0表示异常退出 |
@Override
protected void finalize() throws Throwable {
System.out.println("回收了name="+this.name+", age="+this.age);
}
int[] array1 = {5,8,4,1,2,4,1,3,6};
int[] array2 = new int[array1.length];
//参数分别为 原数组、原数组开始位置、目的数组、目的数组开始位置、复制个数
// Arrays.copyOf();中调用的也是arraycopy方法
System.arraycopy(array1,5,array2,3,2);
for(int i :array2){
System.out.print(i+" ");
}
System.out.println();
long start = System.currentTimeMillis();
String s ="";
for(int i = 0;i<99999;i++){
s+=i;
}
long end = System.currentTimeMillis();
System.out.println((end-start));
new Student("aaa",12);
new Student("bbb",13);
new Student("ccc",14);
System.gc();