Java 集合知识总结(二)

Set集合
Set和Collection基本相同,Set不允许有重复元素,集合内的元素是无序的。
1) HashSet类
特点:不能保证元素的排列顺序、不是同步的,多线程操作时需要通过代码保证其同步性、集合元素值可以为null。HashSet添加原始的时候根据元素的hashCode值来计算 它的存储位置,方便快速该元素。(hash算法的功能是保证快速查找被检索的对象,根据元素的hashcode值计算该元素的存储位置,从而快速定位元素位置。)
HashSet判断元素是否相等通过equals()方法相等,并且hashCode()方法返回值也必须相等。
代码示例:

/**
 * 重写equals方法,不重写hashcode方法
 * @author Administrator
 *
 */
public class Demo1 {
   @Override
   public boolean equals(Object obj) {
      return true;
   }
}

/**
 * 重写hashcode方法,不重写equals方法
 * @author Administrator
 *
 */
public class Demo2 {
   @Override
   public int hashCode() {
      return 1;
   }
}

/**
 * 重写equals方法和hashcode方法
 * @author Administrator
 *
 */
public class Demo3 {
   @Override
   public boolean equals(Object obj) {
      return true;
   }
   @Override
   public int hashCode() {
      return 2;
   }
}

public class HashSetDemo {
   public static void main(String[] args) {
      HashSet ss = new HashSet();

      // 插入equals方法相等的两个对象
      ss.add(new Demo1());
      ss.add(new Demo1());

      // 插入hashcode相等的两个对象
      ss.add(new Demo2());
      ss.add(new Demo2());

      // 插入equals和hashcode相等得对象
      ss.add(new Demo3());
      ss.add(new Demo3());

      // 输出结果
      System.out.println(ss);
   }
}

输出结果是:

[[email protected], [email protected], [email protected], [email protected], [email protected]]

上述输出结果表示HashSet判断元素相等必须equals方法和hashcode方法返回值必须相等,如demo3类

HashSet基本使用代码示例:

public class HashSetTest {
   public static void main(String[] args) {
      Set<String> hashSet = new HashSet<String>();

      // 添加元素
      hashSet.add("Set集合");
      hashSet.add("List集合");
      hashSet.add("Map集合");

      // 删除元素
      hashSet.remove("Map集合");

      // 遍历元素
      for (String string : hashSet) {
         System.out.println(string);
      }

      Iterator<String> iter = hashSet.iterator();
      while (iter.hasNext()) {
         String str= (String) iter.next();
         System.out.println(str);
      }
   }
}

2)TreeSet类

特点:使用红黑树结构存储元素、元素是有序的、支持两种排序方法,自然排序和定制排序,treeSet只能添加一种类型的对象存储元素时对象必须重写Comparable接口中得compareTo(Object obj)方法,否则引发ClassCastException异常。TreeSet集合判断两个对象是否相等,是通过compareTo(Object obj)方法比较是否返回0,返回0则相等,否则则不相等。

public class Test{
}

public class TreeSetTest {
   public static void main(String[] args) {
      Set treeSet = new TreeSet();
      treeSet.add(new Test());
      treeSet.add(new Test());
      System.out.println(treeSet);
   }
}

输出结果:

Exception in thread "main" java.lang.ClassCastException: com.zzl.demo.Test cannot be cast to java.lang.Comparable
   at java.util.TreeMap.compare(Unknown Source)
   at java.util.TreeMap.put(Unknown Source)
   at java.util.TreeSet.add(Unknown Source)
   at com.zzl.demo.TreeSetTest.main(TreeSetTest.java:10)

总结:因为TreeSet需要额外的红黑树算法来维护元素的次序,所以TreeSet的性能不如HashSet;当需要保持排序的Set时,使用TreeSet,否则建议使用HashSet。

时间: 2024-10-11 15:50:58

Java 集合知识总结(二)的相关文章

java基础知识(二)

1.关于static关键字总结: 1.不能在static修饰的方法中引用this变量,只能引用一些静态变量或方法,或new新的对象(可以定义局部变量). 简言之,静态方法或块中,只能引用静态的方法或变量. 2.类中的成员变量(static修饰)有缺省值,而类的定义的方法中的局部变量没有缺省值. 3.在类的构造器中,可以引用任何的静态或非静态的变量和方法,可以在非static方法中调用static方法. 4.static{}块中的代码在类装载中仅执行一次. 5.在7-7,A staticmetho

Java提高篇(三六)-----java集合细节(二):asList的缺陷

在实际开发过程中我们经常使用asList讲数组转换为List,这个方法使用起来非常方便,但是asList方法存在几个缺陷: 一.避免使用基本数据类型数组转换为列表 使用8个基本类型数组转换为列表时会存在一个比较有味的缺陷.先看如下程序: public static void main(String[] args) { int[] ints = {1,2,3,4,5}; List list = Arrays.asList(ints); System.out.println("list'size:&

JAVA集合类型(二)

JAVA集合类型 (现代的变量集群) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > List (接口) 特点: a. 先后顺序敏感.LIST结构中的元素必须分出谁先谁后. b. 能够反复.... 主要用来模拟队列(queue)等生活中对先后顺序敏感的应用场景. <1> ArrayLis

Java 集合系列之二:List基本操作

1. Java List 1. Java List重要观点 Java List接口是Java Collections Framework的成员. List允许您添加重复元素. List允许您拥有'null'元素. List接口在Java 8中有许多默认方法,例如replaceAll,sort和spliterator. 列表索引从0开始,就像数组一样. List支持泛型(类型的参数化),我们应尽可能使用它.将Generics与List一起使用将在运行时避免ClassCastException. 2

Java 集合知识总结

一.Java集合主要有collection和map集合两个接口,Java中的集合都是由这两个接口派生的. Collection接口和主要实现类如下: Collection主要API: boolean add(Object obj);添加元素 boolean addAll(Collection c);把集合C的元素添加到指定集合里. void clear();清除集合所有元素,集合长度变为0 boolean contains(Object o);集合中是否包含指定元素 boolean contai

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

Java集合知识总结详解

两大体系:Collection,Map 一.Collection: List 接口 : List:里面对象全部是有序的(通过三种方法来遍历) ArrayList,LinkedList,Vertor ArrayList:本质上 ArrayList 里维护的就是动态可变长度的数组. 常用方法:  增:add(4) 对象 位置+对象  集合 集合+位置.  删:remove(2)下标删对象,直接删对象.  改:set(1) 下标  对象.  查:get() 下标得对象, indexOf()对象得下标.

Java 集合系列(二)—— ArrayList

ArrayList ArrayList 是通过一个数组来实现的,因此它是在连续的存储位置存放对象的引用,只不过它比 Array 更智能,能够根据集合长度进行自动扩容. 假设让我们来实现一个简单的能够自动扩容的数组,我们最容易想到的点就是: add()的时候需要判断当前数组size+1是否等于此时定义的数组大小: 若小于直接添加即可:否则,需要先扩容再进行添加. 实际上,ArrayList的内部实现原理也是这样子,我们可以来研究分析一下ArrayList的源码 add(E e) 源码分析 1 /*

一、Java集合知识

集合: 存储对象数据的集合容器. 一.单列集合 ----------| Collection 单例集合 的根接口----------------| List 如果是实现了List接口的集合类,具备的特点: 有序,可重复.---------------------| ArrayList ArrayList底层是使用了Object数组实现 的. 特点: 查询速度快,增删慢.---------------------| LinkedList LinkedList底层是使用了链表数据结构实现的.特点: