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反转集合元素

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

    .

    努力到无能为力,拼搏到感动自己
  • 相关阅读:
    第三十一篇 玩转数据结构——并查集(Union Find)
    第三十篇 玩转数据结构——字典树(Trie)
    开发Electron可能用到的工具
    最新NetMonitor代码
    用C++/CLI搭建C++和C#之间的桥梁
    xaml实现无边框窗口
    用xaml画的带阴影3D感的圆球
    创作了一个xml的替代格式
    域名投资入门和技巧
    Compaq Visual Fortran生成静态库的方法及使用
  • 原文地址:https://www.cnblogs.com/tkzm/p/10981395.html
Copyright © 2011-2022 走看看