Java学习笔记——集合框架(List、Set、Map)

1.Collection集合概述

集合顶层Collection包含List和Set。
List的实现类    包括ArrayList和LinkedList;
Set的实现类     包括HashSet(无序)和TreeSet(有序);
接口Map实现类    包括HashMap(无序)和TreeMap(有序)
数组和集合的区别:

        a、数组长度固定,集合长度可变
        b、数组存储的是同一种类型的元素,集合可以存储不同类型的数据
        c、数组可以存储基本数据类型,也可以存储引用数据类型,集合只能存储引用类型

Collection接口存储一组不唯一,无序的对象
List接口存储一组不唯一,有序的对象
Set接口存储一组唯一,无序的对象
Map接口存储一组键值对象

List 默认容量为10个;超出容量后,之后每次增加当前容量的50%    



2.Collection集合的方法

a、添加功能:
boolean add(E e);//将指定的元素追加到此列表的末尾,返回boolean值
boolean add(int index, E element);//将指定的元素插入此列表中的指定位置 
boolean addAll(Collection c);//添加一个集合的元素

public class Demo01Collection {
    public static void main(String[] args) {
        //创建集合对象,可以使用多态
        Collection<String> coll = new ArrayList<>();

        boolean b1 = coll.add("张三");
        System.out.println(b1);//true
        System.out.println(coll);//[张三]
    }
}

b、删除功能:    
void clear();//从此集合删除所有元素
boolean remove(int index);//删除该索引处的元素
boolean remove(Object o);//删除指定的元素 

c、判断功能:
boolean contains(Object o);//如果此列表中包含指定的元素,则返回true
boolean containsAll(Collection c);//判断集合中是否包含指定的集合元素
boolean isEmpty();//判断集合是否为空,集合是否为空

d、获取功能:
get(int index);//返回此列表中指定位置的元素
indexOf(Object o);//返回此列表中指定元素的第一次出现的索引,不包含则返回-1

e、交集功能:
boolean retainAll(Collection c);//两个集合都有的元素
假设有A、B两个集合,A对B做交集,最终结果保存在A中,B不变;返回值表示A是否发生过改变    
    
f、长度功能:
int size();//返回此列表的元素数
set(int index,E element);用指定的元素替换列表中制动位置的元素

 

3.增强for循环

增强for循环:用来遍历集合和数组

格式:

       for(集合/数组的数据类型  变量名:   集合名/数组名) {

                 sout(变量名);

        }

public class Demo02Foreach {
    public static void main(String[] args) {
        demo01();
        demo02();
    }

    public static void demo01() {
        int[] arr = {1,2,3};
        for (int i:arr) {
            System.out.println(i);
        }
    }

    public static void demo02() {
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        for (String s:list) {
            System.out.println(s);
        }
    }
}

4.Map集合概述

Map<key,value> 接口 专门处理键值映射数据的存储,可以根据键实现对值得操作
常用的实现类是HashMap

  • put(K key,V value);              //将制定的值与此映射中的指定的键关联
  • keySet();                              //返回此地图中包含的键的Set视图
  • remove(Object key);            //从地图中删除指定键的映射
  • get(Object key);                   //返回到指定键所映射的值,或null
  • containsKey(Object key);     //如果此映射包含指定键的映射,则返回true

遍历Map集合:

a、使用迭代器Iterator
     获取Iterator:Collection接口的iterate()方法
     boolean hasNext();    //判断是否存在另一个课访问的元素
     Objiect next();            //返回要访问的下一个元素(获取元素并移动到下一个位置)    

     hasNext 判断      next() 取出
     Iterator it= c.keySet().iterator();//获取Iterator    
     while (it.hasNext()) {
            System.out.println(c.get(it.next()));    //不要多次使用it.next()方法
        }             
 b、增强型的for循环
            for(基本类型  别名:集合名 ){  }

Map集合的特点:
  1.Map集合是一个双列集合, 一个元素包含两个值(一个key,一个value)
  2.Map集合中的元素, key和value的数据类型可以相同,也可以不同
  3.Map集合中的元素, key是不允许重复的, value是可以重复的
  4.Map集合中的元素, key和value是一一对应

Map集合的第一种遍历方式:通过键找值的方式
Map集合中的方法:
         Set<K>  keySet() 返回此映射中包含的键的Set视图。
实现步骤:
1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
2.遍历set集合,获取Map集合中的每一个key
3.通过Map集合中的方法get(key) ,通过key找到value

public class Demo02KeySet {
    public static void main(String[] args) {
        //创建Map集合对象
        Map<String,Integer> map = new HashMap<>();
        map.put("陈萱琳",19);
        map.put("陈小雨",18);
        map.put("陈傻逼",17);

        //1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
        Set<String> set = map.keySet();

        //2.遍历set集合,获取Map集合中的每一个key
        //使用迭代器遍历set集合
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            String key  =it.next();
            //3.通过Map集合中的方法get(key) ,通过key找到value
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }
    }
}

 

5.ArrayList 与LinkedList的区别

ArrayList实现了长度可变的数组,在内存分配连续的空间。遍历元素和随机访问元素的效率比较高,查询效率高。
LinkedList采用链表存储方式。插入,删除元素时效率比较高。

 

6.Vector和ArrayList的异同

实现原理、功能相同,可以互用
主要区别:a、Vector线程安全。ArrayList重速度轻安全,线程非安全
                  b、长度需增长时,Vector默认增长一倍,ArrayList增长50%
 

小练习

计算一个字符串中每个字符出现次数

分析:

  1. 使用Scanner获取用户输入的字符串
  2. 创建一个Map集合,键代表字符,值代表次数
  3. 遍历字符串得到每个字符
  4. 判断Map中是否有该键
  5. 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值++,再次存储
  6. 打印最终结果
public class Test01StringNum {
    public static void main(String[] args) {
        //1.获取一个字符串对象
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String input = sc.next();

        //2.创建一个Map集合
        Map<Character,Integer> map = new HashMap<>();

        //3.遍历字符串得到每个字符
        for (char c:input.toCharArray()) {
            //4.判断Map中是否有该键
            if (map.containsKey(c)) {//key存在
                Integer value = map.get(c);
                value++;
                map.put(c,value);
            } else {
                map.put(c,1);
            }
        }

        //5.打印最终结果
        for (Character key:map.keySet()) {
            Integer value = map.get(key);
            System.out.println(key+":"+value);
        }
    }
}

 


版权声明:本文为weixin_44953364原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。