集合学习第一天:HashSet及子类LinkedHashSet、TreeSet

一、数组和集合的比较
数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更使用,而且不同的集合框架类可适用不同场合。
如下:
1、数组能存放基本数据类型和对象,而集合类存放的都是对象的引用,而非对象本身!
2、数组容易固定无法动态改变,集合类容量动态改变。
3、数组无法判断其中实际村有多少元素,length只告诉数组的容量,而集合的size()可以确切知道元素的个数
4、集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式
5、集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率

Collection和Map,是集合框架的根接口。

Set接口及其子接口、实现类的结构如下所示:
|——SortedSet接口——TreeSet实现类
Set接口——|——HashSet实现类
|——LinkedHashSet实现类

HashSet
1、HashSet是set接口的实现类,也是我们最常用的set集合
1.1、储存的是无序,唯一的对象
1.2、由于是无序的所以每组数据都没有索引,很多list可用的方法他都没有
1.3、凡是需要通过索引来进行操作的方法都没有
1.4、所以也不能使用普通for循环来进行遍历,只有加强型for和迭代器两种遍历方法
例如:
get(i);
set(int index,Object o);
remove(int index);
等需要用索引来操作的方法都没有;
2.HashSet的各种方法:
2.1、增加 add(null);
2.2、删除 remove(news);
2.3、对比查找 contains(news);
2.4、清空集合 clear();
2.5、获取长度 size();
示例:

//创建HashSet集合,储存无序,唯一的数据
//HashSet是是使用equals来进行对象对比,确定数据是唯一的
//如果两个数据的对象是一致的,那么HashSet将会把这两个合并,只储存一个空间
HashSet<z_test> test = new HashSet<z_test>();
	test.add(new z_test("javaWeb2",110));
	test.add(new z_test("javaWeb",11));
	test.add(new z_test("javaWeb",11));
	System.out.println(test);
//由于HashSet储存数据都是无序的,所以不能用get(i);来获取具体对象
//所以我们必须通过遍历来得到HashSet的各个数据,由于是没有索引的
//所以不能使用普通类型的for来遍历它
//HashSet只能通过增强型for和迭代器来遍历它

//增强型for
  for (z_test z_test : test) {
		System.out.println(z_test);
	}
//迭代器  Iterator
  Iterator<z_test> tt = test.iterator();
	while (tt.hasNext()) {
		z_test zz = tt.next();
		System.out.println(zz);
	}	
set的各种常用方法
  1. set增加:set.add(null);
  2. 删除:set.remove(news);
  3. 对比查找:set.contains(news);
  4. 清空集合:set.clear();
  5. 获取长度:set.size();

总结
1、没有重复元素
2、可以高效的添加、删除元素,判断元素是否存在,效率都为O(1)
3、没有顺序
备注:(HashSet可以方便高效地实现去重、集合运算等功能。
如果要保持添加的顺序,可以使用HashSet的一个子类,LinkedHashSet。
Set还有一个重要的实现类TreeSet,它可以排序)
1、 LinkedHashSet
LinkedHashSet集合也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedHashSet集合里元素时,HashSet将会按元素的添加顺序来访问集合里的元素。
LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。
代码示例:
LinkedHashSet books = new LinkedHashSet();
books.add(“Java”);
books.add(“Linux”);
books.add(“C++”);
books.add(“算法”);
//迭代器
Iterator tt = books.iterator();
while (tt.hasNext()) {
Object zz = tt.next();
System.out.println(zz);
}
//增强for循环
for (Object bookss : books ) {
System.out.println(bookss );
}
// 删除 Java
books.remove(“Java”);
// 重新添加 Java
books.add(“Java”);
System.out.println(books);
运行结果:
[Java, Linux, C++, 算法]
[Linux, C++, 算法, Java]
运行说明
输出LinkedHashSet集合中的元素时,元素的顺序总是和添加顺序一致。
2、TreeSet
TreeSet实现了SortedSet接口,可以对集合中的对象进行排序,但是在使用TreeSet时要注意一点,那就是要给TreeSet传递一个比较器,也就是指定比较规则,否则的话,它就不知道谁大谁小,也就不能排序了。此时它会报一个ClassCastException的异常。
//创建比较器
MyComparator comparator = new MyComparator();
// TreeSet<z_test> set = new TreeSet<z_test>(comparator);
// 错误的代码,少了比较器,运行则报下面的异常。
TreeSet<z_test> set = new TreeSet<z_test>();
test.add(new z_test(“javaWeb4”,12));
test.add(new z_test(“javaWeb2”,110));
test.add(new z_test(“javaWeb”,11));
test.add(new z_test(“javaWeb”,11));
System.out.println(set);
class MyComparator implements Comparator<z_test>{
@Override
//按数字大小比较,int为返回负数、零、整数;
//为-1,元素值每次比较,都认为新插入的元素比上一个元素小,于是二叉树存储时,会存在根的左侧,读取时就是倒序序排列的。
//为0,元素值每次比较,都认为是相同的元素,这时就不再向TreeSet中插入除第一个外的新元素。所以TreeSet中就只存在插入的第一个元素。
//为1,元素值每次比较,都认为新插入的元素比上一个元素大,于是二叉树存储时,会存在根的右侧,读取时就是正序排列的。
public int compare(z_test o1, z_test o2){
// TODO Auto-generated method stub
int result = 0;
if(o1.price> o2.price)
{
result = 1;
}else{
result = -1;
}
return result;
}
}
备注(TreeSet: 排序对象时需要定义比较器,并在创建TreeSet对象时传入:TreeSet<z_test> set = new TreeSet<z_test>(comparator)。自然拍下不需要传入比较器:TreeSet set = new TreeSet())

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值