Java集合基础知识分享

版权声明:版权声明:本文为博主原创文章,欢迎声明转载,博客地址: https://blog.csdn.net/c851204293/article/details/81673220

Java基础知识–集合

为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

本次分享为Java中的常用集合:

  • ArrayList
  • LinkedList
  • HashSet
  • TreeSet
  • HashMap
  • TreeMap
  • 集合元素的三种取出方法

目录


Collection

Collection定义了集合框架的共性功能。
1,添加
add(e);
addAll(collection);

2,删除
remove(e);
removeAll(collection);
clear();

3,判断。
contains(e);
isEmpty();

4,获取
iterator();
size();

5,获取交集。
retainAll();

6,集合变数组。
toArray();


1,add方法的参数类型是Object。以便于接收任意类型对象。

2,集合中存储的都是对象的引用(地址)

  • Collection常用方法演示代码
class  CollectionDemo
{
    public static void main(String[] args) 
    {

        method_get();
    }
    public static void method_get()
    {
        ArrayList al = new ArrayList();

        //1,添加元素。
        al.add("java01");//add(Object obj);
        al.add("java02");
        al.add("java03");
        al.add("java04");

        /*
        Iterator it = al.iterator();//获取迭代器,用于取出集合中的元素。

        while(it.hasNext())
        {
            sop(it.next());
        }
        */

        for(Iterator it = al.iterator(); it.hasNext() ; )
        {
            sop(it.next());
        }
    }


    public static void method_2()
    {
        ArrayList al1 = new ArrayList();

        al1.add("java01");
        al1.add("java02");
        al1.add("java03");
        al1.add("java04");
        ArrayList al2 = new ArrayList();

        al2.add("java03");
        al2.add("java04");
        al2.add("java05");
        al2.add("java06");


        //al1.retainAll(al2);//去交集,al1中只会保留和al2中相同的元素。
        al1.removeAll(al2);

        sop("al1:"+al1);
        sop("al2:"+al2);




    }

    public static void base_method()
    {
        //创建一个集合容器。使用Collection接口的子类。ArrayList
        ArrayList al = new ArrayList();

        //1,添加元素。
        al.add("java01");//add(Object obj);
        al.add("java02");
        al.add("java03");
        al.add("java04");

        //打印原集合。
        sop("原集合:"+al);


        //3,删除元素。
        //al.remove("java02");
        //al.clear();//清空集合。


        //4,判断元素。
        sop("java03是否存在:"+al.contains("java03"));
        sop("集合是否为空?"+al.isEmpty());


        //2,获取个数。集合长度。
        sop("size:"+al.size());

        //打印改变后的集合。
        sop(al);

    }

    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}

List

Collection
  |–List:元素是有序的,元素可以重复。因为该集合体系有索引。
    |–ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
    |–LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
    |–Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。

  |–Set:元素是无序,元素不可以重复。


List:
特有方法。凡是可以操作角标的方法都是该体系特有的方法。

add(index,element);
addAll(index,Collection);


remove(index);


set(index,element);


get(index):
subList(from,to);
listIterator();
int indexOf(obj):获取指定元素的位置。
ListIterator listIterator();

  • List常用方法演示代码
class ListDemo 
{
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
    public static void method()
    {

        ArrayList al = new ArrayList();

        //添加元素
        al.add("java01");
        al.add("java02");
        al.add("java03");

        sop("原集合是:"+al);
        //在指定位置添加元素。
        al.add(1,"java09");

        //删除指定位置的元素。
        //al.remove(2);

        //修改元素。
        //al.set(2,"java007");

        //通过角标获取元素。
        sop("get(1):"+al.get(1));

        sop(al);

        //获取所有元素。
        for(int x=0; x<al.size(); x++)
        {
            System.out.println("al("+x+")="+al.get(x));
        }

        Iterator it = al.iterator();

        while(it.hasNext())
        {
            sop("next:"+it.next());
        }


        //通过indexOf获取对象的位置。
        sop("index="+al.indexOf("java02"));

        List sub = al.subList(1,3);

        sop("sub="+sub);
    }


    public static void main(String[] args) 
    {

        //演示列表迭代器。
        ArrayList al = new ArrayList();

        //添加元素
        al.add("java01");
        al.add("java02");
        al.add("java03");

        sop(al);


        ListIterator li = al.listIterator();


        //sop("hasPrevious():"+li.hasPrevious());

        while(li.hasNext())
        {
            Object obj = li.next();

            if(obj.equals("java02"))
                //li.add("java009");
                li.set("java006");


        }

        while(li.hasPrevious())
        {
            sop("pre::"+li.previous());
        }
        //sop("hasNext():"+li.hasNext());
        //sop("hasPrevious():"+li.hasPrevious());


        sop(al);



        /*
        //在迭代过程中,准备添加或者删除元素。

        Iterator it = al.iterator();

        while(it.hasNext())
        {
            Object obj = it.next();

            if(obj.equals("java02"))
                //al.add("java008");
                it.remove();//将java02的引用从集合中删除了。

            sop("obj="+obj);


        }
        sop(al);
        */
    }
}
  • List集合判断元素是否相同,依据是元素的equals方法
class Person
{
    private String name;
    private int age;
    Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public boolean equals(Object obj)
    {

        if(!(obj instanceof Person))
            return false;

        Person p = (Person)obj;
        //System.out.println(this.name+"....."+p.name);

        return this.name.equals(p.name) && this.age == p.age;
    }
    /**/
    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
}
class ArrayListTest2 
{
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
    public static void main(String[] args) 
    {
        ArrayList al = new ArrayList();

        al.add(new Demo());

        al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj = new Person("lisi01",30);
        //al.add(new Person("lisi02",32));
        al.add(new Person("lisi02",32));
        al.add(new Person("lisi04",35));
        al.add(new Person("lisi03",33));
        //al.add(new Person("lisi04",35));


        //al = singleElement(al);

        sop("remove 03 :"+al.remove(new Person("lisi03",33)));//remove方法底层也是依赖于元素的equals方法。


        Iterator it = al.iterator();


        while(it.hasNext())
        {
            Person p = (Person)it.next();
            sop(p.getName()+"::"+p.getAge());
        }
    }


    public static ArrayList singleElement(ArrayList al)
    {
        //定义一个临时容器。
        ArrayList newAl = new ArrayList();

        Iterator it = al.iterator();

        while(it.hasNext())
        {
            Object obj = it.next();

            if(!newAl.contains(obj))
                newAl.add(obj);

        }

        return newAl;
    }
}

ArrayList

Collection
  |–List:元素是有序的,元素可以重复。因为该集合体系有索引。
    |–ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
    |–LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
    |–Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。

  |–Set:元素是无序,元素不可以重复。

  • 去除ArrayList集合中的重复元素
class ArrayListTest 
{

    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
    public static void main(String[] args) 
    {
        ArrayList al = new ArrayList();

        al.add("java01");
        al.add("java02");
        al.add("java01");
        al.add("java02");
        al.add("java01");
//      al.add("java03");


        /*
        在迭代时循环中next调用一次,就要hasNext判断一次。
        Iterator it = al.iterator();

        while(it.hasNext())
        {
            sop(it.next()+"...."+it.next());
        }
        */

        /**/
        sop(al);

        al = singleElement(al);

        sop(al);


    }

    public static ArrayList singleElement(ArrayList al)
    {
        //定义一个临时容器。
        ArrayList newAl = new ArrayList();

        Iterator it = al.iterator();

        while(it.hasNext())
        {
            Object obj = it.next();

            if(!newAl.contains(obj))
                newAl.add(obj);

        }

        return newAl;
    }
}

LinkedList

Collection
  |–List:元素是有序的,元素可以重复。因为该集合体系有索引。
    |–ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
    |–LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
    |–Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。

  |–Set:元素是无序,元素不可以重复。


LinkedList:特有方法:
addFirst();
addLast();

getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

在JDK1.6出现了替代方法。

offerFirst();
offerLast();

peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。

pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。


  • LinkedList特有方法演示代码
class LinkedListDemo 
{
    public static void main(String[] args) 
    {
        LinkedList link = new LinkedList();

        link.addLast("java01");
        link.addLast("java02");
        link.addLast("java03");
        link.addLast("java04");

        //sop(link);
//      sop(link.getFirst());
//      sop(link.getFirst());
        //sop(link.getLast());
        //sop(link.removeFirst());
        //sop(link.removeFirst());

        //sop("size="+link.size());

        while(!link.isEmpty())
        {
            sop(link.removeLast());
        }

    }

    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}

Set

|–Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
  |–HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。

注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

  |–TreeSet:

Set集合的功能和Collection是一致的。



  • Set无序不重复代码演示
class HashSetDemo 
{
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
    public static void main(String[] args) 
    {

        HashSet hs = new HashSet();

        sop(hs.add("java01"));
        sop(hs.add("java01"));
        hs.add("java02");
        hs.add("java03");
        hs.add("java03");
        hs.add("java04");

        Iterator it = hs.iterator();

        while(it.hasNext())
        {
            sop(it.next());
        }
    }
}

HashSet

|–Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
  |–HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。

注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

  |–TreeSet:

Set集合的功能和Collection是一致的。

- HashSet唯一性实现代码示例

class HashSetDemo 
{
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
    public static void main(String[] args) 
    {

        HashSet hs = new HashSet();

        sop(hs.add("java01"));
        sop(hs.add("java01"));
        hs.add("java02");
        hs.add("java03");
        hs.add("java03");
        hs.add("java04");

        Iterator it = hs.iterator();

        while(it.hasNext())
        {
            sop(it.next());
        }
    }
}

TreeSet

Set:无序,不可以重复元素。
|–HashSet:数据结构是哈希表。线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode值是否相同。
如果相同,还会继续判断元素的equals方法,是否为true。

  |–TreeSet:可以对Set集合中的元素进行排序。
    底层数据结构是二叉树。
    保证元素唯一性的依据:
    compareTo方法return 0.

    TreeSet排序的第一种方式:让元素自身具备比较性。
    元素需要实现Comparable接口,覆盖compareTo方法。
    也种方式也成为元素的自然顺序,或者叫做默认顺序。

    TreeSet的第二种排序方式。
    当元素自身不具备比较性时,或者具备的比较性不是所需要的。
    这时就需要让集合自身具备比较性。
    在集合初始化时,就有了比较方式。

- 第一种排序方法演示

class TreeSetDemo 
{
    public static void main(String[] args) 
    {
        TreeSet ts = new TreeSet();

        ts.add(new Student("lisi02",22));
        ts.add(new Student("lisi007",20));
        ts.add(new Student("lisi09",19));
        ts.add(new Student("lisi08",19));
        //ts.add(new Student("lisi007",20));
        //ts.add(new Student("lisi01",40));

        Iterator it = ts.iterator();
        while(it.hasNext())
        {
            Student stu = (Student)it.next();
            System.out.println(stu.getName()+"..."+stu.getAge());
        }
    }
}


class Student implements Comparable//该接口强制让学生具备比较性。
{
    private String name;
    private int age;

    Student(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public int compareTo(Object obj)
    {

        //return 0;

        if(!(obj instanceof Student))
            throw new RuntimeException("不是学生对象");
        Student s = (Student)obj;

        System.out.println(this.name+"....compareto....."+s.name);
        if(this.age>s.age)
            return 1;
        if(this.age==s.age)
        {
            return this.name.compareTo(s.name);
        }
        return -1;
        /**/
    }

    public String getName()
    {
        return name;

    }
    public int getAge()
    {
        return age;
    }
}
  • 第二种排序方法演示
 class Student implements Comparable//该接口强制让学生具备比较性。
{
    private String name;
    private int age;

    Student(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public int compareTo(Object obj)
    {

        //return 0;

        if(!(obj instanceof Student))
            throw new RuntimeException("不是学生对象");
        Student s = (Student)obj;

        //System.out.println(this.name+"....compareto....."+s.name);
        if(this.age>s.age)
            return 1;
        if(this.age==s.age)
        {
            return this.name.compareTo(s.name);
        }
        return -1;
        /**/
    }

    public String getName()
    {
        return name;

    }
    public int getAge()
    {
        return age;
    }
}
class TreeSetDemo2 
{
    public static void main(String[] args) 
    {
        TreeSet ts = new TreeSet();

        ts.add(new Student("lisi02",22));
        ts.add(new Student("lisi02",21));
        ts.add(new Student("lisi007",20));
        ts.add(new Student("lisi09",19));
        ts.add(new Student("lisi06",18));
        ts.add(new Student("lisi06",18));
        ts.add(new Student("lisi007",29));
        //ts.add(new Student("lisi007",20));
        //ts.add(new Student("lisi01",40));

        Iterator it = ts.iterator();
        while(it.hasNext())
        {
            Student stu = (Student)it.next();
            System.out.println(stu.getName()+"..."+stu.getAge());
        }
    }
}

class MyCompare implements Comparator
{
    public int compare(Object o1,Object o2)
    {
        Student s1 = (Student)o1;
        Student s2 = (Student)o2;

        int num = s1.getName().compareTo(s2.getName());
        if(num==0)
        {

            return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
            /*
            if(s1.getAge()>s2.getAge())
                return 1;
            if(s1.getAge()==s2.getAge())
                return 0;
            return -1;
            */
        }


        return num;

    }
}

Map

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
1,添加。
put(K key, V value)
putAll(Map

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

        //添加元素,添加元素,如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。
        //并put方法会返回被覆盖的值。
        System.out.println("put:"+map.put("01","zhangsan1"));
        System.out.println("put:"+map.put("01","wnagwu"));
        map.put("02","zhangsan2");
        map.put("03","zhangsan3");

        System.out.println("containsKey:"+map.containsKey("022"));
        //System.out.println("remove:"+map.remove("02"));

        System.out.println("get:"+map.get("023"));

        map.put("04",null);
        System.out.println("get:"+map.get("04"));
        //可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断。



        //获取map集合中所有的值。
        Collection<String> coll = map.values();

        System.out.println(coll);
        System.out.println(map);


    }
}

map集合的两种取出方式:
1,Set keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。
2,将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry

Entry其实就是Map中的一个static内部接口。
为什么要定义在内部呢?
因为只有有了Map集合,有了键值对,才会有键值的映射关系。
关系属于Map集合中的一个内部事物。
而且该事物在直接访问Map集合中的元素。

  • Map集合的两种取出方式
class MapDemo2 
{
    public static void main(String[] args) 
    {
        Map<String,String> map = new HashMap<String,String>();

        map.put("02","zhangsan2");
        map.put("03","zhangsan3");
        map.put("01","zhangsan1");
        map.put("04","zhangsan4");

        //将Map集合中的映射关系取出。存入到Set集合中。
        Set<Map.Entry<String,String>> entrySet = map.entrySet();

        Iterator<Map.Entry<String,String>> it = entrySet.iterator();

        while(it.hasNext())
        {
            Map.Entry<String,String> me = it.next();
            String key = me.getKey();
            String value = me.getValue();

            System.out.println(key+":"+value);

        }

        /*
        //先获取map集合的所有键的Set集合,keySet();
        Set<String> keySet = map.keySet();

        //有了Set集合。就可以获取其迭代器。
        Iterator<String> it = keySet.iterator();

        while(it.hasNext())
        {
            String key = it.next();
            //有了键可以通过map集合的get方法获取其对应的值。
            String value  = map.get(key);
            System.out.println("key:"+key+",value:"+value);
        }

        */

    }
}


Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。

interface Map
{
    public static interface Entry
    {
        public abstract Object getKey();
        public abstract Object getValue();

    }
}

class HashMap implements Map
{
    class Hahs implements Map.Entry
    {
        public  Object getKey(){}
        public  Object getValue(){}
    }

}

集合元素的三种取出方式

第一种:迭代器Iterator

  • 迭代是取出集合中元素的一种方式
  • 因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。
    用法:
for(Iterator iter = iterator();iter.hasNext();  )
{
    System.out.println(iter.next());
}

第二种:超级for循环

  • Collection在JDK1.5后出现的父接口Iterable就是提供了这个for语句。
  • 格式:
for(数据类型 变量名 : 数组或Collection集合)
{
    执行语句;
}
  • 简化了对数组,集合的遍历。

第三种:Java新特性中的流式表达

  • 在java8中可以使用 foreach + 拉姆达表达式遍历(推荐使用)
  • 用法
al.forEach(p -> {
            sop(p);
        });


- 三种方法的具体实现代码

class CollectionDemo {
    public static void main(String[] args) {

        method_get();
    }

    public static void method_get() {
        ArrayList<String> al = new ArrayList<String>();

        // 1,添加元素。
        al.add("java01");// add(Object obj);
        al.add("java02");
        al.add("java03");
        al.add("java04");

        // 迭代器Iterator
        /*
         * for(Iterator it = al.iterator(); it.hasNext() ; ) { sop(it.next()); }
         */

        // 超级for循环
        for (String p : al) {
            sop(p);
        }

        // 新特性forEach
        /*al.forEach(p -> {
            sop(p);
        });*/
    }

    public static void sop(Object obj) {
        System.out.println(obj);
    }
}

资源链接

https://download.csdn.net/download/c851204293/10603885

猜你喜欢

转载自blog.csdn.net/c851204293/article/details/81673220