Java基础-集合

Java集合

Java基础第二篇-集合

1 集合概述

集合类主要由两个接口派生:Collection和Map

Set:无序集合,不可重复

Queue:队列

List:有序集合,可以重复

2.Collection和Iterator接口

Collection接口是List Set Queue接口的父接口,常用的有以下方法:

boolean add(Object o):添加元素

boolean addAll(Collection c):把集合中所有元素添加到指定集合中,集合对象被改变了,则返回true

void clear(): 清除集合所有元素

boolean contains(Object c):返回集合是否包含指定元素

boolean containsAll(Collection c):返回集合是否包含c中所有元素

boolean isEmpty():返回集合是否为空

boolean remove(Object c):删除指定元素

boolean removeAll(Collection c):从集合中删除集合c包含的所有元素

boolean retainAll(Collection c):从集合中删除集合c不包含的元素

int size():返回集合元素个数

Object[] toArray():把集合转换成数组

一个小例子:

public class CollectionTest {

    public static void main(String[] args) {

        Collection c = new ArrayList();

        c.add("aaa");

        c.add(6);

        System.out.println("c集合的元素个数为:" + c.size());

        c.remove(6);

        System.out.println("c集合元素个数为:" + c.size());

        System.out.println("c集合是否包含'aaa':" + c.contains("aaa"));

        c.add("从零开始学Java");

        Collection books = new HashSet();

        books.add("从零开始学Java");

        books.add("从零开始学Python");

        System.out.println("集合c是否完全包含集合books:" + c.containsAll(books));

        c.removeAll(books);

        System.out.println("c集合去掉books后的元素:" + c);

        books.retainAll(c);

        System.out.println("books集合和c集合的交集元素:" + books);

    }

}

3.Iterator

Iterator:迭代器,主要用于遍历集合中的元素

boolean hasNext()

Object next()

void remove()

例子:

public class IteratorTest {

    public static void main(String[] args) {

        Collection books = new HashSet();

        books.add("aaa");

        books.add("bbb");

        books.add("ccc");

        Iterator it = books.iterator();

        while (it.hasNext()){

            String book = (String) it.next();

            System.out.println(book);

            if (book.equals("aaa")) it.remove();
        }
    }
}

注意:Iterator必须依附于Collection。

4.Set集合

Set集合不允许添加相同元素,判断方法是:equals,因此我们看看以下这个例子

public class SetTest {

    public static void main(String[] args) {

        Set books = new HashSet();

        books.add("aaa");

        boolean result = books.add("aaa");

        System.out.println(result + "--->" + books);
    }
}

打印结果为:

false--->[aaa]

因为这两个String不是同一个对象,==返回结果为false,但是Set中判断方式是equals,所以返回的是true,Set中最终只有一个aaa

HashSet类

通过hashCode()方法得到hashCode值,然后再决定存储位置。

HashSet判断两个元素相等标准是 equals()和hashCode()同时相同

特点:

> 不能保证元素的排列顺序,顺序可能会发生变化

> HashSet不是同步的

> 集合元素值可以是null

举个例子:

public class HashSetTest {

    public static void main(String[] args) {
        HashSet books = new HashSet();
        books.add(new A());
        books.add(new A());
        books.add(new B());
        books.add(new B());
        books.add(new C());
        books.add(new C());
        System.out.println(books);
    }
}
class A
{
    public boolean equals(Object c)
    {
        return true;
    }
}
class B
{
    public int hashCode()
    {
        return 1;
    }
}
class C
{
    public int hashCode() {
        return 2;
    }
    public boolean equals(Object c)
    {
        return true;
    }
}

输出结果:

[collection.A@5e2de80c, collection.B@1, collection.B@1, collection.C@2, collection.A@60e53b93]

两个A对象,两个B对象,一个C对象

说明只有equals()或者hashCode()相等,还是HashSet仍然把他们当成两个对象

TreeSet类

特点:确保集合元素处于排序状态。

常见方法:

    public static void main(String[] args) {

        TreeSet nums = new TreeSet();

        nums.add(5);

        nums.add(2);

        nums.add(10);

        nums.add(-2);

        System.out.println(nums);

        System.out.println("第一个元素:" + nums.first() +" 最后一个元素:" +  nums.last());

        System.out.println("小于4的元素集合:" + nums.headSet(4));

        System.out.println("大于5的元素集合:" + nums.tailSet(5));

        System.out.println("-5到2的集合: " + nums.subSet(-5,2));

    }
}

输出结果:

[-2, 2, 5, 10]
第一个元素:-2 最后一个元素:10
小于4的元素集合:[-2, 2]
大于5的元素集合:[5, 10]
-5到2的集合: [-2]

5 List集合

常见方法:

 public class ListTest {

    public static void main(String[] args) {

        List books = new ArrayList();

        books.add("aaa");
        books.add("bbb");
        books.add("ccc");

        System.out.println(books);

        books.add(1,"ddd"); // 在第二个位置插入ddd
        for (int i=0;i<books.size();i++)

        {
            System.out.println(books.get(i));
        }

        //删除第三个元素
        books.remove(2);

        System.out.println(books);

        //判断指定元素的位置
        System.out.println(books.indexOf("bbb"));

        books.set(1,"eee"); // 将第二个位置替换成eee

        System.out.println(books);
    }
}

6.Queue集合

特点:Queue用于模拟队列这种数据结构,具有FIFO-先进先出的特点。

常见方法:

void add(Object c): 指定元素加入队列尾部

Object element(): 获取队列头部元素

boolean offer(Object c): 将指定元素加入队列尾部

Object peek(): 获取队列头部元素

Object poll(): 获取队列头部元素,并删除

Object remove():删除队列头部元素

7.Map

特点:用于保存具有映射关系的数据,通常以键值对的形式存在.

HashMap和Hashtable实现类

Hashtable是线程安全的,但是HashMap是线程不安全的。

Hashtable不允许使用null作为key和value,但是HashMap可以

注意:key是唯一不可重复的

8.操作集合的工具类:Collections

排序操作:

static void reverse(List list):反转

static void shuffle(List list):随机排序

static void sort(List list):升序排序

static void sort(List list, Comparator c):根据Comparator产生的顺序排序

static void swap(List list,int i,int j):将i和j元素交换

static void rotate(List list,int distance):将后distance元素往前移

查找、替换操作

static int binarySearch(List list,Object key):二分查找(必须保证有序)

static Object max(Collection coll):找出最大值

static Object min(Collection coll):找出最小值

static void fill(List list,Object obj):指定元素obj替换List所有元素

static int frequency(Collection c,Object c):返回指定元素出现次数

static int indexOfSubList(List source,List target):返回子List对象在父List第一次出现的位置

static int lastIndexOfSubList(List source,List target):返回子List对象在父List最后一次出现的位置

static boolean replaceAll(List list,Object oldVal,Object newVal):替换

同步控制

Collections提供了多个synchronizedXxx()方法,用于把集合包装成线程同步的集合,从而解决多线程并发访问的安全问题。

例子:

public class SynchroinizedTest {

    public static void main(String[] args) {

        Collection c = Collections.synchronizedCollection(new ArrayList<>());

        List list = Collections.synchronizedList(new ArrayList<>());

        Set s = Collections.synchronizedSet(new HashSet<>());

        Map m = Collections.synchronizedMap(new HashMap<>());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值