我的Java学习笔记-集合篇

一、理论部分

1.集合的概念(Collection,Map)

一系列对象的集合,类似于数学上的集合{1,2,3}。
可以添加,删除,修改,查找,比较。
Collection继承了Iterable接口。

2.与数组的区别

数组的长度一旦设定就不可以修改
集合可以任意修改长度
(个人觉得数组与ArrayList集合的关系有点像String与StringBuffer的关系)

3.集合的分类

在这里插入图片描述

4.迭代器

迭代器模式:就是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。
接口的定义

package java.util;

public interface Iterator<E> {
    boolean hasNext();//判断是否存在下一个对象元素

    E next();//获取下一个元素

    void remove();//移除元素
}

使用1:Iterator iterator();

使用2:foreach循环

5.比较器

Comparable接口
public interface Comparable该接口对实现它的每个类的对象强加一个整体排序。
这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法 。
Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。

只有一个方法:

public int compareTo(T o)将此对象与指定的对象进行比较以进行排序

Comparator接口
public interface Comparator比较功能,对一些对象的集合施加了一个整体排序 。
可以将比较器传递给排序方法(如Collections.sort或Arrays.sort ),以便对排序顺序进行精确控制。

常用方法解读
public int compare(T o1, T o2)比较其两个参数的顺序
public boolean equals(Object obj)指示某个其他对象是否等于此比较器

二、操作部分

1. List接口介绍

java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了 List 接口的对
象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过
索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。

常用方法解读
public void add(int index, E element)将指定的元素,添加到该集合中的指定位置上
public E get(int index)返回集合中指定位置的元素
public E remove(int index)移除列表中指定位置的元素, 返回的是被移除的元素
public E set(int index, E element)用指定元素替换集合中指定位置的元素,返回值的更新前的元素

方法演示代码:

    public class TestList {
        public static void main(String[] args) {
			// 创建List集合对象
            List<String> list = new ArrayList<String>();
			// 往 尾部添加 指定元素
            list.add("图图");
            list.add("小美");
            list.add("不高兴");
            System.out.println(list);
			// add(int index,String s) 往指定位置添加
            list.add(1,"没头脑");
            System.out.println(list);
			// String remove(int index) 删除指定位置元素 返回被删除元素
			// 删除索引位置为2的元素
            System.out.println("删除索引位置为2的元素");
            System.out.println(list.remove(2));
            System.out.println(list);
			// String set(int index,String s)
			// 在指定位置 进行 元素替代(改)
			// 修改指定位置元素
            list.set(0, "三毛");
            System.out.println(list);
			// String get(int index) 获取指定位置元素
			// 跟size() 方法一起用 来 遍历的
            for(int i = 0;i<list.size();i++){
                System.out.println(list.get(i));
            }
			//还可以使用增强for
            for (String string : list) {
                System.out.println(string);
            }
            
        }
        
    }
    

ArrayList
java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为
查询数据、遍历数据,所以 ArrayList 是最常用的集合。

除继承自List外的常用方法解读
public boolean add(E e)将指定元素追加到此列表的末尾
public void clear()从列表中删除所有元素
public boolean contains(Object o)如果此列表包含指定的元素,则返回 true
public int indexOf(Object o)返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1
public int size()返回此列表中的元素数
public Object[] toArray()以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组

方法演示代码:

判断集合里是否存在一个 name等于 "hero 1"的对象

import java.util.ArrayList;
import charactor.Hero;

public class TestArryList {
    public static void main(String[] args) {
        ArrayList heros = new ArrayList();
  
        // 初始化5个对象
        for (int i = 0; i < 5; i++) {
            heros.add(new Hero("hero " + i));
        }
        Hero specialHero = new Hero("special hero");
        heros.add(specialHero);
        String name = "hero 1";
        for (int i = 0; i < heros.size(); i++) {
            Hero h = (Hero) heros.get(i);
            if(name.equals(h.name ) ){
                System.out.printf("找到了name是%s的对象",name);
                break;
            }
        }
         
    }
  
}

LinkedList
java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合。

除继承自List外的常用方法解读
public void addFirst(E e)将指定元素插入此列表的开头
public void addLast(E e)将指定元素添加到此列表的结尾
public E getFirst()返回此列表的第一个元素
public E getLast()返回此列表的最后一个元素
public E removeFirst()移除并返回此列表的第一个元素
public E removeLast()移除并返回此列表的最后一个元素
public E pop()从此列表所表示的堆栈处弹出一个元素
public void push(E e)将元素推入此列表所表示的堆栈
public boolean isEmpty()如果列表不包含元素,则返回true

方法演示代码:

二叉树的创建与中序遍历

import java.util.ArrayList;
import java.util.List;
 
public class Node {
    // 左子节点
    public Node leftNode;
    // 右子节点
    public Node rightNode;  
    // 值
    public Object value;
  
    // 插入 数据
    public void add(Object v) {
        // 如果当前节点没有值,就把数据放在当前节点上
        if (null == value)
            value = v;
  
        // 如果当前节点有值,就进行判断,新增的值与当前值的大小关系
        else {
            // 新增的值,比当前值小或者相同
             
            if ((Integer) v -((Integer)value) <= 0) {
                if (null == leftNode)
                    leftNode = new Node();
                leftNode.add(v);
            }
            // 新增的值,比当前值大
            else {
                if (null == rightNode)
                    rightNode = new Node();
                rightNode.add(v);
            }
  
        }
  
    }
  
 // 中序遍历所有的节点
    public List<Object> values() {
        List<Object> values = new ArrayList<>();
  
        // 左节点的遍历结果
        if (null != leftNode)
            values.addAll(leftNode.values());
  
        // 当前节点
        values.add(value);
  
        // 右节点的遍历结果
        if (null != rightNode)
  
            values.addAll(rightNode.values());
  
        return values;
    }
  
    public static void main(String[] args) {
  
        int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 };
  
        Node roots = new Node();
        for (int number : randoms) {
            roots.add(number);
        }
  
        System.out.println(roots.values());
  
    }
}

2.Set接口介绍

java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比 Collection 接口更加严格了。
与 List 接口不同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

常用方法与List接口的差不多

方法演示代码:

public class TestSet {

	public static void main(String[] args) {
		//创建 Set集合
		HashSet<String> set = new HashSet<String>();
		//添加元素
		set.add(new String("cba"));
		set.add("abc");
		set.add("bac");
		set.add("cba");
		//遍历
		for (String name : set) {
			System.out.println(name);
		}
	}
}

HashSet
java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。
保证元素唯一性的方式依赖于: hashCode 与 equals 方法。

除继承自List外的常用方法解读
public boolean add(E e)将指定元素追加到此列表的末尾
public void clear()从列表中删除所有元素
public boolean contains(Object o)如果此列表包含指定的元素,则返回 true
public int size()返回此列表中的元素数

方法演示代码:

创建一个长度是100的字符串数组,使用长度是2的随机字符填充该字符串数组,统计这个字符串数组里重复的字符串有多少种

public class TestHashSet {
    //随机字符串
    private static String randomString(int length) {
        String pool = "";
        for (short i = '0'; i <= '9'; i++) {
            pool += (char) i;
        }
        for (short i = 'a'; i <= 'z'; i++) {
            pool += (char) i;
        }
        for (short i = 'A'; i <= 'Z'; i++) {
            pool += (char) i;
        }
        char cs[] = new char[length];
        for (int i = 0; i < cs.length; i++) {
            int index = (int) (Math.random() * pool.length());
            cs[i] = pool.charAt(index);
        }
        String result = new String(cs);
        return result;
    }


    public static void main(String[] args) {
        //创建并初始化字符串数组
        String[] strings = new String[100];
        //Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < strings.length; i++) {
            //String str = scanner.next().substring(0,2);
            strings[i] = randomString(2);
        }
        //遍历字符串
        int k= 1;
        for (String s :
                strings) {
            System.out.print(s+"\t");
            if(k%10==0)
                System.out.println();
            k++;
        }
        //把重复的字符串放入HashSet中
        HashSet<String> hashSet = new HashSet<>();
        for (int i = 0; i < strings.length; i++) {
            int count = 0;
            for (int j = 1; j < strings.length; j++) {
                if(strings[j].equalsIgnoreCase(strings[i])){
                    count++;
                    if(count==2){
                        hashSet.add(strings[j]);
                        break;
                    }
                }
            }
        }
        //遍历HashSet
        int x = hashSet.size();
        System.out.println(x);
        for (String hs :
                hashSet) {
            System.out.println(hs);
        }

    }
}

TreeSet
java.util.TreeSet 是 Set 接口的一个实现类。
TreeSet集合底层数据结构采用红黑树实现,元素唯一且已经排好序。
默认情况下,TreeSet中的数据是从小到大排序的。

除继承自Set外的常用方法解读
public boolean add(E e)将指定元素追加到此列表的末尾
public void clear()从列表中删除所有元素
public boolean contains(Object o)如果此列表包含指定的元素,则返回 true
public int size()返回此列表中的元素数
public E ceiling(E e)返回此集合中最小元素大于或等于给定元素,如果没有此元素,则返回 null
public Comparator<? super E> comparator()返回用于对该集合中的元素进行排序的比较器,或null,如果此集合使用其元素的natural ordering
public E first()/last()返回此集合中当前的第一个(最低)元素/最后(最高)元素

代码如下(示例):

public static void main(String[] args) {

        TreeSet<Integer> ts = new TreeSet<>();

        ts.add(33);
        ts.add(2);
        ts.add(11);
        ts.add(9);
		//元素没有下标,只能通过迭代器或者foreach循环遍历
        Iterator it = ts.iterator();
        while (it.hasNext()){
            System.out.println(it.next());//运行结果按从小到大的顺序输出
        }
    }

3.Map接口介绍

Map 中的集合,元素是成对存在的(键值对)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
Collection 中的集合称为单列集合, Map 中的集合称为双列集合。
Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

常用方法解读
public V put(K key, V value)把指定的键与指定的值添加到Map集合中
public V remove(Object key)把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
public V get(Object key)根据指定的键,在Map集合中获取对应的值。
public Set keySet()获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet()获取到Map集合中所有的键值对对象的集合(Set集合)

代码如下(示例):

public class TestMap {
	public static void main(String[] args) {
		//创建 map对象
		Map<String, String> map = new HashMap<String, String>();
		//添加元素到集合
		map.put("黄晓明", "杨颖");
		map.put("文章", "马伊琍");
		map.put("邓超", "孙俪");
		System.out.println(map);
		//删除键为"邓超"对应的键值对
		System.out.println(map.remove("邓超"));
		System.out.println(map);
		// 想要查看 黄晓明的媳妇 是谁
		System.out.println(map.get("黄晓明"));
		System.out.println(map.get("邓超"));//输出null
	}
}

HashMap
java.util.HashMap<K,V> 是Map接口的一个实现类。

除继承自Map外的常用方法解读
public void clear()从这张地图中删除所有的映射
public boolean containsKey(Object key)如果此映射包含指定键的映射,则返回 true
public boolean containsValue(Object value)如果此地图将一个或多个键映射到指定值,则返回 true
public int size()返回此地图中键值映射的数量

代码如下(示例):

HashMap键与值的翻转

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class TestHashMap {
    public static void main(String[] args) {
        HashMap<String,String> hashMap = new HashMap<>();
        hashMap.put("adc","物理英雄");
        hashMap.put("apc","魔法英雄");
        hashMap.put("t","坦克");

        List<String> listKey = new ArrayList<>(hashMap.keySet());
        List<String> listValues = new ArrayList<>(hashMap.values());

        HashMap<String,String> hashMap1 = new HashMap<>();
        hashMap1.put(listValues.get(0),listKey.get(0));
        hashMap1.put(listValues.get(1),listKey.get(1));
        hashMap1.put(listValues.get(2),listKey.get(2));

        System.out.println(hashMap1);
    }
}

TreeMap
java.util.TreeMap<K,V> 是Map接口的一个实现类。
是一个有序的key-value集合,基于红黑树的 NavigableMap实现。
该映射根据其键的大小顺序进行排序,或者根据创建映射时提供的 Comparator进行排序。

构造方法

我懒得做个表了,凑合一下吧!
在这里插入图片描述

除继承自Map外的常用方法解读
public void clear()从这张地图中删除所有的映射
public boolean containsKey(Object key)如果此映射包含指定键的映射,则返回 true
public boolean containsValue(Object value)如果此地图将一个或多个键映射到指定值,则返回 true
public int size()返回此地图中键值映射的数量
public Comparator<? super K> comparator()返回用于订购此地图中的键的比较器,或null如果此地图使用其键的natural ordering
public V replace(K key, V value)只有当目标映射到某个值时,才能替换指定键的条目
public Set<Map.Entry<K,V>> entrySet()返回此地图中包含的映射的Set视图

代码如下(示例):

输出为:
在这里插入图片描述

import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

public class TestTreeMap {
    public static void main(String[] args) {
        TreeMap<String,Integer> map = new TreeMap<>();

        String key = null;
        Integer integ = null;
        for (int i = 0; i < 5; i++) {
            map.put("Z"+i+"z",i*10);
        }
        map.put("X",-2);
        map.put("y",5);
        Iterator iter = map.entrySet().iterator();
        while(iter.hasNext()) {
            Map.Entry entry = (Map.Entry)iter.next();
            // 获取key
            key = (String)entry.getKey();
            // 获取value
            integ = (Integer)entry.getValue();
            System.out.println("[key - "+key+"]  [value - "+integ+"]");
        }
    }
}



总结

集合是一个很好用的容器!

a,继续加油吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值