Java基础——集合类——简要概述及使用(二)

Set集合

特点:无序,排重
Set集合中的元素不按特定的方式排序,只是简单地把对象加入集合中,并且Set集合中不能包含重复对象。即set集合具有无序性与排重性。又因为其是没有索引的,所以无法利用普通的For循环进行遍历操作;

Set接口继承了Collection 接口,所以Collectiom接口中的方法可以在Set实例中被使用。
add(E e) 添加元素;
clear() 清空元素;
remove(E e) 移除元素;
size() 元素数量;

Set集合的实现类
HashSet实现类

特点:查询快,无序,排重
HashSet类由哈希表(实际上是一个HashMap实例)支持。HashSet集合在进行查询是速度较快,但是不能保证元素的迭代顺序,允许使用null元素。要求放入的对象必须实现HashCode()方法,放入的对象,是以Hashcode码作为标识的,而具有相同内容的String对象,Hashcode码是一样的,所以放入的内容不能重复。

TreeSet实现类

特点:有序,排重
TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口 ,因此由TreeSet实现的Set集合支持两种排序方法,自然排序和定制排序。自然排序是按由小到大或字典顺序排序;定制排序呢,类需要实现Comparable接口,并重写CompareTo()方法、hashcode()方法与equals()方法

TreeSet实现类增加了如下方法请添加图片描述

//Set集合的使用,以TreeSet为例

import java.util.*

public class TreeSetDemo {  //创建TreeSet实现类
    public static void main(String[] args) {
        Set<Integer> set = new TreeSet<>(); //使用TreeSet类实现Set集合对象
        set.add(43);    //向Set集合中添加元素
        set.add(2);
        set.add(-34);
        set.add(345);
        set.add(3);
        Iterator<Integer> iterator = set.iterator();  //新建迭代器
        System.out.println("Set集合中的元素:");   //提示信息
        while (iterator.hasNext()) {    //遍历并输出Set集合中的元素
            System.out.println(iterator.next());
        }
    }
}

Map集合

特点:元素是(key,value)键值对,排重, 无序
Map接口没有继承 Collection 接口
Map用于保存具有映射关系的两组数据:key和value,即键和值。它们都可以存储任何引用类型的数据,但键不能重复。所以通过指定的键就可以取出对应的值。 Map 的内容可以被当作一组 key集合,一组 value 集合,或者一组 key-value 映射。为了保证键唯一,必须重写hashCode方法和equals方法。

Map接口提供了一些特殊方法:请添加图片描述

Map集合的实现类
HashMap实现类

特点:查询快,增删快,无序,键唯一,允许null键与null值
HashMap类通过哈希表对其内部的键值对的映射关系进行快速查找,但不保证映射的顺序。

TreeMap实现类

特点:查询快,增删慢,有序,键唯一,不允许null键
TreeMap类不仅实现了Map接口,还实现了java.util.sortedMap接口,因此TreeMap集合中的映射关系具有一定的顺序。

**建议:**使用 HashMap 类创建Map集合,因为由 HashMap 类实现的Map集合在添加、删除和定位映射关系是效率更高,当需要顺序输出时,再创建一个完成相同映射关系的treeMap类实例

//Map集合的使用,以HashMap为例
import java.util.*;

public class HashMapDemo {

    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();   //创建Map集合对象
        map.put("0731","长沙区号"); //向集合中添加元素、
        map.put("0734","衡阳区号");
        map.put("0735","郴州区号");
        Iterator iterator;  //创建迭代器
        Set<String> set = map.keySet(); //获取map集合中所有key对象形成的Set集合
        iterator = set.iterator();
        System.out.println("key:");
        while (iterator.hasNext()) {    //遍历并输出Map集合中的key
            System.out.println(iterator.next());
        }
        Collection<String> collection = map.values(); //获取map集合中所有value对象形成的collection集合
        iterator = collection.iterator();
        System.out.println("value:");
        while (iterator.hasNext()) {    //遍历并输出Map集合中的value
            System.out.println(iterator.next());
        }
    }
}

/*
运行结果:
key:
0731
0734
0735
value:
长沙区号
衡阳区号
郴州区号
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断两个list集合里的对象某个属性值是否一样可以按照以下步骤进行: 1. 遍历第一个list集合,以该对象的某个属性值为key,将对象存入一个Map中。 2. 遍历第二个list集合,以该对象的某个属性值为key,从Map中获取该key对应的对象,进行比较。 3. 如果两个对象的属性值相同,则说明两个list集合里的对象某个属性值是一样的。 下面是Java代码实现: ```java public boolean isSameProperty(List<Object> list1, List<Object> list2, String property) { Map<Object, Object> map = new HashMap<>(); for (Object obj : list1) { try { Field field = obj.getClass().getDeclaredField(property); field.setAccessible(true); Object key = field.get(obj); map.put(key, obj); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } for (Object obj : list2) { try { Field field = obj.getClass().getDeclaredField(property); field.setAccessible(true); Object key = field.get(obj); Object obj1 = map.get(key); if (obj1 != null) { if (obj.equals(obj1)) { return true; } } } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } return false; } ``` 使用示例: ```java List<User> list1 = new ArrayList<>(); list1.add(new User("张三", 20)); list1.add(new User("李四", 30)); List<User> list2 = new ArrayList<>(); list2.add(new User("王五", 20)); list2.add(new User("赵六", 30)); boolean isSameAge = isSameProperty(list1, list2, "age"); System.out.println("isSameAge: " + isSameAge); // true ``` 其中,User类实现了equals和hashCode方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值