一.比较器Comparable和Comparator
上一篇博客介绍了工具类Arrays工具类 。我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序。排序操作在日常开发中经常要使用到。那么String类和自定义类能不能使用Arrays.sort()来进行排序呢。下面我们来试试,如下:
public class Mystring { public static void main(String[] args) { String []a={"早上","中午","下午","傍晚","晚上"}; Person[] b={ new Person("小白",15),new Person("小黑",19), new Person("小红",14),new Person("小紫",20)}; Arrays.sort(a); for(int i=0;i<a.length;i++) System.out.print(a[i]); System.out.print("\r\n"); Arrays.sort(b); for(int i=0;i<b.length;i++) System.out.println(b[i]); } } //自定义类 class Person { public String name; public int age; public Person(String name,int age) { this.name=name; this.age=age; } }
程序运行结果:
我们发现String可以调用Arrays.sort()函数,而我们自定义的Person类报错,看错误的关键字 Comparable
打开String源码
由此引入比较器Comparable,我们下面利用Comparable接口来实现Person使用Arrays.sort()按年龄排序递增排序。
Comparable接口能够对实现它的类的对象进行排序,主要使用compareTo函数来实现排序。compareTo函数返回int类型,分别返回-1,0,1对应小于,等于,大于。
把代码改为:
public class Mystring { public static void main(String[] args) { String []a={"早上","中午","下午","傍晚","晚上"}; Person[] b={ new Person("小白",15),new Person("小黑",19), new Person("小红",14),new Person("小紫",20)}; Arrays.sort(a); for(int i=0;i<a.length;i++) System.out.print(a[i]); System.out.print("\r\n"); Arrays.sort(b); for(int i=0;i<b.length;i++) System.out.println(b[i]); } } //自定义类 class Person implements Comparable<Person>{ public String name; public int age; public Person(String name,int age) { this.name=name; this.age=age; } //比较器的比较函数 /** * 如果当前对象小于比较对象,返回-1 * 如果当前对象等于比较对象,返回0 * 如果当前对象大于比较对象,返回1 */ @Override public int compareTo(Person o) { //对象为空,抛出空指针异常 if(o==null) throw new NullPointerException(); if(this.age<o.age) return -1; if(this.age>o.age) return 1; return 0; } //重写toString方法 @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
运行结果:
为自定义的Person实现比较器Comparable接口,即可调用Arrays.sort()进行排序。
另外还有另一种实现方法,实现Comparator接口。
public class Mystring { public static void main(String[] args) { String []a={"早上","中午","下午","傍晚","晚上"}; Person[] b={ new Person("小白",15),new Person("小黑",19), new Person("小红",14),new Person("小紫",20)}; Arrays.sort(a); for(int i=0;i<a.length;i++) System.out.print(a[i]); System.out.print("\r\n"); Arrays.sort(b,new PersonComparator()); for(int i=0;i<b.length;i++) System.out.println(b[i]); } } //自定义类 class Person { public String name; public int age; public Person(String name,int age) { this.name=name; this.age=age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } } class PersonComparator implements Comparator<Person>{ //比较器的比较函数 /** * 如果当前对象小于比较对象,返回-1 * 如果当前对象等于比较对象,返回0 * 如果当前对象大于比较对象,返回1 */ @Override public int compare(Person o1, Person o2) { //对象为空,抛出空指针异常 if(o1==null||o2==null) throw new NullPointerException(); if(o1.age<o2.age) return -1; if(o1.age>o2.age) return 1; return 0; } }
二.对象的克隆Clone
将一个对象复制一份,称作对象的克隆技术。克隆对象分为两步。
1.实现Cloneable标记接口
Cloneable是一个标记接口,此接口没有定义任何方法。只是作为一个标记给虚拟机。
2.重写Object的clone方法
//自定义类person实现Cloneable接口 class Person implements Cloneable { public String name; public int age; public Person(String name,int age) { this.name=name; this.age=age; } //重写Object的clone方法 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
克隆的调用:
public static void main(String[] args) { Person temp=new Person("王尼玛",18); try { Person ok=(Person)temp.clone();//把Object类转化为Person、 System.out.println(ok.name);//输出王尼玛 } catch (CloneNotSupportedException e) { e.printStackTrace(); } }
这样既可以完成对一个对象的克隆,当我们要创建一系列类似的对象时,可以考虑使用克隆技术可以得到更好的性能,比你new创建好一些
相关推荐
可以通过实现`Cloneable`接口并重写`clone`方法来实现对象的克隆。 #### 字符串类 - **String**:不可变字符串类。 - **StringBuilder/StringBuffer**:可变字符串类,其中`StringBuilder`是非线程安全的,而`...
031113_【第11章:Java常用类库】_比较器(Comparable、Comparator)笔记.pdf 031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java...
实例056 Java对象的深克隆 82 实例057 序列化与对象克隆 84 实例058 深克隆效率的比较 87 第7章 面向对象进阶 89 实例059 经理与员工的差异 90 实例060 重写父类中的方法 92 实例061 计算几何图形的面积 93 实例062 ...
Java中的克隆分为浅克隆和深克隆,浅克隆只复制对象本身,深克隆会复制对象及其引用的所有子对象。 new一个对象涉及类加载、实例化和初始化,而clone则是复制一个现有对象,两者在内存分配上有显著区别。 多态是...
1. **Java语言特点**:包括跨平台性、面向对象、自动内存管理、丰富的类库、健壮性和安全性等。 2. **面向对象与面向过程**:面向对象编程注重对象和类的抽象,而面向过程编程关注步骤和函数。 3. **数据类型**:...
A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...
在 Java 中,对象通过 `new` 关键字创建,使用完成后由垃圾回收器自动回收。 6. **类与包**: - Java 使用包来组织类和接口,常见的包如 `java.lang`、`java.util`、`java.net` 等。合理使用包可以避免命名冲突,...
A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...
* 对象的 finalize() 方法可以请求垃圾回收器进行回收 5. 克隆: * 简单克隆可以使用 clone() 方法,但是需要实现 Cloneable 接口 * 深度克隆需要重新克隆对象的属性 6. 字符串: * 字符串会被 Java 放到常量池...
A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...
A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 其他J/Direct...
Cloneable接口表示对象可以被克隆,Comparable接口则允许类的对象进行比较排序。 java.lang包还包含了一些与安全、线程和内存管理相关的类,如SecurityManager用于安全管理,Thread和ThreadGroup是线程相关的类,...
- 比较器:包括Comparable接口和Comparator接口,用于对象比较的两种不同方式。 - 正则表达式:提供了一种文本模式的描述方法,可用于搜索和替换文本。 反射机制是Java语言提供的一种基础功能,通过反射机制可以...
A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...
`Object`类描述了Java对象的基本特征,包括对象的比较、克隆和字符串表示等。面向对象的三大特性——封装、继承和多态,都是基于类和对象的。 15. **Scanner类**: `Scanner`类是Java的输入工具,可以从`System....
- `ArrayList`、`LinkedList`、`HashSet`、`HashMap`等都实现了`Cloneable`和`Serializable`接口,可以进行克隆和序列化。 2. **日期和时间处理**: - `Date`类:表示特定瞬间,精确到毫秒。但在Java 8之后,已经...
A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...