常用类学习
object类
- 超类、基类,所有类的直接或间接父类,位于继承树的最顶层。
- 任何类,如没有书写extends显示继承某个类,都默认直接继承object类否则为间接继承。
- object类中所定义的方法,是所有对象都具备的方法。
- object类型可以存储任何对象。
- 作为参数,可接受任何对象。
- 作为返回值,可返回任何对象。
getClass()方法
- public final Class<?> getClass(){}
- 返回引用中存储的实际对象类型。
- 应用:通常用于判断两个引用中实际存储对象类型是否一致
实例
public class Test {
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Student();
Student student = new Student();
Class class1 = person1.getClass();
Class class2 = person2.getClass();
Class class3 = student.getClass();
if (class1 == class2) {
System.out.println("class1 == class2");
} else {
System.out.println("class1 != class2");
}
if (class2 == class3) {
System.out.println("class2 == class3");
} else {
System.out.println("class2 != class3");
}
}
}
hashCode()方法
- public int hashCode() {}
- 返回该对象的哈希码值。
- 哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值。
- 一般情况下相同对象返回相同哈希码,
实例
public class Test {
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Student();
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
person1 = person2;
System.out.println(person1.hashCode());
}
}
toString()方法
-
public String toString(){}
-
返回该对象的字符串表示(表现形式)
-
可以根据程序需求覆盖该方法,如:展示对象各个属性值。
-
//测试类 public class Test { public static void main(String[] args) { Person person1 = new Person(); Person person2 = new Student(); System.out.println(person1.toString()); System.out.println(person2.toString()); } } //重写Student类的toString方法 public class Student extends Person{ int name; public String toString() { return "Student'name:" + name; } }
@之后的值和hashCode()得到的地址相同,只是进制不同。
equals()方法
- public boolean equals(Object obj) {}
- 默认实现为(this==obj),比较两个对象地址是否相同。
- 可进行覆盖,比较两个对象的内容是否相同,
public class Test {
public static void main(String[] args) {
Person person1 = new Student("张三", 18);
Person person2 = new Student("张三", 18);
//输出false,因为equals默认对比的是对象的地址,而不是内容(今天面试问了,-_-!)
System.out.println(person1.equals(person2));
}
}
equals()方法覆盖的步骤
- 比较两个引用是否指向同一个对象。
- 判断obj是否为null。
- 判断两个引用指向的实际对象类型是否一致。
- 强制类型转换。
- 依次比较各个属性值是否相同。
实例
public class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) {
//比较两个引用是否指向同一个对象。
if (this == obj) return true;
//obj是否为空
if (obj == null) return false;
//判断两个引用指向的实际对象类型是否一致。
// if (this.getClass() == obj.getClass()) {
//
// }
if (obj instanceof Student) {
//强制类型转换
Student student = (Student) obj;
//判断内容是否一致
return this.name == student.name && this.age == student.age;
}
return false;
}
}
//调用类
public class Test {
public static void main(String[] args) {
Student student1 = new Student("张三", 18);
Student student2 = new Student("张三", 18);
//重写后返回true
System.out.println(student1.equals(student2));
}
}
finalize()方法
- 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象进入回收队列。
- 垃圾对象:没有有效引用指向此对象时,为垃圾对象
- 垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
- 自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
- 手动回收机制:使用System.gc(); 通知JVM执行垃圾回收,也只是通知,回收与否还要看JVM的决定
//实例
Student a = new Student();//不回收
new Student();//会回收
包装类
什么是包装类
- 基本数据类型所对应的引用数据类型。
- Object可统一所有数据,包装类的默认值是null。
类型转换与装箱、拆箱
- 8种包装类提供不同类型间的转换方式
- Number父类中提供的6个共性方法。
- 装箱就是将基本数据类型(在栈中)转换成引用数据类型(堆中)
- 拆箱就是将引用数据类型(堆中)转换成基本数据类型(在栈中)
public class Demo01 {
public static void main(String[] args) {
//类型转换:装箱,基本类型转成引用类型的过程
//基本类型
int num1 = 18;
//使用Interger类创建对象
Integer integer1 = new Integer(num1);
Integer integer2 = Integer.valueOf(num1);
System.out.println("装箱");
System.out.println(integer1);
System.out.println(integer2);
//类型转型:拆箱,引用类型转成基本类型
Integer integer3 = new Integer(100);
int num2 = integer3.intValue();
System.out.println("拆箱");
System.out.println(num2);
//JDK1.5之后可以自动装箱拆箱了,其实字节码文件中的代码也是一样的
//参考C++中的重载操作符
int num3 = 18;
//自动装箱
Integer integer = num3;
System.out.println("自动装箱");
System.out.println(num3);
//自动拆箱
int num4 = integer;
System.out.println("自动拆箱");
System.out.println(num4);
}
}
Number提供的方法,具体可见帮助文档
基本类型和字符串转换
- 用parseXXX()静态方法
public class Demo02 {
public static void main(String[] args) {
//1基本数据类型转成字符串
int num1 = 255;
//1.1使用加号
String s1 = num1 + "";
//1.2使用Integer中的toString()方法,有多种重载方法,可以指定进制转换
String s2 = Integer.toString(num1, 16);
System.out.println(s1);
System.out.println(s2);
//2字符串转成基本类型
String str = "150";
//使用Integer.parseXXX();
int num2 = Integer.parseInt(str);
System.out.println(num2);
//boolean字符串形式转成基本类型:“true”-->true 非“true”-->fasle
String str2 = "true";
String str3 = "tru";
System.out.println(Boolean.parseBoolean(str2));
System.out.println(Boolean.parseBoolean(str3));
}
}
整数缓冲区
- Java预先创建了256(-128到127)个常用的整数包装类型对象。
- 在实际应用当中,对已创建的对象进行复用。节省资源
public class Demo03 {
public static void main(String[] args) {
//面试题
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1 == integer2);//false
//在缓冲区范围之内,实际上是一个对象实体
Integer integer3 = 100;//自动装箱
Integer integer4 = 100;
System.out.println(integer3 == integer4);//true
//超过缓冲区范围之内
Integer integer5 = 200;//自动装箱
Integer integer6 = 200;
System.out.println(integer5 == integer6);//false
}
}
通过代码了解,可以看出确实是-128到127.
String类
概述
- 字符串是常量,创建之后不可改变。
- 字符串字面值存储在字符串池中,可以共享。
- Strings="Hello";产生一个对象,字符串池中存储。
- Strings=newString(“Hello”);//产生两个对象,堆、池各存储
实例代码
public class Demo04 {
public static void main(String[] args) {
String name1 = "hello";//“hello”存储在字符串中
name1 = "world";//world赋值给name变量,给字符串赋值时,没有修改数据,而是重新开辟空间
String name2 = "world";
System.out.println(name.getClass() == name2.getClass());//true
//演示字符串的另一种创建方式,new String();
String str1 = new String("java");
String str2 = new String("java");
System.out.println(str == str1);//false
System.out.println(str.equals(str1));//true
}
}
示意图
注意这里的String类型的equals对比的字符串的内容,而不是对象地址。由代码可知
常用方法
-
public int length():返回字符串的长度。
-
public char charAt(int index):根据下标获取字符。
-
public boolean contains(String str):判断当前字符串中是否包含str。
-
public char[] toCharArray():将字符串转换成数组。
-
public int indexOf(String str):查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1。
-
public int lastIndex0f(Stringstr):查找字符串在当前字符串中最后一次出现的下标索引。
-
public String trim():去掉字符串前后的空格。
-
public String toUpperCase():将小写转成大写。
-
public String toLowerCase():将大写转成小写。
-
public boolean endWith(String str):判断字符串是否以str结尾。
-
public boolean startWith(String str):判断字符串是否以str开头。
-
public String replace(char oldChar,char newChar):将旧字符串替换成新字符串
String content = "java123java"; content.replace("java","C++");//会变成C++123C++
-
public String[] split(String str):根据str做拆分。
小技巧,参数中str可以写成“[ ,]+”,中括号中的空格和逗号表示空格和括号都要拆分,而加号则是空号中的某个字符出现连续多个是也可以分割。
-
public boolean equls():上面已说
-
public int compareTo(String str):字符按从前往后依次按字典表顺序比大小,返回前后两者差值
特殊的两者长度不同,但是用公共前缀时,返回的是长度差值,而不再编码差值,如“java”和“javac”得-1
-
public String substring(int beginIndex, int endIndex):截取字符串
可变字符串
- StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全。
- StringBuilder:可变长字符串,JDK5.0提供,运行效率快、线程不安全。
当然这里的快慢是相对的,都比String类型快
public class Demo05 {
public static void main(String[] args) {
//StringBuffer和StringBuilder的方法使用一样
StringBuffer sb = new StringBuffer();
//1 append();追加
sb.append("hello");
System.out.println(sb.toString());
sb.append("world");
System.out.println(sb.toString());
//2 insert();插入
sb.insert(0,"perword");
System.out.println(sb.toString());
//3 replace();替换,可以指定下标范围,遵循"含头不含尾"的原则
sb.replace(0,7,"Hi,");
System.out.println(sb.toString());
//4 delete();删除
sb.delete(0, 3);
System.out.println(sb.toString());
//清空
sb.delete(0, sb.length());
System.out.println(sb.length());
}
}
BigDecimal类
- 位置:java.math包中。
- 作用:因为基本数据类型中的浮点数是近似的,实现不了精确计算浮点数,此时要用到该类。创建方式:BigDecimal bd=new BigDecimal(“1.0”)
- 方法:
- BigDecimal add(BigDecimal bd) 加
- BigDecimal subtract (BigDecimal bd) 减
- BigDecimal multiply(BigDecimal bd) 乘
- BigDecimal divide(BigDecimal bd) 除
Date类
- Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代。
- 时间单位
- 1秒=1000毫秒
- 1毫秒=1000微秒
- 1微秒=1000纳秒
public class Date {
public static void main(String[] args) {
//1 创建Date对象
//今天
Date date1 = new Date();
System.out.println(date1.toString());
System.out.println(date1.toLocaleString());
//昨天
Date date2 = new Date(date1.getTime() - (60 * 60 * 24 * 1000));
System.out.println(date2.toLocaleString());
//2 方法after before
System.out.println(date1.after(date2));
System.out.println(date1.before(date2));
//比较compareTo();
System.out.println(date1.compareTo(date2));
//比较是否相等equals();
System.out.println(date1.equals(date2));
}
}
Calendar类
public class Test {
public static void main(String[] args) {
//1 创建Calender对象
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime().toLocaleString());
System.out.println(calendar.getTimeInMillis());
//2 获取时间信息
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.println(year + "年" + (month + 1) + "月"
+ day + "日" + hour + ":" + minute + ":" + second);
//修改时间
Calendar calendar2 = Calendar.getInstance();
calendar2.set(Calendar.DAY_OF_MONTH, 17);
System.out.println(calendar2.getTime().toLocaleString());
//补充方法,获取当月最大最小日期
int max = calendar2.getActualMaximum(Calendar.DAY_OF_MONTH);
int mix = calendar2.getActualMinimum(Calendar.DAY_OF_MONTH);
System.out.println(max);
System.out.println(mix);
}
}
SimpleDateFormat类
public class Test {
public static void main(String[] args) throws Exception {
//1 创建SimpleDateFormat对象y 年 M 月
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//格式可以自定义
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
//2 创建Date
Date date1 = new Date();
//格式化date(把日期转成字符串)
String str = sdf1.format(date1);
System.out.println(str);
//解析(把字符串转成日期)
//如果字符串格式与pattern不对应,则要抛出异常
Date date2 = sdf2.parse("2025-02-05");
System.out.println(date2);
}
}
System类
public class Test {
public static void main(String[] args) throws Exception {
//arraycopy:数值的复制
int[] arr = {20, 39, 23, 45, 23, 54, 22, 67};
int[] dest = new int[8];
//参数分别是:源数值,从哪个位置开始复制,目标数值,目标数值的位置,复制长度
//ctrl 点击可以参数arraycopy是native修饰的,使用本地方法,用C/C++实现,效率很高
System.arraycopy(arr, 4, dest, 4, 4);
for (int i = 0; i < dest.length; i++) {
System.out.println(dest[i]);
}
//获取1970年至今的毫秒数
System.out.println(System.currentTimeMillis());
long start = System.currentTimeMillis();
int n = 99999999;
for (int i = (-1) * n; i < n; i++) {
for (int j = (-1) * n; j < n; j++) {
int result = i * j;
}
}
long end = System.currentTimeMillis();
System.out.println("用时:" + (end - start));
//exit()推出jvm虚拟机
System.exit(0);
//退出后后面代码将不会执行
System.out.println("不输出");
}
}
本文作者:韩熙隐ario
本文链接:https://www.cnblogs.com/arioya/p/18675864
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~