zoukankan      html  css  js  c++  java
  • 初学者——集合框架

    为什么要使用集合框架

    如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java集合框架

    集合框架图

    Collection接口简介

    Collection下拥有List、Set两个子类

    Collection 接口存储一组不唯一,无序的对象

     List接口简介

    List接口下有很多子类实现,这里面简单的说一下ArrayList和LinkedList这两个子类

    ArrayList子类

    ArrayList存储一组不唯一,但有序的对象

    底层数据结构是数组结构

     扩容增量:原容量的 0.5倍+1

     如 ArrayList的容量为10(默认值就为10),一次扩容后是容量为16

    ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高

    ArrayList常用的方法: 

    增加元素

    • boolean add(Element e) 增加指定元素到尾部.
    • void add(int index, Element e) 增加指定元素到指定位置
    list.add(title4);//添加元素
    list.add(1, title5);//在指定位置下添加元素

     删除元素

    • void clear() 删除所有元素.
    • E remove(int index) 删除指定位置的元素
    list.remove(title1);//删除指定的某一个元素
    list.clear();//清空元素

     获取元素

    • E get(int index) 获取链表中指定位置处的元素
    • Object[] toArray() 获取一个数组,数组中所有元素是链表中的元素.(即将链表转换为一个数组)
    for (int i = 0; i < list.size(); i++) {
                NewsTitle title=list.get(i);//获取每一个元素
                System.out.println(title.getTitle());
            }

    修改元素

    •   E set(int index, E element)  将链表中指定位置上的元素替换成新元素
    list.set(1, title6);//修改元素

    搜索元素

    • boolean contains(Object o) 如果链表包含指定元素,返回true
    • int indexOf(Object o) 返回元素在链表中第一次出现的位置,如果返回-1,表示链表中没有这个元素
    • int lastIndexOf(Object o) 返回元素在链表中最后一次出现的位置,如果返回-1,表示链表中没有这个元素
    System.out.println(list.contains(title1));//判断列表中是否存在指定元素
            list.indexOf(title1);//返回元素在链表中第一次出现的位置
            list.lastIndexOf(title6);//返回元素在链表中最后一次出现的位置

    检查元素是否为空

    • boolean isEmpty() 返回true表示链表中没有任何元素
    if(map.isEmpty()){
                System.out.println("已清空Map中的数据!");
            }

    获取元素的长度

    • int size() 返回长度(包含元素的个数)
    System.out.println("Map中共有"+map.size()+"组数据");

     ArrayList的迭代器

    listIterator.hasPrevious()检查序列中是否还有上一个元素
    listIterator.previous()获得序列中的上一个元素
    listIterator.hasNext()检查序列中是否还有下一个元素
    listIterator.next()获得序列中的下一个元素

    LinkedList子类

    LinkedList存储一组不唯一,但有序的对象

    底层数据结构是数组结构

     扩容增量:原容量的 0.5倍+1

     如 LinkedList的容量为10(默认值就为10),一次扩容后是容量为16

     LinkedList采用链表储存方式。插入删除元素时效率比较

     LinkedList常用方法

    增加元素:

    • add(E e):在链表后添加一个元素; 通用方法
    • addFirst(E e):在链表头部插入一个元素; 特有方法
    • addLast(E e):在链表尾部添加一个元素; 特有方法
    list.add(title3);//添加元素
    list.addFirst(title4);//在开头插入一个元素
    list.addLast(title5);//在最末尾添加一个元素

    删除元素:

    • remove() :移除链表中第一个元素; 通用方法
    • remove(E e):移除指定元素; 通用方法
    • removeFirst(E e):删除头,获取元素并删除; 特有方法
    • removeLast(E e):删除尾; 特有方法
    list.remove(title5);//删除元素
    list.remove(2);//删除指定下标元素
    list.removeFirst();//删除第一个元素
    list.removeLast();//删除最后一个元素

    检察元素:

    • get(int index):按照下标获取元素; 通用方法
    • getFirst():获取第一个元素; 特有方法
    • getLast():获取最后一个元素; 特有方法
    list.get(i);//获得元素
    list.getFirst();//获得头条元素
    list.getLast();//获得末尾元素

    Set接口

    Set下面也有很多子类实现了它,这里我就说一下HashSet

    Set()中不存在get()方法

     HashSet子类

    HashSet接口存储的是一组唯一,并且无序的对象

    底层实现是一个HashMap(保存数据),实现Set接口

    默认初始容量为16

    加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容

    扩容增量:原容量的 1 倍

    如 HashSet的容量为16,一次扩容后是容量为32

    HastSet常用方法

    这里就不贴代码了跟上面的一样.....

    //增加

    • add(null);


    //删除

    • remove(news);


    //对比查找

    • contains(news);


    //清空集合

    • clear();


    //获取长度

    • size();

    Map接口简介

     

     Map中介绍一个最常用的HashMap子类

    Map接口存储一组键值对象,提供key到value的映射

     HashMap子类

     默认初始容量为16

    加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容

    扩容增量:原容量的 1 倍

    如 HashSet的容量为16,一次扩容后是容量为32

     HashMap常用方法

    put 添加键值对
    containsKey() 键中是否包含这个数据
    get() 通过键拿到值
    isEmpty() 判断是否为空
    remove() 在键值对中删除
    size() 键值对的数据长度
    clear() 清空键值对

    Iterator迭代器

    使用next()获得序列中的下一个元素。
    使用hasNext()检查序列中是否还有下一个元素

     泛型类

    如果类中存在泛型变量,类必须声明为泛型类

    如果类中存在泛型函数,可以声明为泛型类,也可以将函数声明为泛型函数

    如果集合设置为了泛型:只能存储泛型变量及其子类

    泛型的使用方式,分别为:泛型类、泛型接口、泛型方法

    //泛型类
      public class FanXing <E>{
          //泛型变量
          private E fname;
          private E age;
          
          //泛型方法
          public <T>T Test(T num){
              
             return num;
             
         }
         
         public E getFname() {
             return fname;
         }
         public void setFname(E fname) {
             this.fname = fname;
         }
         public E getAge() {
             return age;
         }
         public void setAge(E age) {
             this.age = age;
         }
     
     }

    泛型解决的问题

    主要为了解决程序中装箱和拆箱的问题

    装箱: 值类型-->引用类型 Object obj=1;
    拆箱: 引用类型--->值类型 int number=(int)obj

    如果集合设置为了泛型:只能存储泛型变量及其子类

    HashSet去重

    HashCode跟equals

    两个对象的hashCode值相同,两个对象equals方法不一定返回true
    两个对象的equals返回为true,则hashCode一定相同

    public class Student1 {
        private String name;//姓名
        private int num;//学号
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getNum() {
            return num;
        }
        public void setNum(int num) {
            this.num = num;
        }
        public Student1(int num,String name ) {
            super();
            this.num = num;
            this.name = name;
            
        }
        public Student1() {
            super();
        }
        @Override
    //重写equals方法比较学号
    public boolean equals(Object obj) { Student1 str=(Student1)obj;//类型强转 if(str.getNum()==this.getNum()){//比较学号 return true; }else { return false; } } @Override public int hashCode() {//重写方法hashcode让内存地址相同 return getNum()/10; } @Override public String toString() { return getName()+getNum(); } }
    public class HashSet1 {
        public static void main(String[] args) {
            Set<Student1> st=new HashSet();//创建对象
            Student1 s1=new Student1(10001,"张三");
            Student1 s3=new Student1(10002,"李四");
            Student1 s2=new Student1(10001,"张三");
            //添加对象
            st.add(s1);
            st.add(s2);
            st.add(s3);
            //for循环遍历集合元素
            for (Student1 student : st) {
                System.out.println(student);
            } 
        }
    
    }

    ArrayList使用Collections工具排序

    //学生类有学号、姓名
    public class Student implements Comparator<Student>{
        private int number;
        private String name;
    
        public int getNumber() {
            return number;
        }
        public void setNumber(int number) {
            this.number = number;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Student(int number, String name) {
            super();
            this.number = number;
            this.name = name;
        }
        public Student() {
            super();
        }
        @Override
        //实现Comparator接口的compare方法
        public int compare(Student o1, Student o2) {
            if(o1.getName().equals(o2.getName())){//对比性名如果相等则比较学号
                return o1.getNumber()-o2.getNumber();
            }else {
                return o1.getName().compareTo(o2.getName());//compareTo比较两个是否相等
            }
            
        }
        @Override
        public String toString() {//重新toString方法显示姓名、学号
            return getName()+getNumber();
        }
    
    }
    //姓名相同  按学号排序
    public class Listpaixu {
        public static void main(String[] args) {
            List<Student> st=new ArrayList<>();
            Student s1=new Student(10002,"张三");
            Student s2=new Student(10005,"张三");
            Student s3=new Student(10003,"小丽");
            Student s4=new Student(10006,"小丽");
            
            st.add(s1);
            st.add(s2);
            st.add(s3);
            st.add(s4);
            //调用Collections工具类里地sort排序方法
            Collections.sort(st,new Student());
            
            for (Student student : st) {
                System.out.println(student);
            }
        }
    
    }

     Collections常用方法

    • Collections.max()最大值
    • Collections.min()最小值
    • Collections.sort()升序排序
    • Collections.binarySearch查找
    • Collections.reverse反转集合元素

    目前就介绍这么多,还望大佬手下留情....

    .

    努力到无能为力,拼搏到感动自己
  • 相关阅读:
    PAT 甲级 1132 Cut Integer (20 分)
    AcWing 7.混合背包问题
    AcWing 9. 分组背包问题
    AcWing 5. 多重背包问题 II
    AcWing 3. 完全背包问题
    AcWing 4. 多重背包问题
    AcWing 2. 01背包问题
    AcWing 875. 快速幂
    AcWing 874. 筛法求欧拉函数
    AcWing 873. 欧拉函数
  • 原文地址:https://www.cnblogs.com/tkzm/p/10981395.html
Copyright © 2011-2022 走看看