简介
本文用示例介绍Java中的Objects的用法。
Java中的Collections是操作对象的工具类,有如下功能:排序、同步控制、生成不可变集合等。
排序
主要针对List接口
方法 | 说明 |
reverse(List list) | 反转指定List集合中元素的顺序 |
shuffle(List list) | 对List中的元素进行随机排序(洗牌) |
sort(List list) | 对List里的元素根据自然升序排序 |
sort(List list, Comparator c) | 自定义比较器进行排序 |
swap(List list, int i, int j) | 将指定List集合中i处元素和j出元素进行交换 |
rotate(List list, int distance) | 将所有元素向右移位指定长度。若distance等于size那么结果不变 |
实例
package org.example.a;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
System.out.println("原始顺序:\t\t" + list);
list = Arrays.asList("a", "b", "c", "d", "e");
Collections.reverse(list);
System.out.println("reverse后顺序:\t" + list);
list = Arrays.asList("a", "b", "c", "d", "e");
Collections.shuffle(list);
System.out.println("shuffle后顺序:\t" + list);
list = Arrays.asList("a", "b", "c", "d", "e");
Collections.swap(list, 1, 3);
System.out.println("swap后顺序:\t" + list);
list = Arrays.asList("a", "b", "c", "d", "e");
Collections.sort(list);
System.out.println("sort后顺序:\t" + list);
list = Arrays.asList("a", "b", "c", "d", "e");
Collections.rotate(list, 1);
System.out.println("rotate后顺序:\t" + list);
}
}
执行结果
原始顺序: [a, b, c, d, e]
reverse后顺序: [e, d, c, b, a]
shuffle后顺序: [b, e, a, c, d]
swap后顺序: [a, d, c, b, e]
sort后顺序: [a, b, c, d, e]
rotate后顺序: [e, a, b, c, d]
查找/替换
主要针对Collection接口。
方法 | 说明 |
binarySearch(List list, Object key) | 使用二分搜索法,以获得指定对象在List中的索引,前提是集合已排序 |
max(Collection coll) | 返回最大元素 |
max(Collection coll, Comparator comp) | 根据自定义比较器,返回最大元素 |
min(Collection coll) | 返回最小元素 |
min(Collection coll, Comparator comp) | 根据自定义比较器,返回最小元素 |
fill(List list, Object obj) | 使用指定对象填充 |
frequency(Collection Object o) | 返回指定集合中指定对象出现的次数 |
replaceAll(List list, Object old, Object new) | 替换 |
实例
package org.example.a;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
System.out.println("原始list:" + list);
System.out.println("max:" + Collections.max(list));
System.out.println("min:" + Collections.min(list));
System.out.println("frequency:" + Collections.frequency(list, "a"));
Collections.replaceAll(list, "a", "aa");
System.out.println("replaceAll之后:" + list);
// 如果binarySearch的对象没有排序的话,搜索结果是不确定的
Collections.shuffle(list);
System.out.println("sort之前:" + Collections.binarySearch(list, "c"));
// sort之后,结果出来了
Collections.sort(list);
System.out.println("sort之后:" + Collections.binarySearch(list, "c"));
Collections.fill(list, "A");
System.out.println("fill:" + list);
}
}
执行结果
原始list:[a, b, c, d, e]
max:e
min:a
frequency:1
replaceAll之后:[aa, b, c, d, e]
sort之前:-1
sort之后:2
fill:[A, A, A, A, A]
同步控制
简介
Collections工具类中提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而解决多线程并发访问集合时线程的安全问题。HashSet、ArrayList、HashMap都是线程不安全的,如果需要考虑同步,则使用这些方法。这些方法主要有:synchronizedSet、synchronizedSortedSet、synchronizedList、synchronizedMap、synchronizedSortedMap。
特别需要指出的是,在使用迭代方法遍历集合时需要手工同步返回的集合。
Map m = Collections.synchronizedMap(new HashMap());
...
Set s = m.keySet(); // Needn't be in synchronized block
...
synchronized (m) { // Synchronizing on m, not s
Iterator i = s.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
不可变集合
方法 | 说明 |
emptyXxx() 或EMPTY_XXX 或EmptyXxx() | 返回一个空的不可变的集合对象。 只读的空LIST 集合:Collections.EMPTY_LIST,Collections.emptyList(),new EmptyList(); 只读的空Set 集合: Collections.EMPTY_SET,Collections.emptySet(), new EmptySet(); 只读的空MAP集合: Collections.EMPTY_MAP,Collections.emptyMap(), new EmptyMap(); |
singletonXxx() | 返回一个只包含指定对象的,不可变的集合对象 |
unmodifiableXxx() | 返回指定集合对象的不可变视图 |
实例
package org.example.a;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
System.out.println("list:" + list);
List<String> unmodList = Collections.unmodifiableList(list);
unmodList.add("fg");
System.out.println("unmodiList:" + unmodList);
}
}
执行结果
list:[a, b, c, d, e]
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
at org.example.a.Demo.main(Demo.java:12)
其他
方法 | 说明 |
disjoint(Collection<?> c1, Collection<?> c2) | 如果两个指定 collection 中没有相同的元素,则返回 true。 |
addAll(Collection<? super T> c, T... a) | 将所有指定元素添加到指定 collection 中。示范: Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon"); |
Comparator<T> reverseOrder(Comparator<T> cmp) | 返回一个比较器,它强行反转指定比较器的顺序。如果指定比较器为 null,则此方法等同于 reverseOrder()(换句话说,它返回一个比较器,该比较器将强行反转实现 Comparable 接口那些对象 collection 上的自然顺序)。 |
实例
package org.example.a;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
Collections.addAll(list1, "fg", "hi");
Collections.addAll(list2, "e", "hi");
System.out.println(Collections.disjoint(list, list1));
System.out.println(Collections.disjoint(list, list2));
Collections.sort(list, Collections.reverseOrder());
System.out.println(list);
}
}
执行结果
true
false
[e, d, c, b, a]