java的类集

集合

 

类集的三大接口:Iterator、Collection、Map

Collection

Collection有三大子接口:List、Set、Queue

单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List和java.util.Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素不可重复。List接口的主要实现类有java.util.ArrayList和java.util.LinkedList,Set接口的主要实现类有java.util.HashSet和java.util.LinkedHashSet。

主要方法操作所有单列集合:

public boolean add(E e):把给定的对象添加到当前集合中 。

public void clear():清空集合中所有的元素。

public boolean remove(E e): 把给定的对象在当前集合中删除。

public boolean contains(Object obj): 判断当前集合中是否包含给定的对象。

public boolean isEmpty(): 判断当前集合是否为空。

public int size(): 返回集合中元素的个数。

public Object[] toArray(): 把集合中的元素,存储到数组中

List

List接口->抽象类:AbstractList->实现类:Vector->子类Stack、ArrayList、AbstractSequentialList->子类LinkedList.

List是有序集合(也称为序列 ),存储有序 。该接口的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。与集合不同,列表通常允许重复元素。

Vector类

Vector是同步的。 如果不需要线程安全实现,存储是有序的且可重复的。建议使用ArrayList代替Vector 。

错误示范:

//构造一个空向量,使其内部数据数组的大小为 10 ,其标准容量增量为零。
Vector vector = new Vector();
//添加一个元素
vector.add("1");
vector.add("2");
vector.add("3");
//迭代器转化
Iterator iterator = vector.iterator();
//此时使用vector的remove方法删除后使用迭代器输出会抛出ConcurrentModificationException异常
vector.remove(0);
iterator.remove();
while (iterator.hasNext()){
    System.out.println(iterator.next());


}

 

Stack类

继承了Vector类,也是同步的。

//栈,遵循先进后出
Stack stack = new Stack();
//分别对1-4进行入栈操作,也可以使用add()方法进行添加元素
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
System.out.println(stack.toString());
//进行一次出栈,会把4给删除,也可以使用remove()方法进行删除指定元素
stack.pop();
System.out.println(stack.toString());

stack.peek()方法返回栈帧元素

empty() 判断栈是否为空

ArrayList

ArrayList在new 对象时调用空构造方法时arraylist的长度为0;当add一个元素时会先进行扩容再存入,初始化长度为10。每次当前容量满了之后会进行扩容,扩容现在数组长度的1.5倍size*1.5。

Grow()--oldCapacity + (oldCapacity >> 1);

旧长度+旧长度/2

如果超过了int类型的最大值则赋予容量为:Integer.MAX_VALUE - 8

list.forEach(s-> System.out.println(s));遍历list

indexOf()返回传入字符的第一个位置,如果没有则返回-1。

isEmpty()判断是否为空。

size()返回当前元素个数。

LinkedList类

三种插入方式:

list.add(Object o);直接在结尾插入
list.add(int index,Object o);在指定下标插入
list.addFirst(Object o);在头部插入

list.addLast(Object o);在尾部插入

三种删除方式:

list.remove();
list.remove(int index);
list.remove(Object o);

contains(Object o)判断是否存在此元素

Set

HashSet

存储不按照输入的顺序。没有重复的元素,底层是hashmap。

HashSet在进行add方法时会ruturn一个Map集合,键值为add的数值,value为null。

使用迭代器遍历。

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

TreeSet

TreeSet的底层用到了TreeMap存储。

tree.add(Object o);添加元素

tree.ceiling(Object o);返回大于或等于o的最小元素,若没有则返回null

tree.higher(Object o)返回大于o的最小元素,若没有则返回null

tree.lower(Object o)返回小于o的最大元素,若没有则返回null

tree.floor(Object o)返回小于或等于o的最大元素

tree.first()返回第一个元素。

tree.contains(Object o))判断树是否包含此元素。

tree.descendingIterator()返回一个逆序的迭代器。

tree.pollFirst()删除第一个节点并返回值

TreeSet实现Comparable接口的CompareTo方法可以实现对象的排序。

如实现学生中成绩按降序排列,如果成绩相同则年龄小的先排。

@Override
public int compareTo(Student o) {
    if (o.score> this.score) {
        return 1;
    }
    if (o.score == this.score) {
        if (o.age<this.age){
            return 1;
        }
    }
    return -1;
}

Map

HashMap

部分成员变量如下:

//初始值,为16,必须为2的次幂

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;    

//当容量被占满0.75时就需要reSize扩容,扩容机制*2

static final float DEFAULT_LOAD_FACTOR = 0.75f;

//链表长度到8,就转为红黑树

static final int TREEIFY_THRESHOLD = 8;

// 树大小为6,就转回链表

static final int UNTREEIFY_THRESHOLD = 6;

调用hashmap的空构造方法时会给一个加载因子为0.75。当进行put()添加元素时会运行

return putVal(hash(key), key, value, false, true);

先将得到key的hash值,key为null时hash值为0,如果key不为null则用key的hashcode与其右移16为异或。

map.put(Object key,Object value);添加键和值

map.entrySet()转为set集合

remove(Object key)删除key的值,如果存在则返回其key,反之返回null

remove(Object key, Object value)如果删除成功则ture

map.keySet()获取key的值配合map.get()方法可以获取value值(效率低)

方法一(低效率):

for (String s:map.keySet()) {
    System.out.println("key:"+s+"\tvalue"+map.get(s));
}

方法二:常用

for (Map.Entry<String, Integer> entry : map.entrySet()) {
  System.out.println("key:"+entry.getKey()+"\t"+"value:"+entry.getValue());
}

方法三:迭代器,比方法二多一个步奏

Iterator<Map.Entry<String, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry<String, Integer> entry = entries.next();
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

还有map.values()可以进行遍历value值。

JDK8中采用的是位桶+链表/红黑树。当(哈希桶存储数)链表长度>8时转化为红黑树,当树节点数(哈希桶存储数)从大于8变为6时转化为链表。初始桶数量为16扩容为*2。

TreeMap

TreeMap底层是红黑树,能够实现该Map集合有序

put(K key, V value);添加元素

remove(Object key, Object value)删除元素

遍历方式:

for (Map.Entry<String, Integer> entry : tree.entrySet()) {
    System.out.println(entry.getKey() +"\t" + entry.getValue());
}

如果在构造方法中传递了Comparator对象,那么就会以Comparator对象的方法进行比较。否则,则使用Comparable的compareTo(T o)方法来比较。

key一定是不能为null

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值