`
lzy19881227
  • 浏览: 13393 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]JAVA基础 之 Set

    博客分类:
  • Java
 
阅读更多

[转]JAVA基础 之 Set

概述:

    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.没有实现线程同步 如果需要同步操作(多线程安全)请使用

 

Java代码   收藏代码
  1. 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.初学者挑能看懂的看吧,基础的操作其实还是比较简单的

 

Java代码   收藏代码
  1. package com.cxy.collection;  
  2.   
  3. import java.util.Comparator;  
  4. import java.util.HashSet;  
  5. import java.util.LinkedHashSet;  
  6. import java.util.Set;  
  7. import java.util.TreeSet;  
  8.   
  9. /** 
  10.  * @author cxy 
  11.  */  
  12. public class SetTest  
  13. {  
  14.     public static void main(String[] args)  
  15.     {  
  16.         Set s = new HashSet();  
  17.         s.add(null);  
  18.         s.add(new A());  
  19.         s.add(new A());  
  20.         //由于2个A对象的hashCode返回的都是1,并且equals方法返回的是true,所以这两个对象只能存在1个  
  21.         s.add(new B());  
  22.         s.add(new B());  
  23.         //B对象的equals方法返回的永远是false,所以这两个B对象都能留下  
  24.         s.add(new C());  
  25.         s.add(new C());  
  26.         //2个C对象hashCode返回的都是2,并且equals方法返回的是true,并且hashCode没有和以往对象相等的,所以留住1个C对象  
  27.         System.out.println(s); //通过打印结果可以看出 HashSet无序性。  
  28.           
  29.         LinkedHashSet<String> lhs = new LinkedHashSet<String>();  
  30.         lhs.add("world");  
  31.         lhs.add("said");  
  32.         lhs.add("hello");  
  33.         System.out.println(lhs);  //按照加入顺序打印  
  34.           
  35.         TreeSet ts=new TreeSet();  
  36.         ts.add(100);  
  37.         ts.add(64);  
  38.         ts.add(-100);  
  39.         ts.add(0);  
  40.         System.out.println(ts);  //发现打印出来的已然是有序状态  
  41.         System.out.println("第一个:"+ts.first());   
  42.         System.out.println("最后一个:"+ts.last());   
  43.         System.out.println("小于64的最大元素(64前面的):"+ts.lower(64));    
  44.         System.out.println("大于0的最小元素(0后面的):"+ts.higher(0));    
  45.         System.out.println("0~100之间的:"+ts.subSet(0100));  //半闭半开区间  
  46.         System.out.println("小于64的集合"+ts.headSet(64));  
  47.         System.out.println("大于或者等于0的集合"+ts.tailSet(0));  
  48.           
  49.         try  
  50.         {  
  51.             TreeSet errorSet=new TreeSet();  
  52.             errorSet.add(new error());  
  53.             errorSet.add(new error());  
  54.         }catch(Exception e)  
  55.         {  
  56.             System.out.println("由于error类没有实现Comparable接口的compareTo方法,所以这里出现类型转换的异常");  
  57.         }  
  58.           
  59.         try  
  60.         {  
  61.             TreeSet errorSet1=new TreeSet();  
  62.             errorSet1.add(123);  
  63.             errorSet1.add("asd");  
  64.         }catch(Exception e)  
  65.         {  
  66.             System.out.println("不同类实例的比较 会出类转换异常");  
  67.         }  
  68.           
  69.         //一个定制排序的set  
  70.         TreeSet myStyleSet=new TreeSet(new Comparator()  
  71.         {  
  72.             @Override  
  73.             public int compare(Object o1, Object o2)  
  74.             {  
  75.                 return 0;  //一个永远平等的集合~ 你懂的~  
  76.             }  
  77.               
  78.         });    
  79.     }  
  80. }  
  81.   
  82. class A  
  83. {  
  84.     @Override  
  85.     public int hashCode()  
  86.     {  
  87.         return 1;  
  88.     }  
  89.       
  90.     @Override  
  91.     public boolean equals(Object obj)  
  92.     {  
  93.         return true;  
  94.     }  
  95. }  
  96.   
  97. class B  
  98. {  
  99.     @Override  
  100.     public int hashCode()  
  101.     {  
  102.         return 1;  
  103.     }  
  104.       
  105.     @Override  
  106.     public boolean equals(Object obj)  
  107.     {  
  108.         return false;  
  109.     }  
  110. }  
  111.   
  112. class C  
  113. {  
  114.     @Override  
  115.     public int hashCode()  
  116.     {  
  117.         return 2;  
  118.     }  
  119.       
  120.     @Override  
  121.     public boolean equals(Object obj)  
  122.     {  
  123.         return true;  
  124.     }  
  125. }  
  126.   
  127. //一个没有实现比较的类  
  128. class error  
  129. {  
  130.       
  131. }  
分享到:
评论

相关推荐

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

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

    Java基础 学习笔记 Markdownr版

    2. 集合:在13集合.md中,详细讲解了Java集合框架,包括ArrayList、LinkedList、HashSet、HashMap等基本集合类的使用,以及List、Set、Map接口的特性。此外,还可能涉及泛型的概念,泛型(14泛型.md)提高了代码的...

    java基础之集合

    ### Java基础之集合详解 #### 一、集合简介 ##### 1.1 集合定义 集合在Java中是一种容器,它可以存储任意数量的具有共同属性的对象。这些对象可以是不同类型的数据,如整数、字符串等。 ##### 1.2 集合作用 - **...

    Java基础尚硅谷宋红康学习笔记

    【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性,成为跨平台应用开发的首选语言。Java的基础部分主要包括...

    Java基础课件 全套pdf版 java培训

    "Java基础课件 全套pdf版 java培训"提供了一套完整的初级到中级Java学习资源,适合初学者或希望巩固基础知识的开发者。这些教程涵盖了Java语言的基础到一些进阶主题,以下是各章节的主要知识点: 1. **Java基本语法...

    java基础资料

    "java基础资料"涵盖的应该是Java编程的基础概念和技能,适合初学者入门。以下是基于这个主题的详细知识点讲解: 1. **Java语言简介**:Java是由James Gosling在1995年创建的,它的设计目标是“一次编写,到处运行”...

    java课件 java基础教程

    Java集合框架是处理对象组的重要工具,包括List(有序、可重复,如ArrayList和LinkedList)、Set(无序、不重复,如HashSet和TreeSet)和Map(键值对,如HashMap和TreeMap)等接口及其实现类。 6. **输入/输出(I/O...

    java基础PPTJava基础PPT

    这份"Java基础PPT"涵盖了Java编程的基础知识,对于初学者或希望巩固基础知识的开发者来说是宝贵的资源。PPT的重复标题暗示内容可能深入且全面,旨在系统地讲解Java的核心概念。 在Java的基础学习中,首先会接触到的...

    Java基础教程完整版

    Java基础教程完整版 Java基础教程完整版是JAVE_LOVER作者提供的一系列Java教程,总共包含18个章节,涵盖了JavaSE基本...Java基础教程完整版涵盖了JavaSE基本知识点、UML建模、单元测试等内容,是Java学习的不二之选。

    java基础练习题 (目前到集合内含三个小综合案例)

    这份"java基础练习题(目前到集合内含三个小综合案例)"涵盖了Java的基础知识,旨在帮助学习者巩固并提升Java编程技能。从JDK(Java Development Kit)入门到集合框架的学习,这是一个全面了解和实践Java编程的重要...

    Java基础知识笔试题及答案

    Java 集合框架是 Java 语言的一个重要组件,提供了一些预定义的集合类,例如 List、Set 和 Map。这些集合类可以用于存储和操作大量数据,提高程序的效率和可读性。 八、Java 泛型 Java 泛型是一种类型参数化机制,...

    java基础所有例子

    "java基础所有例子"这个主题涵盖了Java语言的核心概念和基本用法。以下是对这些基础概念的详细阐述: 1. **变量与数据类型**:Java有八种基本数据类型,包括整型(byte, short, int, long)、浮点型(float, double...

    黑马程序员java基础试题、笔记

    "黑马程序员java基础试题、笔记"这个压缩包资源为Java初学者和希望加入"黑马程序员"培训课程的学员提供了丰富的学习材料。这些资源包括面试问题合集、整理的资料、Android面试题、学员入学面试总结、面试技巧、必须...

    Java基础案例教程(第2版)_PPT.zip

    《Java基础案例教程(第2版)》是一本旨在教授初学者Java编程基础知识的教材,其PPT形式的压缩包提供了清晰、直观的教学材料。在深入探讨这些知识点之前,我们首先了解一下Java语言的基础概念。 Java是一种面向对象...

    Java基础案例教程(第2版)-课后习题答案.zip

    《Java基础案例教程(第2版)》是一本专为初学者设计的教材,旨在帮助学习者掌握Java语言的基础知识,并通过实践案例加深理解。本教程的课后习题答案包含在"Java基础案例教程(第2版)-课后习题答案.zip"压缩包中,...

    java基础教学全套课件_pdf_ppt

    本套Java基础教学课件旨在全面介绍Java的核心概念和技术,帮助初学者建立起坚实的基础,逐步掌握编程技能。 首先,Java语言的基础部分涵盖了变量、数据类型、运算符和控制流程。在Java中,变量是用来存储数据的容器...

    java基础课件 ppt

    这份"java基础课件 ppt"包含了学习Java基础知识的关键内容,对于初学者或是需要巩固基础的开发者来说,是一份宝贵的学习资源。 首先,Java的基础部分通常涵盖以下几个核心概念: 1. **Java环境设置**:学习Java的...

    Java基础入门源代码

    这个"Java基础入门源代码"集合应该是为了帮助初学者理解和实践Java编程基础而设计的。让我们详细探讨一下Java语言的基础知识,以及如何通过源代码学习。 1. **基本语法**:Java的语法与C++和C#类似,它包括类、对象...

    java基础思维导图

    Java基础是编程学习的重要部分,它涵盖了语言的基本概念、语法结构和核心特性。这份"Java基础思维导图"应该是为了帮助初学者系统地理解和掌握Java编程的基础知识而设计的。以下是一些关键的Java基础知识点: 1. **...

Global site tag (gtag.js) - Google Analytics