Hatena::Groupseasarproject

S2できるかな?

2013-03-04

Java SE 6/7で、Collections#sortの挙動に悩む

例えば、こんなテストケースを書きます。

	@Test
	public void testSort() {
		List<Long> list = Arrays.asList(0L, 1L, 2L, 3L, 4L, 5L);
		Comparator<Long> comparator = new Comparator<Long>() {
			@Override
			public int compare(Long o1, Long o2) {
				return -1;
			}
		};
		Collections.sort(list, comparator);
		System.out.println(list.toString());
		assertThat(list.get(0), is(0L));
	}

Eclipseの「実行」→「実行構成」→「JRE」を選択し、実行JREをjdk1.6.0_xxにして、これを動かすと、テストが通り、コンソールには、以下のように表示されます。

[0, 1, 2, 3, 4, 5]

でも、実行JREをjdk1.7.0_xxにして実行すると、テストが通らず、コンソールには以下のように出ます。

[5, 4, 3, 2, 1, 0]

謎挙動…。

Area: API: Utilities

Synopsis: Updated sort behavior for Arrays and Collections may throw an IllegalArgumentException

Description: The sorting algorithm used by java.util.Arrays.sort and (indirectly) by java.util.Collections.sort has been replaced. The new sort implementation may throw an IllegalArgumentException if it detects a Comparable that violates the Comparable contract. The previous implementation silently ignored such a situation.

If the previous behavior is desired, you can use the new system property, java.util.Arrays.useLegacyMergeSort, to restore previous mergesort behavior.

Nature of Incompatibility: behavioral

RFE: 6804124

Java SE 7 and JDK 7 Compatibility

どうやらこれっぽい?

トラックバック - http://seasarproject.g.hatena.ne.jp/halflite/20130304