Java中集合框架-简单解释

一、list

(1)List 是接口,继承至Collection接口(Collection接口下还有个Queue接口,有PriorityQueue类);

(2)List下有ArrayList,Vector,LinkedList

ArrayList的实现原理


/**
 * @author DouZi
 * @Blog areone.top
 */
public class DemoList {
    public static void main(String[] args) {
        List li = new ArrayList(); //创建一个集合元素  长度默认为10
        li.add("DouZi");
        li.add(21);
        li.add(new Date());
        System.out.println(li);
        li.add(2,"男"); //在下标为2的地方添加一个数据  数据要进行位移
        System.out.println(li);

        List li2 = new ArrayList();
        li2.add("a");
        li2.add("b");
        li.addAll(li2);
        System.out.println(li);

        //删除
        li.remove(2); //删除下标2
        li.clear();//清空
         li.set(2,"刘德华");//修改操作

    }
}

 Demo2:

public class DemoList01 {
    public static void main(String[] args) {
        List li = new ArrayList(); //创建一个集合元素  长度默认为10
        li.add("DouZi1");
        li.add("DouZi2");
        li.add("DouZi3");
        //查询
        Object o = li.get(0);
        System.out.println(o);

        int s = li.size();
        System.out.println(s);

        boolean f = li.contains("java01");
        System.out.println(f);

        int index = li.indexOf("DouZi2");
        System.out.println(index);

        //遍历集合中的元素
        for (Object obj : li) {
            System.out.println(obj);
        }

    }
}

ArrayList的优缺点

优点:底层数据结构是数组,查询快,增删慢。

缺点: 线程不安全,效率高

二、ArrayList集合

ArrayList的底层代码:

从构造方法来入手。new ArrayList(22) 底层声明了一个Object类型的数组 名字elementData
  Object[] elementData

  public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) { //大于0
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) { //等于初始化为一个空数组
            this.elementData = EMPTY_ELEMENTDATA;
        } else { //抛出一个异常
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

==========add("java01")======E理解为Object类型================  
   public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // 扩容 
        elementData[size++] = e;  //把元素赋值给数组的相应位置
        return true;
    }
==========indexOf("java02") 判断元素在集合中第一次的位置=============
     public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i])) //和数组中的每个元素内容进行比对
                    return i;  //返回元素在集合中位置
        }
        return -1;
    }   

===========size() 请求数组的长度======================
 public int size() {
        return size;
    }   

============contain("java05")判断元素是否在集合中==============
    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }
===============get(1) 获取指定位置的元素========
   public E get(int index) {
        rangeCheck(index); //判断指定的位置是否合法 

        return elementData(index);
    }  

    E elementData(int index) {
        return (E) elementData[index];
    } 

============toString() 为什么不打印对象的引用地址 
    [java01, java02, java03, java02]因为重写了Object里面的toString方法。
    
 public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }   
    
    
通过对ArrayList方法的底层代码分析:底层就是对数组的操作。
    ArrayList的底层就是基于数组实现的。

三、LinkedList:

添加元素

        lin.add("java01"); //追加尾部
        lin.addFirst("java02"); //添加到头部
        lin.addLast("java03");//追加到尾部
        lin.addFirst("java04"); //追加到头部
        lin.addLast("java05");//追加到尾部
        System.out.println(lin);

 删除操作:

        lin.removeFirst();//移除头部元素
        System.out.println(lin);

        lin.remove(2);//移除指定位置的元素
        System.out.println(lin);

        lin.removeLast();//移除尾部的元素
        System.out.println(lin);

修改操作

        lin.set(1,"DouZi");
        System.out.println(lin);

查询操作:

       int size = lin.size();//求长度
        System.out.println("长度为:" + size);
        boolean empty = lin.isEmpty();//是否为空
        System.out.println("是否为空:" + empty);
        boolean b = lin.contains("java01");//判断元素是否在集合中
        System.out.println("是否在集合里:" + b);
        Object o = lin.get(1);//根据下标获取指定位置的元素
        System.out.println("1这个位置为:" + o);
        Object first = lin.getFirst();//获取第一个元素
        System.out.println(first);
        Object last = lin.getLast();
        System.out.println(last);

 

链表结构

四、HashSet

 public static void main(String[] args) {
        //new 一个 默认空间为16  负载因子 0.75
        HashSet hs = new HashSet();
        //添加操作
        hs.add("Java01");
        hs.add("Java02");
        hs.add("Java03");
        hs.add("Java04");
        System.out.println(hs); //随机哈希排序


        /*
        //初始大小  LinkList不可以初始大小
        HashSet hs1 = new HashSet(16);
        //第二个参数代表负载因子 / 使用70%时 要求扩容
        HashSet hs2 = new HashSet(15, 0.7f);
         */
    }

其中0.75为负载因子,当达到时就开始扩容

删除操作:

没有顺序的

 //删除操作
        hs.remove("Java01");
        System.out.println(hs);

修改操作:

      //修改操作
        //判断是否为空
        boolean b = hs.isEmpty();
        System.out.println(b);

        //判断是否存在此数据
        boolean bb = hs.contains("DouZi");
        System.out.println(bb);

遍历:

   //遍历
        for (Object o : hs){
            System.out.println(o);
        }
//迭代器循环
        Iterator it = hs.iterator();
        while (it.hasNext()){ //判断指针是否能够移动
            Object next = it.next(); //指定移动并获取当前元素
            System.out.println(next);
        }

五 TreeSet:

不允许重复的元素

     //TreeSet中的方法和HashSet方法一样 ,  只是实现不相同
       /*
        TreeSet tr = new TreeSet();
        //储存String类型
        tr.add("Java01");
        tr.add("Java02");
        tr.add("Java03");
        tr.add("Java04");
        tr.add("Java05");
        System.out.println(tr);
        */

储存一个对象类型:


import java.util.TreeSet;

/**
 * @author DouZi
 * @Blog areone.top
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        //储存对象类型
        TreeSet tr1 = new TreeSet();
        tr1.add(new Student("DouZi",21));
        tr1.add(new Student("刘德华",35));
        tr1.add(new Student("小水牛",32));
        System.out.println(tr1);
    }
}

class Student {
    String name;
    int age;

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

    public Student() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

会报错:

因为Student类没实现Comparable接口 

解决办法1:让类实现Comparable接口

解决方法2:创建TreeSet指定排序的对象

自动导入方法

//排序  如果大于0,表示返回当前元素比0大  

如果返回-1  : 当前添加的元素比0小 返回0表示相同元素

 

 所以需要改变下:

按照年龄排序:

 public int compareTo(Object o) {
//        System.out.println(this+"---->"+o);
        //按照年龄排序
        Student s = (Student) o;
        if (this.age > s.age) {
            return 1;
        }
        if (this.age < s.age) {
            return -1;
        }
        return 0;
    }

 

HashMap

创建增删改

  // 创建默认容量的 Map    默认长度16  负载因子 0.75
        Map m = new HashMap();

        Map m = new HashMap(20);

        Map m = new HashMap(20, 0.6F);

增删改

    /*  Map 存储数据的时候 使用 put 函数  需要两个参数 第一个代表 key  第二个代表 value
         *  并且 key  和 value 的数据类型 都是 Object
         *  也就是说   任意对象都可以当成 key
         *  但是我们一般 key 使用 String  value 取决于具体业务
         *
         *  返回值是 当前key 对应的上一个值  或者 null
         * */
    //添加操作
        m.put("name", "DouZi"); //m的key必须唯一
        m.put("age", 21);
    //        m.put("name","Dddd");  //如果相同的key值,后者会替换前者
    //        System.out.println(m);
        Map m1 = new HashMap();
        m1.put("n1", "DouZi11"); //m的key必须唯一
        m1.put("a1", 211);
        m.putAll(m1);
    //        System.out.println(m);


       m.replace("name","DouZi","张三三"); // {name=张三三, age=21}

    //删除操作
    //        m.remove("a1");//根据key删除
    //        System.out.println(m);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值