JavaSE常用类之Object类
2022/4/5 17:19:06
本文主要是介绍JavaSE常用类之Object类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1. hashCode方法
代码:
package NeiBuLei; public class hashCode { public static void main(String[] args) { AA aa = new AA(); AA aa2 = new AA(); AA aa3 = aa; AA aa4 = aa2; System.out.println("aa.hashCode()="+ aa.hashCode()); //aa.hashCode()=2129789493 System.out.println("aa2.hashCode()="+ aa2.hashCode()); //aa2.hashCode()=1313922862 System.out.println("aa3.hashCode()="+ aa3.hashCode()); //aa3.hashCode()=2129789493 System.out.println("aa4.hashCode()="+ aa4.hashCode()); //aa4.hashCode()=1313922862 } } class AA{}
两个引用,如果指向的是同一个对象,则哈希值肯定一样
两个引用,如果指向的是不同对象,则哈希值是不一样的
哈希值主要根据地址号来!不能将哈希值完全等价于地址
2. toString方法
代码:
package NeiBuLei; public class toString { public static void main(String[] args) { test test = new test(1,2,3); test.toString(); System.out.println(test.toString()); } } class test{ public int name; public int age; public int score; @Override public String toString() { return "test{" + "name=" + name + ", age=" + age + ", score=" + score + '}'; } public test() { } public test(int name,int age,int score) { this.name = name; this.age = age; this.score = score; } }
3.clone方法
代码:
package NeiBuLei; //用于创建并返回一个对象的拷贝 // clone 方法是浅拷贝,对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存,相对应的深拷贝则会连引用的对象也重新创建。 public class clone { public static void main(String[] args) { Charen p = new Charen(23, "zhang"); Charen p1 = p; System.out.println(p); //NeiBuLei.Charen@7ef20235 System.out.println(p1); //NeiBuLei.Charen@7ef20235 //打印的地址值是相同的,既然地址都是相同的,那么肯定是同一个对象。p和p1只是引用而已,他们都指向了一个相同的对象 // 可以把这种现象叫做引用的复制 Charen s = new Charen(23, "zhang"); Charen s1 = null; try { //要捕获 s1 = (Charen)s.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } //两个对象的地址是不同的,也就是说创建了新的对象, 而不是把原对象的地址赋给了一个新的引用变量 System.out.println(s); //NeiBuLei.Charen@27d6c5e0 System.out.println(s1); //NeiBuLei.Charen@4f3f5b24 } } class Charen implements Cloneable { int age; String name; public Charen() { } public Charen(int age,String name) { this.age = age; this.name = name; } @Override //重写方法 protected Object clone() throws CloneNotSupportedException { return (Charen)super.clone(); } }
深拷贝:深复拷贝象所引用的对象都复制了一遍
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象
浅复制仅仅复制所考虑的对象,而不复制它所引用的对象
String name 中name是String 引用,所以浅拷贝指向同一个name,深拷贝又复制了一个新的name,指向新复制的name。
4.getClass方法
代码:
package NeiBuLei; //当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象 //返回对象的类 public class getClass { public static void main(String[] args) { Object o1= new Object(); System.out.println(o1.getClass()); //class java.lang.Object A a = new A(); System.out.println(a.getClass()); //class NeiBuLei.A } } class A{}
用于返回对象的类
5.equals方法
==是一个比较运算符
- ==: 既可以判断基本类型,又可以判断引用类型
- ==: 如果判断的是基本类型,判断的是值是否相等
//==: 如果判断的是基本类型,判断的是 值 是否相等 int x1 = 10; int x2 = 10; double x3 = 10.0; System.out.println(x1 == x2);//true System.out.println(x1 == x3);//true
- ==: 如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一个对象
package denghao; public class Test01 { public static void main(String[] args) { //==: 如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一个对象 A a = new A(); A b = a; A c = b; System.out.println(a==c);// ? true System.out.println(b==c);// true B obj = a; System.out.println(obj==c);// true } } class B{} class A extends B{}
eauals:
只能判断引用类型
代码:
package NeiBuLei; public class ObjectLei { public static void main(String[] args) { Person p1 = new Person(); p1.name = "zyx"; Person p2 = new Person(); p2.name = "zyx"; //flase //对象不同 System.out.println(p1 == p2);// 引用类型——判断是否为同一个对象(地址) //true //字符串相同 System.out.println(p1.name.equals(p2.name));// p.name是String类型,重写了equals()方法——判断内容是否一样 //flase //对象不同 System.out.println(p1.equals(p2));//p1,p2属于Person类,该类并没有重写equals()方法(继承父类equals()方法,即判断地址) String s1 = new String("abc"); String s2 = new String("abc"); //true //字符串相同 System.out.println(s1.equals(s2)); //false //对象不同 System.out.println(s1 == s2); } } class Person{ public String name; }
6.wait和notify方法
代码:
package NeiBuLei; //run()和start()方法属于线程类Thread public class wait{ static Object locate=new Object(); public static class T1 extends Thread{ //T1线程 public void run(){ synchronized (locate){ //同步锁 System.out.println("T1 start"); try { System.out.println("T1等待locate对象"); locate.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("T1 end"); } } } public static class T2 extends Thread{ //T2线程 public void run(){ synchronized (locate){ //同步锁 System.out.println("T2 被唤起"); locate.notify(); System.out.println("T2 end"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { Thread t1=new T1(); Thread t2=new T2(); t1.start(); t2.start(); } }
运行结果:
T1 start T1等待locate对象 T2 被唤起 T2 end //过几秒 T1 end
(1)对象的wait()方法和notify方法
Object.wait() 线程等待,当调用wait()方法,线程就是停止执行当前任务,转为等待,直到被唤起
Object.notify() 线程唤起,将等待状态下的线程唤起,继续执行任务
(2)线程wait()和notify()的工作原理:
当对象Object调用了wait()方法后,线程进入到Object对象的等待队列,多个线程等待同一个对象
当对象Object调用了wait()方法后,就会从等待队列里面随机选取一个线程并将其唤起,完全随机
(3)注意事项:
notifyALL():唤起所有等待序列的线程
wait()和notify()都必须先获取目标对象的监视器,这样才能进行后续工作
wait方法不能随便使用,必须包含在synchronized中
这篇关于JavaSE常用类之Object类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器
- 2024-11-26Java云原生资料:新手入门教程与实战指南
- 2024-11-26JAVA云原生资料入门教程
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程