Java---集合Collection--Set

1 Set接口

1.1 概述

一个不包含重复元素的 collection。

数据无序(因为set集合没有下标)。

由于集合中的元素不可以重复。常用于给数据去重。

1.2 特点
在这里插入图片描述

HashSet:底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。当然K仍然不许重复。
TreeSet:底层就是TreeMap,也是红黑树的形式,便于查找数据。
HashMap实现中,当哈希值相同的对象,会在同一个hash值的位置存储不同属性的数据。

1.3 常用方法
boolean add(E e):添加元素。

boolean addAll(Collection c):把小集合添加到大集合中 。

boolean contains(Object o) : 如果此 collection 包含指定的元素,则返回 true。

boolean isEmpty() :如果此 collection 没有元素,则返回 true。

Iterator iterator():返回在此 collection 的元素上进行迭代的迭代器。

boolean remove(Object o) :从此 collection 中移除指定元素的单个实例。

int size() :返回此 collection 中的元素数。

Objec[] toArray():返回对象数组

1.4 demo1:测试常用方法

import java.util.HashMap;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

 

public class Test0_Map {

       public static void main(String[] args) {

              Set set = new HashSet ();

              set.add("hello");

              set.add("b");

              set.add("a");

              set.add("world");

              set.add("b");

 

              //不存重复元素,元素无序

              System.out.println(set);

             

              //迭代器

              Iterator it = set.iterator();

              while(it.hasNext()) {

                     System.out.println(it.next());

              }

       }

}

2 HashSet

2.1 概述

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set
的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

2.2 demo1:获取HashSet里的元素

import java.util.HashMap;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

 

public class Test0_Map {

    public static void main(String[] args) {

       HashSet set = new HashSet();

       set.add("a");

       set.add("e");

       set.add("b");

       set.add("a");

       set.add("b");

      

       System.out.println(set);//无序,不重复

      

       Iterator it = set.iterator();

       while(it.hasNext()) {

           System.out.println(it.next());

       }

      

    }

}

3 Map接口

3.1 概述

java.util接口 Map<K,V>

类型参数: K - 此映射所维护的键的类型V - 映射值的类型。

也叫哈希表、散列表。常用于存 键值对 结构的数据。其中的键不能重复,值可以重复.

3.2 特点

可以根据键 提取对应的值 键不允许重复,如果重复值会被覆盖 存放的都是无序数据 初始容量是16,默认的加载因子是0.75

在这里插入图片描述

3.3 继承结构
在这里插入图片描述

3.4 常用方法

void clear()

      从此映射中移除所有映射关系(可选操作)。

boolean containsKey(Object key)

      如果此映射包含指定键的映射关系,则返回 true。

boolean containsValue(Object value)

      如果此映射将一个或多个键映射到指定值,则返回 true。

V get(Object key)

      返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。

boolean isEmpty()

      如果此映射未包含键-值映射关系,则返回 true。

V put(K key, V value)

      将指定的值与此映射中的指定键关联(可选操作)。

void putAll(Map<? extends K,? extends V> m)

      从指定映射中将所有映射关系复制到此映射中(可选操作)。

V remove(Object key)

      如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。

int size()

      返回此映射中的键-值映射关系数。

Set<Map.Entry<K,V>> entrySet()

      返回此映射所包含的映射关系的 Set 视图。

3.5 demo:测试常用方法

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

 

 

public class Test0_Map {

       public static void main(String[] args) {

              Map map = new HashMap ();

              map.put("001", "钢铁侠");

              map.put("002", "蜘蛛侠");

              map.put("003", "绿巨人");

              map.put("004", "灭霸");

              map.put("005", "美国队长");

              map.put("005", "凤姐");

              System.out.println(map.containsKey("001"));

              System.out.println(map.containsValue("美国队长"));

              System.out.println(map.isEmpty());

              System.out.println(map.get("003"));

              System.out.println(map.remove("001"));

              System.out.println(map.size());

              Map map2 = new HashMap ();

              map2.put("999", "刘德华");

map.put(null,null);//可以存入键为null,值也null的数据

 

              map.putAll(map2);

              System.out.println(map);

             

              //keySet()返回键的set集合,把map的key形成set集合

              Set set = map.keySet();

              System.out.println(set);

             

             

              //map集合的遍历,

              //方式1:keySet():把map中的可以放入set集合

              //遍历方式1:keySet ()

Set set = m.keySet();

              Iterator it = set.iterator();

              while(it.hasNext()) {

                     String key = (String) it.next();

                     String val = (String) m.get(key);

                     System.out.println(key+"="+val);

              }

      

              //遍历方式2:entrySet ()

Set set2 = m.entrySet();

              Iterator it2 = set2.iterator();

              while(it2.hasNext()) {

                     Entry en = (Entry) it2.next();

                     String key = (String) en.getKey();

                     String value = (String) en.getValue();

                     System.out.println(key+"=="+value);

              }

             

       }

}

4. HashMap

HashMap的键要同时重写hashCode()和equals() hashCode()用来判断确定hash值是否相同
equals()用来判断属性的值是否相同

equals()判断数据如果相等,hashCode()必须相同

equals()判断数据如果不等,hashCode()尽量不同

4.1 概述

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。

HashMap底层是一个Entry数组,当存放数据时会根据hash算法计算数据的存放位置。算法:hash(key)%n,n就是数组的长度。

当计算的位置没有数据时,就直接存放,当计算的位置有数据时也就是发生hash冲突的时候/hash碰撞时,采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。

jdk1.8以后将底层进行了优化,当链表的数量大于8,就会形成红黑树,这样便于查询。

在这里插入图片描述

4.2 demo1:读取HashMap的数据

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

 

public class Test0_Map {

       public static void main(String[] args) {

              HashMap map = new HashMap ();

              map.put(100, "刘德华");

              map.put(101, "梁朝伟");

              map.put(102, "古天乐");

              map.put(103, "周润发");

 

//遍历方式1:keySet ()

Set set = m.keySet();

              Iterator it = set.iterator();

              while(it.hasNext()) {

                     String key = (String) it.next();

                     String val = (String) m.get(key);

                     System.out.println(key+"="+val);

              }

      

              //遍历方式2:entrySet ()

Set set2 = m.entrySet();

              Iterator it2 = set2.iterator();

              while(it2.hasNext()) {

                     Entry en = (Entry) it2.next();

                     String key = (String) en.getKey();

                     String value = (String) en.getValue();

                     System.out.println(key+"=="+value);

              }

       }

}

 

5.4.3     练习2:字符串中的字符统计
接收用户输入的一串字符串,统计出现的每个字符的个数

package seday12;

import java.util.HashMap;

import java.util.Scanner;

public class Test2_Count {

       public static void main(String[] args) {

              //abacbcda

              String s = new Scanner(System.in).nextLine();

             

              //a 1  b 2  c 1

              HashMap<Character,Integer> map = new HashMap<>();

              //遍历字符串获取每个字符

              for(int i = 0;i<s.length();i++) {

                     //1,取出字符串中的每个字符

                     char c = s.charAt(i);

                    

                     //拿着字符查个数

                     Integer count = map.get(c);

 

                     //如果取出来是null,就存1,

                     if(count==null) {

                            map.put(c, 1);

                     }else {

                            //如果取出来有值,计数加1

                            map.put(c,count+1);

                     }

              }

              System.out.println(map);

       }

}

5 Collections工具类

5.1 常用方法

Collections.sort(List<> list):根据元素的自然顺序 对指定列表按升序进行排序。

Collections.max():根据元素的自然顺序,返回给定 collection 的最大元素。

Collections.min():根据元素的自然顺序 返回给定 collection 的最小元素。

Collections.swap(List,i,j):在指定列表的指定位置处交换元素。

Collections.addAll()

5.2 测试

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

public class Test4_Collections {

       public static void main(String[] args) {

              List<String> list = new ArrayList();

             

              //添加多个元素

              Collections.addAll(list,

                            "3","30","23","15","29","12","26");

             

              //元素排序

              Collections.sort(list);

          //默认是字符顺序:[12,15,23,26,29, 3, 30]

              System.out.println(list);

             
              //自己定义比较方式

              Collections.sort(list, new Comparator<String>() {

                     //自定义比较器,sort()自动调用

                     @Override

                     public int compare(String o1, String o2) {

                            //把字符串转成int比大小

                            int a = Integer.parseInt(o1);

                            int b = Integer.parseInt(o2);

//o1大是正数,o1小是负数,相等是0

                            return a-b;

                     }

              });

              System.out.println(list);

       }

}

6.1 集合和数组的区别

一、数组声明了它容纳的元素的类型,而集合不声明。

二、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。

三、数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。

四、数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值