Java-集合(Collection)

图是网上盗的哈哈

(上图是百度的直接盗来用了哈哈,下来直接步入正题)集合不能存储基本数据类型,也不能直接存储java对象,集合存储的都是引用,集合又分为两大类:

  • Collection
  • Map
list.add(100) // 自动装箱Integer

Collection

Collection接口继承了Iterable接口,Iterable有一个Iterator()方法,可以返回一个集合的迭代器对象,用来遍历集合的元素,Collection我们主要学两个子接口:

  • List
  • Set
List<Integer> list = new ArrayList<>();
Iterator iterator = list.iterator();
Modifier and TypeMethod and Description
booleanadd(E e) 确保此集合包含指定的元素(可选操作)
booleanremove(Object o) 从这个集合中移除指定元素的一个实例,如果它是存在的(可选操作)
intsize() 返回此集合中的元素的数目。
voidclear() 从这个集合中移除所有的元素(可选操作)
Iterator<E>iterator() 返回此集合中的元素的迭代器
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

// Colletion集合通用的遍历方式
public class Test03 {
    public static void main(String[] args) {
        Collection<Integer> list = new ArrayList<>();

        list.add(10);
        list.add(9);
        list.add(8);
        list.add(3);

        // 返回此集合中的元素的迭代器,当集合发生改变,迭代器要重新获取,否则会出现运行时异常
        Iterator iterator = list.iterator();

        /**
        * boolean hasNext() 返回 true 表示还有元素可以迭代。
        * E next() 返回迭代中的下一个元素。(取出元素)
        */
        while(iterator.hasNext()){
            System.out.println(iterator.next());
            // 删除iterator指向的当前元素,不能用集合对象去删除,用集合对象去删除,集合发生改变,迭代器要重新获取
            iterator.remove();
        }

    }
}

List 接口

List集合存储元素特点是有序可重复的,存储的元素有下标,有两个重要的实现类:

  • ArrayList 查询数据比较快,添加和删除数据比较慢((底层采用了 数组 数据结构)
  • LinkedList 查询数据比较慢,添加和删除数据比较快(底层采用了 双向链表 数据结构)
Modifier and TypeMethod and Description
Eget(int index) 返回此列表中指定位置的元素
intindexOf(Object o) 返回此列表中指定元素的第一个出现的索引(下标),或如果此列表不包含元素,返回- 1
Eset(int index, E element) 用指定元素替换此列表中指定位置的元素(可选操作)

Set 接口

Set集合存储元素特点是无序不可重复的,存储的元素没有下标,有一个重要实现类和一个子接口SortedSet,子接口SortedSet又有一个重要的实现类:

  • HashSet (底层是 哈希表 数据结构)
  • TreeSet 元素自动排序(小到大)(底层是 二叉树 数据结构)
import java.util.*;

public class SetTest01 {
    public static void main(String[] args) {
        Set set = new HashSet();
        set.add(3);
        set.add(4);
        set.add(5);
        set.add(6);
        set.add(6);
        set.add(6);

        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }


    }
}

结果:

“D:\JDK\JDK SE8\bin\java.exe” "-javaagent:D:\IDEA\IntelliJ IDEA
3
4
5
6
Process finished with exit code 0
(重复元素不会报错,但只能有一个)

TreeSet

放到TreeSet集合中的元素,等同于故到TreeMap集合key部分。一般用于排序需求的数据存取,比如要从数据库中查询一些人,人要按照年龄排序,但TreeSet不能对自定义的类型比较,如果要把对象信息放TreeSet中,要求按照年龄排序,要实现Comparable接口重写compareTo()方法

// 自定义类型要实现Comparable接口才能放到TreeSet中比较
public class User implements Comparable<User>{

    private String name;
    private String id;
    private Integer age;

    public User(Integer age){
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public int compareTo(User user) {
        return this.age - user.age ; // 升序排列,为什么这样看源码的二叉树比较原理
    }


    @Override
    public String toString(){
        return this.age.toString();
    }
}
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetTest01 {
    public static void main(String[] args) {
    	// 也可以自定义一个比较器,在创建TreeSet的时候用构造方法传一个比较器进去,这里不进行演示了
        Set<User> set = new TreeSet<>();

        User user1 = new User(3);
        User user2 = new User(5);
        User user3 = new User(99);
        User user4 = new User(25);

        set.add(user1);
        set.add(user2);
        set.add(user3);
        set.add(user4);

        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }
}

结果:

3
5
25
99


Map

Map集合存储特点是以key-value这种键值对方式去存储元素,key是无序不可重复的,有两个重要的实现类:

  • TreeMap (底层是 二叉树 数据结构)
  • HashMap (底层是 哈希表 数据结构)
Modifier and TypeMethod and Description
Vget(Object key) 返回指定的键映射的值,或 null如果这个Map不包含的键映射
inthashCode() 返回此映射的哈希代码值
Set<K>keySet() 返回一个 Set的关键视图包含在这个Map(获取一个key的set集合)
Vput(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)
intsize() 返回这个映射中的键值映射的数目
booleancontainsValue(Object value) 返回 true如果映射到指定的值的一个或多个键
Vremove(Object key) 如果存在(可选操作),则从该Map中移除一个键的映射(键值对)
Set<Map.Entry<K,V>>entrySet() 返回一个 Set视图的映射包含在这个Map
// Set<Map.Entry<K,V>> 方法演示
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

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

        map.put("小明",1);
        map.put("小和",2);
        map.put("小白",9);
        map.put("小黄",6);
        map.put("小路",7);

        Set set = map.entrySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

结果:

小明=1
小白=9
小和=2
小路=7
小黄=6
Process finished with exit code 0
Map.Entry<K,V>是一个静态内部类,也是返回的Set集合泛型约束的类型

Map的遍历

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * Map集合的遍历
 */
public class MapTest02 {
    public static void main(String[] args) {

        Map<Integer,String> map = new HashMap();

        map.put(1,"xiaobai");
        map.put(2,"xiaoming");
        map.put(3,"xiaoh");
        map.put(4,"xiaol");

        // 第一种方式:获取所有的key,通过遍历key获取所有的value
        Set<Integer> keys = map.keySet(); // 获取所有key的集合,其实就是一个Set集合
        Iterator iterator = keys.iterator(); // 通过迭代器和get()方法去取出value

        while (iterator.hasNext()){
            System.out.println(map.get(iterator.next()));
        }

        //也可以用foreach
        for (Integer key:
             keys) {
            System.out.println(map.get(key));
        }

        System.out.println("==============");

        // 第二种方式:通过entrySet()方法返回一个Set<Map.Entry<K,V>>集合
        Set<Map.Entry<Integer,String>> set = map.entrySet();

        // 迭代,每次取出的是一个Node,Node有专门的方法去取key和value,效率比第一种更高效
        Iterator<Map.Entry<Integer,String>> iterator1 = set.iterator();

        while (iterator1.hasNext()){
            Map.Entry<Integer,String> node = iterator1.next();
            System.out.println(node.getKey());
            System.out.println(node.getValue());
        }

    }
}

Collections(集合工具类)

为了方便操作集合

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsTest {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        // 让list变成线程安全
        Collections.synchronizedList(list);

        // 排序
        Collections.sort(list);
     
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值