JAVA集合

目录

一、集合概念:

三、Collection接口与 List接口

        1.Collection 接口-定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式

        2.List接口:

                (1)ArrayList:

                (2)LinkList:

                (3)Vector:

                (4)代码实现:

四、Set接口:

        1、HashSet:

        代码实现:

        2、TreeSet:

        代码实现:

五、Map接口:

        1.Map :

        代码实现:

        2.Hashtable:

        代码实现:

 ​编辑

Collection代码实现:


一、集合概念:

        在java开发过程中,通常需要保存一些要变长的数据集合,于是我们需要一些能动态增长长度的容器来保存数据,于是就要用到各种各样的数据结构,java中对于各数据结构的实现就是我们用到的集合。

二、集合API

三、Collection接口与 List接口

        1.Collection 接口-定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式

        2.List接口:

                (1)ArrayList:

                        顺序结构,采用数组方式存储数据;

                (2)LinkList:

                        链表;

                (3)Vector:

                        数组实现,添加同步锁,多线程安全;

                (4)代码实现:

                

import java.util.*;

public class arr {
    /*
            List接口实现类
                ArrayList   可以保存重复元素,底层是数组实现,添加元素的类型可以使任意类型的
                虽然集合中默认是可以添加任意数据类型,但是后续处理时,会出现类型转换问题;
                所有java中的集合都支持自定义类型(泛型   把类型当做参数传递);
         */
    public static void main(String[] args) {
        ArrayList<String> array=new ArrayList<>();
        array.add("kjo");
        ArrayList<Integer>arrayl=new ArrayList<>();
        array.add("s");//向末尾添加元素,会自动扩容
        array.add("s");
        array.add("s");
        array.add("s");
        array.add("s");
        array.add("s");
        array.add("s");
        array.add("s");
        array.add("s");
        array.add("s");
        array.add("s");
        array.add(2,"c");//向指定位置添加元素,从零开始,位置需在实际装入元素个数范围内;
        array.remove("s");//根据元素内容删除数据,只删除匹配的第一个元素;
        String s=array.remove(2);//删除并返回指定位置的元素;
        //array.clear();清空集合;
        //System.out.println(array.indexOf("c"));返回元素第一次出现的位置;
        //System.out.println(array.contains("s"));判断是否包含指定元素;
        //System.out.println(array.get(2));获得指定位置上的元素;
        //System.out.println(array.isEmpty());判断集合中的元素是否为空;
        //array.set(2,"f");替换指定位置的元素
        //System.out.println(array.size());获得集合中实际元素的个数,也是集合的长度;
        
        LinkedList<String> link=new LinkedList<>();
        link.add("d");
        link.add("d");
        link.add("c");
        link.add("b");
        link.add("v");
        link.add("d");
        ListIterator<String> itr=link.listIterator(link.size());
        while(itr.hasPrevious()){
            String r=itr.previous();
            if (r.equals("d")){
                itr.remove();
            }
        }
        System.out.println(link);
    }
}
class Link{
    /*
        List接口实现类
            LinkedList
                底层由链表实现,每个数据封装在node中;
     */

    /*
        数组利用率可能会有浪费的,但是建表不会浪费空间
        链表中间增减元素时间复杂度为o(1);数组时间复杂度为o(n);
        而数组查找元素的时间复杂度为o(1),链表则为o(n);
     */
    public static void main(String[] args) {
        LinkedList<String> link =new LinkedList<>();
        link.add("w");
        link.add("q");
        link.add("e");
        link.add("r");
        link.add(3,"x");
        link.contains("jhk");
        link.remove("s");
        System.out.println(link.contains("j"));
    }
}
class vect{
    /*
        Vector
            数组实现,有synchronized修饰,可支持多线程操作;
                多线程,安全的;
     */
    public static void main(String[] args) {
        Vector<String> ve=new Vector<>();
        ve.add("1");
        ve.add("2");
        ve.add("3");
        ve.add("4");
        ve.add("4");
        ve.add("5");
        ve.add("6");
        ve.add("7");
        ve.add("8");
        ve.add("9");
        ve.add("10");
        //与ArrayList一样,初始长度为10,若超过,则会扩容相当于自身50%的长度;
    }
}

                (5)List类的遍历方式:

        /*1.for循环遍历:
            for(int x=0;x<array.size();x++){
                System.out.println(array.get(x));
            }
            for循环是支持删除元素的,但后面的元素会向前移动,需要控制索引;
        */
        /*2.增强for循环:
            for (String c : array){
                System.out.println(c);
            }
            用来从头到尾遍历的,不能指定开始与结束位置,不支持删除元素;
         */
        /*3.用迭代器进行遍历:
            Iterator<String> it= array.iterator();
            while(it.hasNext){
                String e=it.next();
                if(e.equals("a")){
                    it.remove();//迭代器中的删除方法;
                }
            }
            迭代器支持删除元素且不会漏掉;
*/
         

四、Set接口:

        1、HashSet:

        元素是无序的(既不是添加顺序,也不是自然顺序) 向hashset中添加元素时,是如何判断元素是否重复的 底层用到hashCode()和equals()方法,“sfsgdhjk” 用内容计算一个hash值(整数),用hash值比较速度快;

但是hash值不安全,有可能hash值相同但内容不一样; 所以当hash值相同时,调用equals()判断内容 这样提高了代码效率也保证了安全;

        代码实现:

class setdemo implements Comparable<setdemo>{
    int num;
    String name;
    setdemo(){}
    setdemo(int num,String name){
        this.num=num;
        this.name=name;
    }

    @Override
    public int compareTo(setdemo o) {
        return this.num-o.num;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        setdemo setdemo = (setdemo) o;
        return num == setdemo.num &&
                name.equals(setdemo.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(num, name);
    }

    @Override
    public String toString() {
        return  "\t"+num + "  "+name ;
    }

    public static void main(String[] args) {
        HashSet<setdemo> s=new HashSet<>();
        setdemo s1=new setdemo(101,"张三");
        setdemo s2=new setdemo(102,"李四");
        setdemo s3=new setdemo(103,"王五");
        setdemo s4=new setdemo(104,"刘六");
        s.add(s1);
        s.add(s2);Iterator it=s.iterator();

        s.add(s3);
        s.add(s4);

        System.out.println(s.toString());
        /*
            添加时判断会调用类中hashCode()计算hash值,类中没有hashCode()会调用父类中的hashCode方法;
            调用父类的hashCod()是用地址来计算的,若是new两个一模一样的对象,地址会不一样,则两个对象hash值不同;
            在本类中重写hashCode()方法和equals(),用内容来计算,则就算new多个相同内容的新对象也不影响;
         */
    }
}

 

        2、TreeSet:

                底层是树形结构;

        代码实现:

class treesetdemo{
    /*
        Set 不能存储重复元素
            TreeSet
                底层是树形结构
                添加进来的元素可以排序(有序的,不是添加顺序,是元素的自然顺序)
     */
    public static void main(String[] args) {
        TreeSet<String> ts=new TreeSet<>();
        ts.add("9asdf");
        ts.add("sgdf");
        ts.add("chg");
        ts.add("067y");
        System.out.println(ts);
        ts.pollLast();//删除并返回最后一个元素
        ts.pollFirst();//删除并返回第一个元素
    }
}

 

五、Map接口:

        1.Map :

         键 值对

         键不能重复,值可以重复 一个键映射到一个值 HashMap中,键是无序的;

         TreeMap 底层使用树形结构 键能排序,键的类型必须实现compare接口

        代码实现:

        

class hashmapdemo{
    public static void main(String[] args) {
        HashMap<String,String> in=new HashMap<>();
        in.put("1","3");
        in.put("s","d");
        in.put("f","gf");
        HashMap<String,String>hm=new HashMap<>();
        hm.put("e","s");
        hm.put("s","f");
        hm.put("f","c");
        hm.put("rt","c");
        hm.put("e","c");
        System.out.println(hm.get("s"));
        //hm.clear();删除键值映射,返回该键的值;
        System.out.println(hm.containsKey("e"));
        System.out.println(hm.containsValue("c"));
        System.out.println(hm.size());
        Collection<String> key=hm.keySet();
        System.out.println(key);
        Collection<String> value=hm.values();
        System.out.println(value);
    }
}

        2.Hashtable:

        底层结构与HashMap相同,但是相对于HashMap来说安全,其方法添加了synchronized; TreeMap允许键或值中存放null; Hashtable不允许存放null关键字;

        代码实现:

class Hashtabledemo{
    public static void main(String[] args) {
        Hashtable<String,String>ht=new Hashtable<>();
        ht.put("s","g");
        ht.put("s","v");
        ht.put("e","x");
        ht.put("d","n");
        //通过entrySet    获取到一个Entry类型的集合,entry中放有键值;
        Set<Map.Entry<String,String>> entries=ht.entrySet();
        for(Map.Entry entry : entries){
            System.out.println(entry.getKey()+":"+entry.getValue());
        }
    }
}

 

Collection代码实现:

class CollectionsDemo{
    /*
        类型...参数名    可变长度的参数,本质是数组
        一个参数列表中,只能有一个可变长度的参数,而且必须放在参数列表的末尾
        可以传入任意个参数;
     */
    public static void test(int b,int ...a){

    }
    public static void main(String[] args) {
        ArrayList<Integer> arr=new ArrayList<>();
        arr.add(2);
        arr.add(3);
        Collections.addAll(arr,1,2,3,4,5,6,7,8,9,10);
        Collections.sort(arr);
        Collections.swap(arr,5,7);
        System.out.println(Collections.binarySearch(arr,2));
        System.out.println(arr);
        ArrayList<Integer> arr1=new ArrayList<>();
        arr1.add(13);
        arr1.add(26);
        arr1.add(35);
        Collections.copy(arr,arr1);//将第二个几何元素复制到第一个集合中,注意第一个集合的size要大于第二个集合的size;
        System.out.println(arr);
        Collections.reverse(arr);//逆序
        Collections.shuffle(arr);//随机顺序排放
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aruiiiiiii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值