简介

        本文用示例介绍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]