`

java集合框架中TreeSet的奇怪现象两个

    博客分类:
  • Java
阅读更多
先贴出输出:
TreeSet Integer
集合为:[-1, 0, 6, 8, 66]
更改temp为:55
集合为:[-1, 0, 6, 8, 66]集合并未因为temp的改变而改变,说明java对基本类型做了特殊处理
-----------------------------
TreeSet 自定义的Int
集合为:[6, 66]
treeSet.contains(6)=  true
treeSet.contains(66)=  true
更改temp为:-55
集合为:[6, -55]集合因为temp的改变而改变,但排序并未改变
treeSet.contains(6)=  false
treeSet.contains(66)=  false
treeSet.contains(-55)=  true


代码:
package Tests;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

public class testSet {
	public static void main(String[] args) {
//		 testHashSet();
		 testTreeSet();//数据自动排序
		 System.out.println("-----------------------------");
		testTreeSetInt();// 数据自动排序

		// testLinkedList();

	}

	private static void testLinkedList() {
		LinkedList<Object> list = new LinkedList<Object>();
		list.add("asdf");
		list.add("2");
		list.add(-1);
		list.add(55);
		System.out.println(list);
		Iterator<Object> it = list.iterator();
		while (it.hasNext()) {
			System.out.print(it.next() + "   ");
		}
		System.out.println();

		ListIterator<Object> lit = list.listIterator(1);// 从第2个开始
		System.out.print("前向:");
		while (lit.hasNext()) {// 前向
			System.out.print(lit.next() + "  ");
			// System.out.println("序号:"+lit.nextIndex());
		}
		System.out.println();

		System.out.print("后向:");
		while (lit.hasPrevious()) {// 后向
			System.out.print(lit.previous() + "  ");
			lit.previousIndex();
		}
		System.out.println();
	}

	private static void testTreeSet() {
		System.out.println("TreeSet Integer");
		SortedSet<Integer> treeSet = new TreeSet<Integer>();
		Integer temp = 66;
		treeSet.add(temp);
		treeSet.add(6);
		treeSet.add(8);
		treeSet.add(-1);
		treeSet.add(0);
		treeSet.add(6);
		treeSet.add(6);
		temp = 55;// 奇怪现象
		System.out.println("集合为:"+treeSet);
		System.out.println("更改temp为:"+temp);
		System.out.println("集合为:"+treeSet+"集合并未因为temp的改变而改变,说明java对基本类型做了特殊处理");
//		System.out.println("treeSet.contains(6)=  " + treeSet.contains(6));
//		for (int integer : treeSet) {
//			System.out.println(integer == 0);
//		}

	}

	private static void testTreeSetInt() {
		System.out.println("TreeSet 自定义的Int");
		SortedSet<Int> treeSet = new TreeSet<Int>();
		Int temp = new Int(66);
		treeSet.add(temp);
		treeSet.add(new Int(6));
//		 treeSet.add(new Int(-8));//是否注释以下几行6和temp的错误不同
//		 treeSet.add(new Int(100));
//		 treeSet.add(new Int(222));
//		 treeSet.add(new Int(333));
//		 treeSet.add(new Int(444));

		System.out.println("集合为:"+treeSet);
		System.out.println("treeSet.contains(6)=  " + treeSet.contains(new Int(6)));//正确
		System.out.println("treeSet.contains(66)=  " + treeSet.contains(new Int(66)));//出错

		temp.x = -55;// 奇怪现象
		System.out.println("更改temp为:"+temp.x);
		System.out.println("集合为:"+treeSet+"集合因为temp的改变而改变,但排序并未改变");
		System.out.println("treeSet.contains(6)=  " + treeSet.contains(new Int(6)));
		System.out.println("treeSet.contains(66)=  " + treeSet.contains(new Int(66)));
		System.out.println("treeSet.contains(-55)=  " + treeSet.contains(new Int(-55)));//出错

	}

	static class Int implements Comparable<Int> {
		int x;

		public Int(int x) {
			super();
			this.x = x;
		}

		@Override
		public int compareTo(Int o) {

			return x - o.x;
		}

		@Override
		public String toString() {
			return ""+x;
		}

	}

	private static void testHashSet() {
		System.out.print("hashSet");
		HashSet<Object> hset = new HashSet<Object>();
		hset.add(5);
		hset.add("asdf");
		hset.add(-9.999);
		hset.add(5);
		hset.add("asdf");
		hset.add(-9.999);
		System.out.println(hset);
	}
}

0
0
分享到:
评论
1 楼 clue 2010-06-21  
temp = 55;
这一句创建了一个新的Integer对象,而不是更改了旧的Integer对象的值。

第一个就直接更改了对象的属性
这时TreeSet不知道属性变了,所以它的次序也乱了
对应的contains算法也有可能出错(因为它认为当前已经排好序了)

相关推荐

    java 集合框架(TreeSet练习)

    在Java集合框架中,`TreeSet`是一个有序、不可重复的集合,它基于红黑树(Red-Black Tree)数据结构实现。`TreeSet`在许多场景下比其他集合如`ArrayList`或`HashSet`更有优势,因为它的元素总是按特定顺序排列,并且...

    java集合框架图

    此外,还有五个抽象类以及多个实现类,它们共同构成了Java集合框架的基础。 #### 二、核心接口介绍 1. **`Collection`接口**: - 这是最基本的接口,所有其他集合接口都是它的子类。它代表了一组对象,其中可能...

    Java集合框架总结

    Java集合框架是Java编程中不可或缺的一部分。通过理解这些接口和类的特性及其相互间的关系,可以更高效地编写出健壮的应用程序。同时,合理利用抽象类和迭代器等工具能够进一步提高代码的质量和可维护性。

    Java集合框架常见面试题.pdf

    Java 集合框架是 Java 编程语言中的一种基础数据结构,用于存储和操作对象的集合。 Java 集合框架提供了多种类型的集合类,包括 List、Set、Map 等,每种集合类都有其特点和使用场景。 List 集合 List集合是一种...

    学士后Java集合框架和泛型课后习题答案

    Java集合框架是Java编程语言中的一个核心组成部分,它为数据存储和操作提供了丰富的类库。在Java中,集合框架主要包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等)。这个...

    java集合框架全面进阶.pdf

    Java集合框架是Java编程语言中处理对象集合的一套接口和类。该框架提供了用于存储和操作集合的标准方法。在Java集合框架中,基本的接口分为两大类:Collection和Map。 Collection接口用于表示一组对象,称为其元素...

    集合框架学习笔记

    总的来说,Java集合框架是一个强大的工具箱,为开发者提供了丰富的数据结构和算法实现,是理解和掌握Java编程的关键。通过深入学习和实践,我们可以更加熟练地运用这些工具,解决各种复杂的问题。

    数据结构和Java集合框架

    数据结构和Java集合框架是Java编程中至关重要的概念,它们是高效编程和算法设计的基础。在Java中,数据结构指的是组织、存储和管理数据的方式,而集合框架则是一组接口和类,为处理各种数据结构提供了统一的API。 ...

    Java集合框架.pdf

    在Java集合框架中,还有两个非常重要的接口:Comparable和Comparator。它们用于对对象进行比较排序。实现了Comparable接口的类的对象可以使用Collections.sort()或Arrays.sort()方法进行自动排序。Comparator接口则...

    java 集合框架的原理及其使用

    Java集合框架是Java编程语言中一个非常重要的组成部分,它为开发者提供了存储和管理对象的统一方式。这个框架包括了一系列接口、抽象类以及实现类,帮助程序员处理各种数据结构,如列表、集合、映射等。 首先,我们...

    Java集合框架培训资料

    Java集合框架是Java编程语言中的核心组件之一,它为数据存储和管理提供了丰富的类和接口。这个培训资料将深入探讨Java集合框架的各个方面,帮助开发者更有效地利用这些工具。 首先,我们要了解Java集合框架的基本...

    用java的TreeSet写的一个求并集算法

    在Java编程中,集合框架是...在实际应用中,`TreeSet`不仅适用于求并集,还可以用于求交集、差集等集合操作,是Java集合框架中的一个重要工具。了解和熟练掌握`TreeSet`的特性和操作方法对于提升Java编程能力至关重要。

    java集合框架全面进阶

    Java集合框架是Java编程语言中不可或缺的一部分,它提供了一组接口和类,用于高效地存储、管理和操作数据。本篇文章将深入探讨Java集合框架的各个方面,帮助开发者从基础到高级全面掌握这一关键知识。 首先,我们要...

    Java 集合框架介绍.ppt

    Java集合框架是Java编程语言中的一个核心组件,它为开发者提供了高效、灵活的数据结构和算法。这个框架使得处理对象集合变得更加简单,同时也提高了代码的可读性和可维护性。以下是对Java集合框架的详细说明: 1. *...

    java集合框架详解以及区别

    Java集合框架是Java编程语言中一个重要的组成部分,它提供了一组高级数据结构,使得程序员能够高效地管理和操作数据。在本篇文章中,我们将深入探讨Java集合框架中的主要接口和类,以及它们之间的区别。 首先,Java...

    Java数据结构--13.Java8数据结构TreeSet.pdf

    在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了SortedSet和NavigableSet接口。...

    Java集合框架面试题

    "Java集合框架面试题" Java 集合框架是 Java 语言中的一组预定义类和接口的集合,用于存储和操作数据。下面是 Java 集合框架的知识点总结: 1. Java 集合类主要有两大分支:Collection 接口和 Map 接口。...

Global site tag (gtag.js) - Google Analytics