java集合 2

 这几天看了下 HashSet 和 HashMap,谈谈我的理解吧,如果有错误的话,请麻烦指出纠正,谢谢!


1.1 HashSet

    1.11 HashSet是实现Set接口的集合类,具备的特点是:

(1)遍历元素时不保证元素返回的顺序

(2)不允许重复元素,这里的“重复”元素指两个对象具有相同的散列码并且用equals()方法比较后返回true

(3)允许包含空元素

(4)底层是哈希表

1.12 HashSet存储元素的原理

以上拆自《Java高级编程》中对HashSet的描述。

(在Set中添加对象时,使用该对象的散列码来选择放置对象的"桶"。不相等的对象可能有不同的散列码但仍放在同一个桶中,而判断为相等的两个对象总是放在同一个桶中。这点极为重要,因为判断Set中是否包含指定对象时,会使用该对象的散列码来判断该对象所在的桶,并遍历该桶中的对象同时使用equals()方法判断该桶是否已经包含该对象。换句话说,用hashcode()方法指定对象所在的对象子集合(桶),然后根据equals()检查该子集合并判断是否找到指定的对象。)

根据我的理解,我用以下文字描述出来,希望我理解没有错误

当往HashSet添加元素的时候,首先会调用元素的hashCode方法得到对象的哈希码值,通过值计算出该元素所在哈希表中的位置

(1)如果算出的位置没有任何值,那么该元素可以添加到哈希表中

(2)如果算出该位置已经存在其他元素,则调用equlas()方法与该位置上的元素比较,如果返回false,则添加进去。


    假设有这么几种情况,通过重写HashCode和equlas()试试看    

1.hashCode相同且equals()返回为真

public class HashSetDemo {

	public static void main(String[] args) {
		HashSet<Person> set=new HashSet();
		Person p1=new Person(20, "小瀚", 20);
		Person p2=new Person(20, "小瀚", 20);
		set.add(p1);
		set.add(p2);
		System.out.println("p1 hashCode="+p1.hashCode()+"    "+"p2 hashCode="+p2.hashCode());
		System.out.println("Size="+set.size()+ "  Set="+set);
	}

}

class Person {
	private int id;
	private String name;
	private int age;

	public Person(int id,String name, int age) {
		this.id=id;
		this.name = name;
		this.age = age;
	}

	@Override
	public int hashCode() {
		return id;
	}

	@Override
	public boolean equals(Object obj) {
		Person p=(Person) obj;
		return name.equals(p.name) && age==p.age;
	}
	@Override
	public String toString(){
		return "id="+id+" name="+name+" age="+age;
	}
}

输出结果为:
            p1 hashCode=20    p2 hashCode=20
            Size=1Set=[id=20 name=小瀚 age=20]

2.hashCode相同但equals()返回假

		HashSet<Person> set=new HashSet();
		Person p1=new Person(20, "小瀚", 20);
		Person p2=new Person(20, "小露", 20);
		set.add(p1);
		set.add(p2);
		System.out.println("p1 hashCode="+p1.hashCode()+"    "+"p2 hashCode="+p2.hashCode());
		System.out.println("Size="+set.size()+ "  Set="+set);

输出结果为:
        p1 hashCode=20    p2 hashCode=20
        Size=2  Set=[id=20 name=小露 age=20, id=20 name=小瀚 age=20]	

由上面结果我们可知,当HashCode()相同的时候,会去调用equlas()方法来比较元素,从而判断是否将元素添加进去

1.2 HashMap

  Set是对象的集合,而Map不但是对象的集合,并且每个对象都有一个对应值。也就是说,映射(Map)表示一组键值对,键就是集合中元素。其中HashMap是实现Map接口的一个类,具备的特点是:

(1)线程不安全,存取速度快。底层是以哈希表实现的.

(2)不允许重复元素。

        Map<Integer,String> map=new HashMap<Integer,String>();
        map.put(1,"小瀚");
        map.put(2,"小露");
        String s=map.get(3);
        
        //这行代码在映射中查找键3,如果有该键,则返回对应的值,如果没有该键,则返回空。这种查找功能极为有用,Map中是根据键查找值无需遍历映射中的键表,而是利用hashCode定位值所在的哈希表的位置,因此即使非常大的Map集合中也能进行快速查找。

下面的代码演示了遍历Map的几种方式

		Map<String,String> map=new HashMap<String,String>();
		map.put("a", "aa");
		map.put("b", "bb");
		map.put("c", "cc");

		//第一种  entrySet()  返回此映射中包含的映射关系的 Set 视图。
		for(Entry<String, String>entry:map.entrySet()){
			System.out.println("key="+entry.getKey()+"   value="+entry.getValue());
		}

		System.out.println("===========华丽的分割线===============");

		//第二种 keySet 返回此映射中包含的键的 Set 视图。
		for(String s : map.keySet()){
			System.out.println("key="+s+" value="+map.get(s));
		}

		System.out.println("===========华丽的分割线===============");
		//第三种 value返回此映射中包含的值的 Collection 视图。
		for(String s:map.values()){
			System.out.println("value="+s);
		}

这是我对集合的一点点了解,不对的地方请多多指教!

时间: 2024-10-07 21:34:03

java集合 2的相关文章

Java—集合框架List

集合的概念 现实生活中:很多的事物凑在一起 数学中的集合:具有共同属性的事物的总和 Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象 集合的作用 在类的内部,对数据进行组织(针对作用与意义一样的属性,将他们放到一个集合中) 简单而快速的搜索大数量的条目 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中快速的插入或删除有关元素 有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型 与数组相比 数组的长度

Java 集合

在Java Collections Framework中,不同类型的集合使用不同类型的数据结构以不同的方式存储它们的元素. 集合框架提供了遍历集合的以下方法: 使用迭代器 使用for-each循环 使用forEach()方法 使用迭代器 迭代器可以对集合执行以下三个操作: 检查是否有尚未访问的元素. hasNext() 检查是否有下一个访问的元素. next() 删除集合的最后访问元素. remove() 例子1 使用迭代器打印列表的所有元素: import java.util.ArrayLis

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析

Java集合相关面试问题和答案

Java集合相关面试问题和答案 面试试题 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久.它还包括在Java并发包中,阻塞接口以及它们的实现.集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类.

Java集合

JAVA集合小结   有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否 否 HashSet TreeSet 是(用二叉树排序) Map AbstractMap 否 使用key-value来映射和存储数据,Key必须惟一,value可以重复 HashMap TreeMap 是(用二叉树排序) 几个面试常见问题:1.Q:ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?   A:Vector和HashT

一大波Java来袭(五)——Java集合概述

把"Java集合"比作是容器,可以把多个对象(实际:是对象的引用),扔在容器中. JDK1.5之前,被丢进集合中的对象,会丢失起数据类型.默认为Object类型 JDK1.5之后,不会丢失数据类型,因为引入了"泛型"(作为下文重点) 本文将结合数据结构,重点讲述Java的4种集合体系的功能和用法,并给出不同应用场景改如何选择? 一.同样是用于"存储数据",既可以使用"数组",有可以使用"集合",有什么区别吗

Java集合总览

这篇文章总结了所有的Java集合(Collection).主要介绍各个集合的特性和用途,以及在不同的集合类型之间转换的方式. Arrays Array是Java特有的数组.在你知道所要处理数据元素个数的情况下非常好用.java.util.Arrays 包含了许多处理数据的实用方法: Arrays.asList:可以从 Array 转换成 List.可以作为其他集合类型构造器的参数. Arrays.binarySearch:在一个已排序的或者其中一段中快速查找. Arrays.copyOf:如果你

【Java集合源码剖析】HashMap源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap. HashMap 实现了Serializable接口,因此它支持序列化,

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实

java集合之整体架构

Java集合框架总结 Java集合是java 提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator迭代器.Enumeration枚举类.Arrays和Collections). Java集合工具包框架图(如下): 大致说明: 看上面的框架图,先抓住它的主干,即Collection和Map. 1. Collection是一个接口,是高