`

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提供了一个Comparable接口,该接口里定义了一个compareTo(Objectobj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大小。...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索策略  16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多...

    List,Set练习题(no TreeSet).docx

    在java集合框架中,List和Set是两个非常重要的接口,分别用于存储有序和无序的集合。下面我们将通过四个练习题来深入了解List和Set的使用。 练习题1:获取10个1至20的随机数 在这个练习题中,我们需要编写一个程序,...

    java编程宝典

    3集合框架 11 3.1 如何遍历一个List/Set(foreach、Iterator、Lambda表达式) 11 3.2 如何遍历一个Map(foreach、Iterator、Lambda表达式) 11 3.3 如何实现一个Set&lt;Student&gt; set = new TreeSet(); 12 3.4 如何实现...

    java经典选择题题库及答案.docx

    Java语言的集合框架是指Java语言提供的一组用于存储和处理数据的类和接口。集合框架包括ArrayList、LinkedList、HashSet、TreeSet等。ArrayList是Java语言提供的一种数组列表,LinkedList是Java语言提供的一种链表。...

    Java面试题,冲冲冲!.rar

    List、Set、Queue和Map是Java集合框架中的四个主要接口,它们各自具有不同的特点和用途。 1. List(列表): - 允许重复元素。 - 具有按照元素插入顺序维护的有序集合。 - 可以通过索引访问和操作元素。 - 常见实现类...

    Java面试宝典-经典

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试宝典2010版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    java面试题大全(2012版)

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    初级java笔试题-BSc-University-Coursework::desktop_computer:我大学期间所有课程项目的集合

    集合框架中的TreeSet的传统二叉树进行比较。 它在内部实现为二叉搜索树。 任务 实现扩展二叉树 在根部插入元素以获得更好的性能 与红黑树( TreeSet )进行比较 实现序列化 蛋滴。 移动游戏开发模块是针对具有更传统...

    java基础案例与开发详解案例源码全

    11.1 Java集合框架概述264 11.2 Collection接口264 11.2 Set接口实现类266 11.2.1 实现类HashSet267 11.2.2 实现类LinkHashSet270 11.2.3 实现类TreeSet272 11.3 List接口实现类277 11.3.1 实现类ArrayList277 ...

    最新Java面试宝典pdf版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试笔试资料大全

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    java面试宝典2012

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 40 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    java面试宝典2012版.pdf

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 ...

    JAVA面试宝典2010

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试宝典2012新版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试宝典2012版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

Global site tag (gtag.js) - Google Analytics