黑马程序员---一DAY17总结--java中你必须掌握的集合框架技术

本文主要探讨了Java中的Set接口及其常用子类HashSet和TreeSet。HashSet基于散列存储,不保证元素顺序,不允许重复,线程不安全,而TreeSet则保持元素的有序性。在HashSet中,添加元素时会根据对象的hashCode和equals方法来判断是否已存在。为了保证正确存储,需要重写这两个方法。理解这两个集合的工作原理对于有效利用Java集合框架至关重要。
摘要由CSDN通过智能技术生成

---------------------- android培训java培训、期待与您交流! ----------------------


Set 接口(元素不可以重复)


Set是Collection的子接口:

Set和Collection基本上一样,一点除外

Set无法记住添加顺序,不允许含重复元素


当试图添加两个相同的元素进Set集合,添加操作失败,add()方法返回false。

Set判断两个对象是否相等用equals,而不是==

也就是说两个对象equals比较返回ture,Set集合是不会接受这个两个对象的


常用子类

HashSet:散列存放

TreeSet:有序存放


hashCode方法对于HashSet的作用


HashSet类是Set接口最常用的实现类,采用hash算法存储数据,具有良好的存储

和查找功能

散列存储:不记录添加顺序;排列顺序时,顺序有可能发生变化;

线程不安全,多个线程访问一个HashSet要使用同步代码

HashSet集合元素值允许null,但是最多只能有一个;因为set集合就不可以装重复

的对象

hash 翻译为哈希,或散列 算法的功能

保证通过一个对象快速找到另一个对象

其算法机制体现在速度,可以保证查询快速执行

当从HashSet中访问元素时,HashSet先计算该元素的hashCode(也就是该对象

的hashCode方法返回值),然后直接到该HashCode对应的位置取出该元素

在这里对象的hashCode就好比是数组里的索引,但是不是索引


HashSet元素添加


当向HashSet集合中存入一个元素时,HashSet会条用该对象的HashCode()

方法来得到该对象hashCode值,判断已经存储在集合中的对象的hashCode

值是否与添加的对象的hashCode值一致;若不一致;直接添加进去。就不会

再添加新的对象了,否则添加进去

如果我们重写了equals方法,也要重写hashCode方法,反之亦然

HashSet 集合判断两个元素相等的标准时两个对象通过equals方法比较相等,

并且两个对象的hashCode方法返回值也相等

如果需要某个类的对象保存到HashSet集合中,覆写该类的equels方法比较相等,

并且两个对象的hashCode方法返回值也相等

如果需要某个类的对象保存到HashSet集合中,覆写该类的equals()和hashCode()

方法,应该尽量保证两个对象通过equals比较返回ture时,他们的hashCode返回也相等


重点是理解,往HashSet集合里存入数据,要先后调用两个方法:hashCode

方法和equals方法

使用eclipse添加这连个方法


package com.itheima;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


/**
*迭代器
*注意ListIterator(这个是列表迭代器 因为它的元素都带有角标所以自身拥有CRUD 在遍历中可以直接进行CRUD操作)
*比喻:
*在大型游戏机房 电玩城
*抓娃娃
*大罐子 容器 娃娃是元素 夹子取出东西(类似迭代器)
*
*当前从增删改查CRUD方面做了演示
*/


//定义一个集合类
class diedaiqi{
	//定义一个sop的打印方法
	public static void sop(Object obj){
		System.out.println(obj);
	}

	public static void main(String[] args){
		//先初始化一个类建立类对象
		ArrayList<String> a1 = new ArrayList<String>();
		//添加元素
		a1.add("java01");
		a1.add("java02");
		a1.add("java03");
		sop("原有元集合是:"+a1);
		//在指定位置添加元素 在角标为1的地方添加一个java09
		a1.add(3,"java09");
		a1.add(1,"java08");
		//删除指定位置的元素
		a1.remove(2);
		//修改元素(改)
		a1.set(2, "java07");
		//通过角标获取元素(查)
		sop("get(1):"+a1.get(1));
		sop("当前元集合是:"+a1);
		sop(a1);
		//获取所有元素 for遍历获取 (查)
		for(int x=0;x<a1.size();x++){
			System.out.println("a1("+x+")"+a1.get(x));
		}
		sop("");//空格
		//迭代器方式
		Iterator<String> it=a1.iterator();
		while(it.hasNext()){
			sop("next:"+it.next());
		}
		//通过indexOf()获取对象位置a1.subList(fromIndex, toIndex)	
		sop("index="+a1.indexOf("java02"));
		List<String> sub=a1.subList(1, 3);
		sop("sub="+sub);
	}
	
}






----------------------  android培训 java培训 、期待与您交流! ----------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值