我是靠谱客的博主 机智时光,这篇文章主要介绍Comparable和Comparator的区别以及Lambda表达式实现Comparable和Comparator的区别,现在分享给大家,希望可以做个参考。
Comparable和Comparator的区别
1.comparable里面的ComparaTo()是TreeSet和TreeMap里面add()与put()方法里面调用对象的ComparaTo(),通过返回值,来确定它,是否存在or顺序。他是内置的,所以如果自定义对象用TreeSet来存的话,得重写ComparaTo.这里不能,用Lambda表达式,Lambda表达式和匿名内部类一样,就是为了创建对象,而这里不用。
2.Comparator是人工比较器,它的优先级高于Comparable,当系统检测到里面实现了Comparator,它会优先于Comparable使用,它是脱离你所存的对象的,它通过创建自己的对象,定义自己的规则,它的compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int。然后集合调用自己的构造,传进去,在使用add()或put()方法时,自动调用Compare方法。
实例代码1
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170package com.chd.day06; import java.util.Comparator; import java.util.Set; import java.util.TreeSet; public class Lambda02 { static int compararr(String s1, String s2) { return (s1.length() - s2.length()) == 0 ? s1.compareTo(s2) : (s1.length() - s2.length()); } public static void main(String[] args) { // TODO Auto-generated method stub // 开始 // ImplementsComparator im = new ImplementsComparator(); /*匿名内部类 Comparator im =new Comparator() { @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub // 向下转型 String s1 = (String) o1; String s2 = (String) o2; // 先按照长度比 int num = s1.length() - s2.length(); // 长度相同,再按照字典顺序比 return num == 0 ? s1.compareTo(s2) : num; } }; */ // 第一次Lambda: /* * Comparator im = (s1,s2)->{ String o1 = (String)s1; String o2 = (String)s2; * int num = o1.length()-o2.length(); return num==0?o1.compareTo(o2):num; }; */ //第二次Lambda: Comparator<String> im =(s1,s2)->(s1.length()-s2.length())==0?s1.compareTo(s2):(s1.length()-s2.length()); // 第三次Lambda; // Comparator<String> im =Lambda02::compararr; Set<String> set = new TreeSet<>(im); set.add("skdj"); set.add("skdj"); set.add("skdj"); set.add("skdj"); System.out.println(set); } } class ImplementsComparator implements Comparator<String> { // @Override // public int compare(T o1, T o2) { // // 比较字符串的长度 // if (!(o1 instanceof String)) { // throw new ClassCastException("类型转换错误"); // } // if (!(o2 instanceof String)) { // throw new ClassCastException("类型转换错误"); // } // // 向下转型 // String s1 = (String) o1; // String s2 = (String) o2; // // 先按照长度比 // int num = s1.length() - s2.length(); // // 长度相同,再按照字典顺序比 // return num == 0 ? s1.compareTo(s2) : num; // } @Override public int compare(String s1, String s2) { // TODO Auto-generated method stub return (s1.length()-s2.length())==0?s1.compareTo(s2):(s1.length()-s2.length()); } }
实例代码2
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250package com.chd.day06; import java.util.Set; import java.util.TreeSet; public class Lambda01 { public static void main(String[] args) { // TODO Auto-generated method stub Set<Person> set = new TreeSet<>(); set.add(new Person("张三",23)); set.add(new Person("张三",23)); set.add(new Person("张三",24)); set.add(new Person("李四",24)); System.out.println(set); } } //匿名内部类:是为了创建一个实例:而这里需要的是重写这个方法 //class Person implements Comparable<Person>{ // public String name; // public int age; // public Person() {} // public Person(String name,int age) { // super(); // this.name=name;this.age=age; // // } // // @Override // public String toString() { // return "Person [name=" + name + ", age=" + age + "]"; // } // Comparable<Person> mi = new Comparable<Person>() { // // @Override // public int compareTo(Person person) { // // TODO Auto-generated method stub // int num = // return num==0?this.age-person.age:num; // } // // }; //} //Lambda表达式01 class Person { public String name; public int age; public Person() {} public Person(String name,int age) { super(); this.name=name;this.age=age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } Comparable<Person> person=(p)->{ int num = this.name.compareTo(p.name); return num==0?this.age-p.age:num; }; } /*加泛型 class Person implements Comparable<Person>{ public String name; public int age; public Person() {} public Person(String name,int age) { super(); this.name=name;this.age=age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } @Override public int compareTo( Person person) { int num = this.name.compareTo(person.name); return num==0?this.age-person.age:num; } } */ /*未加泛型 class Person implements Comparable{ public String name; public int age; public Person() {} public Person(String name,int age) { super(); this.name=name;this.age=age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } @Override public int compareTo( Object o) { if(!(o instanceof Person)) { throw new ClassCastException("类型转换错误"); } Person person = (Person) o; int num = this.name.compareTo(person.name); return num==0?this.age-person.age:num; } } */
最后
以上就是机智时光最近收集整理的关于Comparable和Comparator的区别以及Lambda表达式实现Comparable和Comparator的区别的全部内容,更多相关Comparable和Comparator内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复