Java编程思想学习(二)——Java容器

Java常用容器的使用

常用容器就那几个
大概包括

- List 的子类

ArraryList和LinkedList

- Map的子类

HashMap,TreeMap,LinkedHashMap 再加一个ConcurrentHashMap(并发安全)

- Set的子类

HashSet,TreeSet

- Queue及子类(除了并发其他地方用的较少)

说了这么多 这些容器为什么被广泛使用,第一点肯定是数据结构的原因。

从数据结构来看
ArrayList 就是类线性表(广义),LinkedList就是链表。
Map就是键值对。
Set是无序的不含重复元素的集合。
Queue 队列

那么为什么没有Stack 栈呢?
答案是有栈的,在早期版本上有基于Vector的Stack ,了解这个的就知道
创造者为了简单,直接继承的Vector基于数组的Stack ,对于栈来说频繁的插入删除操作对于数组来说无疑是一种灾祸,而且含有中间插入的方法,与数据结构本身不符。
所以不建议使用 Stack 及 Vector
对于栈来说,LinedList已经完全可以满足栈的所有需求。LinkedList也可以完全替代掉Queue。

偷一张图 还是很清楚的
Java 容器图

容器的打印

容器打印默认会调用toString() 方法。 如果需要可以重写,不过不建议直接重写,要用适配器模式 重写。
很简单

public class Test {
    public static void main(String[] args){
        Random random = new Random(11);
        List<Integer> list = new ArrayList<>();
        Map<Integer,Integer> map = new TreeMap<>();
        Set<Integer> set = new LinkedHashSet<>();
        for(int i=0;i<5;i++){
            list.add(random.nextInt(10));
            map.put(i,random.nextInt(10));
            set.add(random.nextInt(10));
        }
        System.out.println(list.toString());
        System.out.println(map);
        System.out.println(set);
    }
}

结果:

[8, 5, 0, 7, 7]
{0=8, 1=3, 2=3, 3=4, 4=9}
[1, 7, 3, 4, 2]

容器的添加和删除

对于Collection 接口下的类

boolean add(E e);

boolean remove(Object o);

boolean addAll(Collection<? extends E> c);

boolean removeAll(Collection<?> c);

Map

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

void clear();

V put(K key, V value);

default boolean remove(Object key, Object value) ;

容器的迭代或遍历

1. 迭代器Iterator遍历

对于Collection容器只需要调用iterator() 方法。获得iterator对象即可。
对于Map对象 只有用entry对象才有iterator方法

 public static void main(String[] args){
        Random random = new Random(11);
        List<Integer> list = new ArrayList<>();
        Map<Integer,Integer> map = new TreeMap<>();
        Set<Integer> set = new LinkedHashSet<>();
        for(int i = 0;i < 5;i++){
            list.add(random.nextInt(10));
            map.put(i,random.nextInt(10));
            set.add(random.nextInt(10));
        }
        // 获取迭代器对象
        Iterator<Integer>  iterator1 = list.iterator();
        Iterator<Integer> iterator2 = set.iterator();
        Iterator<Map.Entry<Integer,Integer>> iterator3= map.entrySet().iterator();
        
        while (iterator1.hasNext()){
            System.out.print(iterator1.next()+" ");
        }
        System.out.println();
        while (iterator2.hasNext()){
            System.out.print(iterator2.next()+" ");
        }
        System.out.println();
        while (iterator3.hasNext()){
            Map.Entry entry = iterator3.next();
            System.out.print(entry.getKey()+":"+entry.getValue()+" ");
        }
        System.out.println();
    }
8 5 0 7 7 
1 7 3 4 2 
0:8 1:3 2:3 3:4 4:9

2. 实现Iterable接口 可以用for each 来遍历

public static void main(String[] args){
        Random random = new Random(11);
        List<Integer> list = new ArrayList<>();
        Map<Integer,Integer> map = new TreeMap<>();
        Set<Integer> set = new LinkedHashSet<>();
        for(int i=0;i<5;i++){
            list.add(random.nextInt(10));
            map.put(i,random.nextInt(10));
            set.add(random.nextInt(10));
        }
        for(Integer num: list){
            System.out.print(num+" ");
        }
        System.out.println();
        for(Integer num: set){
            System.out.print(num+" ");
        }
        System.out.println();
        for(Map.Entry entry :map.entrySet()){
            System.out.print(entry.getKey()+":"+entry.getValue()+" ");
        }
        System.out.println();
    }
8 5 0 7 7 
1 7 3 4 2 
0:8 1:3 2:3 3:4 4:9 

容器的比较

发布了22 篇原创文章 · 获赞 2 · 访问量 881

猜你喜欢

转载自blog.csdn.net/weixin_41685373/article/details/96740134