`

JAVA基础 之 Set

    博客分类:
  • java
 
阅读更多

概述:

    1.Set不允许重复数据,判断重复标准:equals方法

    2.HashSet 

       1.无序(序号的序),允许存在null

       2.hashCode值决定它在HashSet中的位置,通过hashCode值算出存储位置

       3.判断重复标准:equals方法 和 hashCode方法 同时相等

             a.如果equals相同,hashCode不同,两个相同值的对象存在不同的位置(原因见第二点)

             b.如果hashCode相同,equals不同,采用链式结构将2个对象存在同一位置(桶的概念,bucket),这会导致性能下降

       4.两个概念初始容量 和 加载因子(hashSet尚未爆仓(只需达到初始容量*加载因子,即16*0.75),系统会动态扩大容量)

       5.没有实现线程同步 如果需要同步操作(多线程安全)请使用

 

Set s = Collections.synchronizedSet(new HashSet(...));

       6.迭代过程中必须使用迭代器自身的remove方法删除数据,否则会出异常

    3.LinkedHashSet

       1.他是HashSet子类。

       2.它以链表的方式维护元素的次序,所以它会按照添加顺序访问集合中的对象。

       3.顺序遍历的时候性能比HashSet好,但是其他涉及到元素位置变化的操作性能就不如HashSet了。(数据结构知识)

       4.虽然它有一定的访问顺序,但是它和List还是有区别的,最明显的一点:它仍然不能有重复对象。

    4.TreeSet

       1.SortedSet接口的实现类,它保持了排序状态。

       2.方法:第一个、前一个、后一个、最后一个、范围截取、小于某元素、大于或者等于某元素

       3.采用红黑树的数据结构来存储数据

       4.支持2种排序方式:自然排序 和 定制排序

          1.自然排序

             a.调用Comparable接口的compareTo方法进行比较

             由于需要排序,进入TreeSet的对象需要是同一个类的实例,否则在比较的时候会出现类转化异常。

           2.定制排序

              实现Comparator接口(见例子)

       5.如果碰到不能排序的对象加入到TreeSet中 会出现异常(见例子)

    5.EnumSet

       1.性能相对不错的 枚举Set

       2.不多讲,有兴趣可以看看api

    6.HashSet、TreeSet、EnumSet都是线程不安全的

 

PS:

    1.Set不仅仅如此,这里只做基本的阐述,更加详细的请参见 JAVA API

    2.初学者挑能看懂的看吧,基础的操作其实还是比较简单的

 

package com.cxy.collection;

import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

/**
 * @author cxy
 */
public class SetTest
{
	public static void main(String[] args)
	{
		Set s = new HashSet();
		s.add(null);
		s.add(new A());
		s.add(new A());
		//由于2个A对象的hashCode返回的都是1,并且equals方法返回的是true,所以这两个对象只能存在1个
		s.add(new B());
		s.add(new B());
		//B对象的equals方法返回的永远是false,所以这两个B对象都能留下
		s.add(new C());
		s.add(new C());
		//2个C对象hashCode返回的都是2,并且equals方法返回的是true,并且hashCode没有和以往对象相等的,所以留住1个C对象
		System.out.println(s); //通过打印结果可以看出 HashSet无序性。
		
		LinkedHashSet<String> lhs = new LinkedHashSet<String>();
		lhs.add("world");
		lhs.add("said");
		lhs.add("hello");
		System.out.println(lhs);  //按照加入顺序打印
		
		TreeSet ts=new TreeSet();
		ts.add(100);
		ts.add(64);
		ts.add(-100);
		ts.add(0);
		System.out.println(ts);  //发现打印出来的已然是有序状态
		System.out.println("第一个:"+ts.first()); 
		System.out.println("最后一个:"+ts.last()); 
		System.out.println("小于64的最大元素(64前面的):"+ts.lower(64));  
		System.out.println("大于0的最小元素(0后面的):"+ts.higher(0));  
		System.out.println("0~100之间的:"+ts.subSet(0, 100));  //半闭半开区间
		System.out.println("小于64的集合"+ts.headSet(64));
		System.out.println("大于或者等于0的集合"+ts.tailSet(0));
		
		try
		{
			TreeSet errorSet=new TreeSet();
			errorSet.add(new error());
			errorSet.add(new error());
		}catch(Exception e)
		{
			System.out.println("由于error类没有实现Comparable接口的compareTo方法,所以这里出现类型转换的异常");
		}
		
		try
		{
			TreeSet errorSet1=new TreeSet();
			errorSet1.add(123);
			errorSet1.add("asd");
		}catch(Exception e)
		{
			System.out.println("不同类实例的比较 会出类转换异常");
		}
		
		//一个定制排序的set
		TreeSet myStyleSet=new TreeSet(new Comparator()
		{
			@Override
			public int compare(Object o1, Object o2)
			{
				return 0;  //一个永远平等的集合~ 你懂的~
			}
			
		});  
	}
}

class A
{
	@Override
	public int hashCode()
	{
		return 1;
	}
	
	@Override
	public boolean equals(Object obj)
	{
		return true;
	}
}

class B
{
	@Override
	public int hashCode()
	{
		return 1;
	}
	
	@Override
	public boolean equals(Object obj)
	{
		return false;
	}
}

class C
{
	@Override
	public int hashCode()
	{
		return 2;
	}
	
	@Override
	public boolean equals(Object obj)
	{
		return true;
	}
}

//一个没有实现比较的类
class error
{
	
}

 

相关文章连接:

《JAVA基础 之 Collection》

《JAVA基础 之 List》

 

声明:

1.原创文章,转载请标明并加本文连接。

2.更详尽的API请参见  http://docs.oracle.com/javase/7/docs/api/

3.文章反映个人愚见,如有异议欢迎讨论指正 

 

     

0
1
分享到:
评论

相关推荐

    《partner4java 讲述 java基础》之第一步:list 、set 、map 粗浅性能对比分析 - java相关技术(partner4java专栏)

    《partner4java 讲述 java基础》之第一步:list 、set 、map 粗浅性能对比分析 - java相关技术(partner4java专栏)

    Java基础知识点总结.docx

    二、 Java语法基础 5 数据类型 5 运算符号 14 语句 15 函数 15 方法重载(Overloadjing)与重写(Overriding) 16 数组 17 总结 18 三、 常见关键字 20 四、 面向对象★★★★★ 21 五、 封装(面向对象特征之一)★...

    corejava基础重要知识点总结

    set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45 set PATH=%JAVA_HOME%\bin *:%%表示取中间环境变量的值 *:环境变量的名字尽量大写 *:当我们需要给一个环境变量设置多个值的时候 中间需要用;隔开 2:...

    java基础集合篇.wps

    整理了一下java基础的集合部分,有list,map,set等及其相关。

    Java-Java集合体系-List-Set

    Java-Java集合体系-List-Set 内容概要:总结了Java集体...适合人群:有编程基础和Java基础的小伙伴 适合场景:开发和面试中必备,Java集合体系是许多框架的基础,在开发中大量使用,面试题也是必问的题目,非常重要。

    Java 基础面试题

    该文档主要整理了常见的Java基础面试题,包含以下内容: 1. 抽象类和接口的区别 2. 什么时候使用抽象类,什么时候使用接口 3. 八大基本数据类型,所占字节数 4. List、Set、Map的区别 5. 什么情况下使用List、...

    Java 基础核心总结 +经典算法大全.rar

    《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else ...

    JAVA基础课程讲义

    SET接口 138 Map接口 138 Iterator接口 139 遍历集合 140 Collections工具类 141 Comparable接口 141 equals和hashcode方法 143  泛型 144 思考作业 145 上机作业 145 第八章 IO技术 146 为什么需要学习IO技术 146...

    Java基础(韩顺平版)笔记详

    韩顺平版Java基础笔记是一套详尽的Java入门教程,内容包括: Java语言概述和环境搭建 基本数据类型、变量和运算符 控制语句:条件语句和循环语句 数组和字符串处理 面向对象编程:类和对象、继承、封装、多态 异常...

    Java基础最全笔记文档

    Java基础笔记分为 Java基础篇 和 Java加强篇 Java基础篇包括: 1. Java环境搭建、Java快速入门、IDEA开发工具 2. Java基础语法、类型转换、运算符、Scanner 3. 分支结构、循环结构、随机数 4. 数组详解、Debug工具...

    java基础.txt

    java中的类只有单继承,接口具有多继承 继承具有单根性,一个类只能有一个父类 不能继承父类的有三种情况 · 用private修饰的属性和方法 · 构造方法 · 用protected修饰的属性和方法,父类和子类不在同一包下...

    Java基础知识点.html

    Java基础思维导图对应html版本资源: 类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap ...

    java面试题大全-基础方面

    Java基础方面: 1、作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ ...

    JAVA SE 开发手册.CHM

    15、JAVA集合框架之Set接口、HashSet类、TreeSet类 16、JAVA集合框架之Map接口、HashMap类、Trelap类、Hashtable类 17、JAVA异常Exception 18、JAVA线程之基础介绍 19、I0流之基本简介 20、I0流之字符流、字节...

    计算机后端-Java-Java核心基础-第25章 集合02 04. 复习:Set接口.avi

    计算机后端-Java-Java核心基础-第25章 集合02 04. 复习:Set接口.avi

    【IT十八掌徐培成】Java基础第10天-05.set特点与操作.zip

    【IT十八掌徐培成】Java基础第10天-05.set特点与操作.zip

    Java领域基础部分JavaSE笔记

    职业开发者:需要回顾或巩固Java基础知识的专业人士。 使用场景及目标 学习基础:为初学者提供一个全面的Java入门指南。 课程辅助:作为大学课程或在线教程的补充材料。 技能提升:帮助有经验的开发者回顾和加强Java...

    Java基础语法面试题.docx

    Java基础语法面试题资源通常是指帮助准备Java编程面试的问题集合,涵盖了Java编程语言的基础概念、语法、特性和常见问题。这些资源可以帮助面试者巩固和扩展他们的Java知识,准备应对面试过程中的技术问题。 这些...

    计算机后端-Java-Java核心基础-第24章 集合01 20. Set接口实现类的对比.avi

    计算机后端-Java-Java核心基础-第24章 集合01 20. Set接口实现类的对比.avi

    计算机后端-Java-Java核心基础-第25章 集合02 06. Set课后两道面试题.avi

    计算机后端-Java-Java核心基础-第25章 集合02 06. Set课后两道面试题.avi

Global site tag (gtag.js) - Google Analytics