java接口(实例运用)

1.对象数组的排序

       数组我们有一个现成的 sort 方法就是可以拿来对数组进行排序操作的,但是能不能对一个对象数组进行排序呢?答案是不可以的!对象数组中的每个元素都是一个实例化的对象,对象中的成员属性复杂,你直接调用sort对数组进行排序是不行的。

        此时就需要实现Comparable接口,并且重写compareTo方法。compareTo方法定义了对象之间的比较规则,sort会根据compareTo方法的返回值来进行排序。然后就可以使用Arrays类的sort方法对对象数组进行排序了。

下面是一个示例:

class Student implements Comparable<Student>{public String name;public int age;public int souce;public Student(String name, int age, int souce) {this.name = name;this.age = age;this.souce = souce;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", souce=" + souce +'}';}@Overridepublic int compareTo(Student o) {return this.age - o.age;}
}class AgeComparator implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {return o1.age - o2.age;}
}
class SouceComparator implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {return o1.souce - o2.souce;}
}
class NameComparator implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {return o1.compareTo(o2);}
}public class Exercise {public static void sort(Comparable[] array) {for (int i = 0; i < array.length; i++) {for (int j = 0; j < array.length-i-1; j++) {if(array[j].compareTo(array[j+1])>0){Comparable tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;}}}}public static void main(String[] args) {Student[] student = new Student[3];student[0] = new Student("zhangsan",11,55);student[1] = new Student("lisi",8,41);student[2] = new Student("wangwu",13,12);NameComparator nameComparator = new NameComparator();AgeComparator ageComparator = new AgeComparator();SouceComparator souceComparator = new SouceComparator();Arrays.sort(student);System.out.println(Arrays.toString(student));//比较器Arrays.sort(student,souceComparator);System.out.println(Arrays.toString(student));Arrays.sort(student,nameComparator);System.out.println(Arrays.toString(student));Arrays.sort(student,ageComparator);System.out.println(Arrays.toString(student));//sort重新sort(student);System.out.println(Arrays.toString(student));}
}

        此段代码中对sotr中的Comparable接口中的compareTo进行了重写,但是这么写有一个很大的问题,因为这个方法一旦写死了,后续调用sort排序都是以这一成员属性来排序。

        所以在代码中,我们运用了构造器,这样使用者就可以根据自己的实际需求调用不同的比较器,来对数组进行排序。

        另外可以对sort方法进行重写,这样就可以选择调用自己的sort方法。


2.Clonable 接口和深拷贝

        Java 中内置了一些很有用的接口, Clonable 就是其中之一。Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 "拷贝"。 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常。

下面是一段代码示例:

import java.util.Objects;class Money implements Cloneable{public double money = 6.6;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
class Student implements Cloneable{public String name = "zxhangsan";Money m = new Money();@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", m=" + m.money +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {Student student = (Student) super.clone();student.m = (Money) this.m.clone();return student;}}public class Exercise {public static void main(String[] args) throws CloneNotSupportedException{Student student1 = new Student();Student student2 = (Student) student1.clone();System.out.println(student1);System.out.println(student2);System.out.println("=============");student2.m.money = 88;System.out.println(student1);System.out.println(student2);System.out.println("==============");}
}

这段代码展示了如何使用`Cloneable`接口和拷贝来创建对象的副本。

首先,`Cloneable`接口是一个标记接口,用于指示该类的对象可以被拷贝。在类中实现`Cloneable`接口,表示该类的对象可以使用`clone()`方法进行拷贝。

在`Money`类和`Student`类中,都实现了`Cloneable`接口,并重写了`clone()`方法。在`clone()`方法中,都调用了`super.clone()`来创建对象的浅拷贝。

在`Student`类中,还对`m`对象进行了深拷贝。在`clone()`方法中,首先调用了`super.clone()`来创建对象的浅拷贝,然后将`m`对象进行深拷贝。深拷贝是为了确保副本对象和原始对象中的引用类型成员变量不共享同一个引用,而是拥有各自独立的拷贝。

在`Exercise`类的`main`方法中,创建了一个`Student`对象`student1`。然后通过调用`clone()`方法创建了`student1`的副本`student2`。使用`println`方法打印`student1`和`student2`对象的信息,可以看到它们的内容是相同的。

接着,修改了`student2`副本对象中的`m`对象的`money`属性,将其修改为88。再次打印`student1`和`student2`对象的信息,可以看到`student1`的`m`对象的`money`属性没有改变,而`student2`的`m`对象的`money`属性被修改为88。这表明副本对象和原始对象中的引用类型成员变量是独立的,互不影响。

综上所述,`Cloneable`接口和拷贝可以用于创建对象的副本。通过实现`Cloneable`接口,并重写`clone()`方法,可以实现对象的浅拷贝。如果对象中包含引用类型成员变量,需要进行深拷贝,确保副本对象和原始对象中的引用类型成员变量不共享同一个引用。


3.获取对象信息

        如果要打印对象中的内容,可以直接重写Object类中的toString()方法。

toString()方法是Object类中的一个方法,它返回一个包含对象内容的字符串表示。默认情况下,toString()方法返回的是对象的类名和哈希码。

结合上个例子中的代码,在Student类中,重写了toString()方法,以便返回一个包含namem.money属性的字符串表示。通过重写toString()方法,可以自定义打印对象的内容,使其更加有意义和可读性。

Exercise类的main方法中,通过调用System.out.println()方法打印student1student2对象,实际上是调用了对象的toString()方法来获取字符串表示,并将其输出到控制台。

所以,通过重写toString()方法,可以方便地打印对象的内容。


4.对象比较equals 方法

在Java中,对象比较通常使用`equals()`方法。`equals()`方法是`Object`类中的一个方法,用于比较两个对象是否相等。

默认情况下,`equals()`方法比较的是对象的引用是否相等,即比较两个对象是否指向同一个内存地址。这可以通过`==`运算符进行比较。

然而,有时候我们需要比较对象的内容是否相等,而不仅仅是比较引用。在这种情况下,我们需要重写`equals()`方法。

重写`equals()`方法时,通常需要满足以下几个条件:

  1. 自反性:对于任何非空引用值`x`,`x.equals(x)`应该返回`true`。
  2. 对称性:对于任何非空引用值`x`和`y`,如果`x.equals(y)`返回`true`,则`y.equals(x)`也应该返回`true`。
  3. 传递性:对于任何非空引用值`x`、`y`和`z`,如果`x.equals(y)`返回`true`,`y.equals(z)`返回`true`,则`x.equals(z)`也应该返回`true`。
  4. 一致性:对于任何非空引用值`x`和`y`,多次调用`x.equals(y)`应该始终返回相同的结果。
  5. 非空性:对于任何非空引用值`x`,`x.equals(null)`应该返回`false`。

在重写`equals()`方法时,通常需要比较对象的属性是否相等。可以使用`instanceof`运算符检查对象类型,然后比较属性的值。在比较引用类型的属性时,可以使用`equals()`方法递归比较。

另外,如果重写了`equals()`方法,通常也需要重写`hashCode()`方法,以确保相等的对象具有相同的哈希码。这是因为在使用一些集合类(如`HashSet`、`HashMap`等)时,会依赖对象的哈希码来进行快速查找和比较。

总之,通过重写`equals()`方法,可以自定义对象的相等性比较。在比较对象时,应该根据对象的属性进行比较,并满足`equals()`方法的约定。

下面是一个示例:

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}// 重写equals()方法来比较对象的相等性@Overridepublic boolean equals(Object obj) {if (this == obj) { // 检查对象引用是否相等return true;}if (obj == null || getClass() != obj.getClass()) { // 检查对象类型是否相同return false;}Person person = (Person) obj; // 强制转换为Person类型return age == person.age && name.equals(person.name); // 比较属性值是否相等}public static void main(String[] args) {Person p1 = new Person("Alice", 20);Person p2 = new Person("Alice", 20);Person p3 = new Person("Bob", 25);System.out.println(p1.equals(p2)); // 输出true,因为p1和p2的属性值相等System.out.println(p1.equals(p3)); // 输出false,因为p1和p3的属性值不相等}
}

在上面的示例中,`Person`类重写了`equals()`方法来比较两个`Person`对象的相等性。在`main`方法中,我们创建了三个`Person`对象,并使用`equals()`方法进行比较。根据`name`和`age`属性的值,我们可以确定两个对象是否相等。

在`equals()`方法中,我们首先检查对象的引用是否相等,如果相等则直接返回`true`。然后,我们检查对象的类型是否相同,如果不同则返回`false`。最后,我们将对象强制转换为`Person`类型,并比较`name`和`age`属性的值是否相等。如果属性值相等,则返回`true`,否则返回`false`。

在`main`方法中,我们分别比较了`p1`和`p2`,以及`p1`和`p3`的相等性。根据属性的值,`p1`和`p2`的相等性为`true`,而`p1`和`p3`的相等性为`false`。


5.hashcode方法

在Java中,hashCode()方法是Object类的一个方法,用于返回对象的哈希码(hash code)。哈希码是一个整数值,用于在哈希表等数据结构中快速查找和比较对象。

hashCode()方法的默认实现是根据对象的内存地址计算哈希码。但是,如果我们需要将对象用作集合类(如HashSetHashMap等)的键或在自定义的哈希表中使用,则通常需要重写hashCode()方法。

在重写hashCode()方法时,应该遵循以下原则:

  1. 如果两个对象使用equals()方法比较相等,则它们的哈希码应该相等。
  2. 如果两个对象的哈希码相等,它们不一定相等。

以下是重写hashCode()方法的示例代码:

import java.util.Objects;public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}// 重写hashCode()方法@Overridepublic int hashCode() {return Objects.hash(name,age);}public static void main(String[] args) {Person p1 = new Person("Alice", 20);Person p2 = new Person("Alice", 20);System.out.println(p1.hashCode()); // 输出哈希码System.out.println(p2.hashCode()); // 输出哈希码}
}

代码中hashCode()方法将nameage作为参数传递给Objects.hash()方法,然后返回计算得到的哈希码。

main方法中,我们创建了两个Person对象,并分别输出它们的哈希码。根据属性的值,p1p2的哈希码是相等的。

使用Objects.hash()方法可以简化重写hashCode()方法的过程,并且可以处理多个属性的哈希码。这样可以提高代码的可读性和维护性。


        以上就是本期的全部内容啦,希望看完后能够对你有所帮助。希望小伙伴们可以点赞收藏加关注,学习知识不迷路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/62355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

26 Linux高级篇-Linux面试题

26 Linux高级篇-Linux面试题 文章目录 26 Linux高级篇-Linux面试题1.分析日志t.txt(访问量)&#xff0c;将各个ip地址截取&#xff0c;并统计出现次数&#xff0c;并按从大到小排序(腾讯)2.统计连接到服务器的各个ip情况&#xff0c;并按连接数从大到小排序(腾讯)3.如忘记了mys…

【Kali Linux高级渗透测试】深入剖析Kali Linux:高级渗透测试技术与实践

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

玩转Mysql系列 - 第8篇:详解排序和分页(order by limit),及存在的坑

这是Mysql系列第7篇。 环境&#xff1a;mysql5.7.25&#xff0c;cmd命令中进行演示。 代码中被[]包含的表示可选&#xff0c;|符号分开的表示可选其一。 本章内容 详解排序查询 详解limit limit存在的坑 分页查询中的坑 排序查询&#xff08;order by&#xff09; 电商…

基于java Swing 和 mysql实现的购物管理系统(源码+数据库+说明文档+运行指导视频)

一、项目简介 本项目是一套基于java Swing 和 mysql实现的购物管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过…

Effetive STL | 条款2 : 小心对“容器无关代码”的幻想

Effetive STL | 条款2 &#xff1a; 小心对“容器无关代码”的幻想 文章目录 Effetive STL | 条款2 &#xff1a; 小心对“容器无关代码”的幻想STL 容器特点推行自己的容器容器能力的交集 封装Method1: typedefMethod2: class>>>>> 欢迎关注公众号【三戒纪元】…

如何通过内网穿透实现外部网络对Spring Boot服务端接口的HTTP监听和调试?

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

Python爬虫:打开盈利大门的利器

导言&#xff1a; 随着互联网的迅速发展&#xff0c;越来越多的企业和个人开始意识到数据的重要性。而Python爬虫作为一种自动化获取互联网信息的技术&#xff0c;为人们提供了更便捷、高效的数据获取方式。本文将介绍基于Python爬虫的五种盈利模式&#xff0c;并提供实际案例…

微信小程序 - 2023年最新版手机号快捷登录详细教程

前言 最近开发公司手机快捷登录的功能&#xff0c;花费了不少时间&#xff0c;这里附上详细教程。 这里以海底捞小程序的图片为例&#xff0c;如有侵权请联系小编删除。 代码如下 <button open-type"getPhoneNumber" getphonenumber"getPhoneNumber"…

oracle 基础运用2

首先在电脑上安装PLSQL developer&#xff0c;这个是oracle图形化连接工具&#xff0c;然后安装win64_11gR2_client&#xff0c;这个是orace客户端&#xff0c;安装完成后可以在cmd命令行输入sqlplus命令进行验证&#xff0c;如图表示安装成功。 作为sys的连接应该是SySDBA或Sy…

一些关于异构SOC IPC核间通信的知识

帮你了解一些关于异构SOC IPC核间通信的知识。 异构SOC是指在一个芯片上集成了不同类型的处理器核&#xff0c;例如ARM、DSP、GPU等&#xff0c;它们可以协同工作&#xff0c;提高性能、降低功耗、节省成本和空间。 IPC&#xff08;Inter-Processor Communication&#xff0…

vxe-table全选禁用并保留选中项

需求&#xff1a;1、新建时全选可用&#xff0c;提交后全选不可用&#xff1b;2、提交后新建时选中的记录还要保持选中状态 官网上写的是可以通过 strict 设置为严格模式&#xff0c;当表格中不存在有效数据时列头复选框为禁用状态。 通过设置strict可以实现第一个需求&#…

万物流动 万物永驻 ——C++ Core Guidelines的流动哲学

众所周知&#xff0c;C 是一门自由的语言&#xff0c;语言的设计哲学之一就是赋予程序员极大的自由度和灵活性&#xff0c;因此&#xff0c;使用C 完成一个任务时&#xff0c;不同的程序员往往会有不同的实现方法&#xff0c;这真正阐释了什么叫条条大路通罗马。不过&#xff0…

Android Activity 启动流程 二:setContentView

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、概览二、setContentView&#xff08;&#xff09;三…

阿桂天山的技术小结:Flask+UEditor实现图片文件上传富文本编辑

话不多说,有图有源码 先看效果: 1.前端html页面index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><script src"{{ url_for(static,filenameueditor/ueditor.config.js) }}"></script…

数学建模:灰色关联分析

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 灰色关联分析法 算法流程 建立一个m行 n列的矩阵 X X X &#xff0c;其中 m 表示评价对象&#xff0c; n表示评价指标首先进行矩阵的归一化&#xff0c;得到归一化后的矩阵 d a t a data data获取参考向…

说说Flink中的State

分析&回答 基本类型划分 在Flink中&#xff0c;按照基本类型&#xff0c;对State做了以下两类的划分&#xff1a; Keyed State&#xff0c;和Key有关的状态类型&#xff0c;它只能被基于KeyedStream之上的操作&#xff0c;方法所使用。我们可以从逻辑上理解这种状态是一…

[第七届蓝帽杯全国大学生网络安全技能大赛 蓝帽杯 2023]——Web方向部分题 详细Writeup

Web LovePHP 你真的熟悉PHP吗&#xff1f; 源码如下 <?php class Saferman{public $check True;public function __destruct(){if($this->check True){file($_GET[secret]);}}public function __wakeup(){$this->checkFalse;} } if(isset($_GET[my_secret.flag]…

【Java Web】敏感词过滤

一、前缀树 假设有敏感词&#xff1a;b&#xff0c;abc&#xff0c;abd&#xff0c;bcd&#xff0c;abcd&#xff0c;efg&#xff0c;hii 那么前缀树可以构造为&#xff1a; 二、敏感词过滤器 package com.nowcoder.community.util;import org.apache.commons.lang3.CharUt…

全网首发!大众宝来高尔夫polo领驭迈腾帕萨特奥迪A4A6B6B7等老车机增加带蓝牙控制的AUX解码模块,支持小程序原车按钮控制,支持外接高品质蓝牙模块

文章目录 前言1、设计指标2、PCB设计3、程序设计4、调试4.1蓝牙控制AUX解码板4.2自定义车机按钮控制其他高品质蓝牙音频模块4.3小程序使用 5、模块与车机连接方法6、结语 前言 ​ 之前写过四篇关于车机增加音频输入的方法。 1、07宝来经典车机CD收音机&#xff08;RC668&…

【Python】python使用docxtpl生成word模板

python使用docxtpl生成word模板 python-docxtpl包简单使用和实战&#xff0c;Python处理word&#xff0c;docx文件。 最近需要处理一些爬虫得到的数据来进行一些自动化报告的操作&#xff0c;因为需要生成的是word的报告&#xff0c;所以估选用docxtpl库来直接生成模板 docxt…