zoukankan      html  css  js  c++  java
  • Java ---------- 集合

    和数组相比

    a、数组长度固定不变,不能很好的适应元素数量动态变化的情况

    b、可以通过数组名 .lenght 获取数组的长度,却无法直接获取数组中实际存储的元素个数。

    c、数组采用在内存中分配连续空间的存储方式存储,查询时效率较低需要多次比较。

    一、 集合   位于java.util 包中

    为了保存数量不确定的,以及具有映射关系的数据,集合类主要负责保存、盛装其他数据也被称为容器类

    和数组不同的是,数组的元素既可以是基本类型的值,也可以是对象(引用变量),而集合只能保存对象(引用变量)

    主要包括 Collection  和 Map是Java 集合的根接口,两个接口有包含了一些子接口或实现类

     1、List 接口

    常用的实现类  ArrayList 和 LinkedList

    1.1、使用ArrayList 类动态存储数据

    ArrayList 对数组进行了封装,实心了长度可变的数组,而且和数组采用了相同的存储方式,在内存中分配连续的空间,所以也被称为动态数组。

    但是不等同于数组,ArrayList集合中可以添加任何类型的数组,并且添加的数组都将转换成为Object 类型,而在数组中只能添加同一类型的数据。

    常用的方法:

     

     代码:

    调用 add(Object obj)方法时,添加到集合中的数据会被转换为Object类型

    package com.obge.boge;
    
    import java.util.ArrayList;
    
    public class Gather {
    
        public static void main(String[] args) {
            //ArrayList
            ArrayList arrayList = new ArrayList();
            //添加  会把输入的类型转换为 object 类型
            arrayList.add("周瑜");
            arrayList.add(1.22);
            arrayList.add('男');
            //判断指定元素是否在 ArrayList 集合中    返回的类型是  boolean
            System.out.println(arrayList.contains(1.22));
            System.out.println(arrayList.equals(1.2));
            //把索引为0 的数据移除
            arrayList.remove(1);
            System.out.println("****************");
            //判断arraylist 中元素个数
            System.out.println("arrayList 中总数为:"+arrayList.size());
            //返回元素的下标        有啥发现
            System.out.println("arrayList 中周瑜的下标为:"+arrayList.indexOf("周瑜"));
            System.out.println("arrayList 中男的下标为:"+arrayList.indexOf('男'));
            System.out.println("*************************");
            //修改下标对应的元素
            arrayList.set(1,34343);
            //
            for(int i=0;i<arrayList.size();i++){
                //输出打印
                System.out.println(arrayList.get(i));
                //强转一下输出, 下标为 1 的还会报 类型转换错误
    //            String obts = (String)arrayList.get(i);
    //            System.out.println(obts);
            }
    
            System.out.println("**********************************");
            arrayList.add("obge");
            arrayList.set(1,999);
    
    
            for(Object obj : arrayList){
                //很强
                //String st = (String)obj;
                System.out.println(obj);
            }
            System.out.println(arrayList.isEmpty());
            System.out.println("************************");
            //清空数据
            arrayList.clear();
            //判断集合中是否是空
            System.out.println(arrayList.isEmpty());
    
    
        }
    
    }

     存放对象时:

    遍历的时候,要强转为存储的对象

    package com.obge.boge;
    
    import com.obge.model.Animal;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Gather2 {
        public static void main(String[] args) {
            //创建三个对象
            Animal onea = new Animal("one",11,"男");
            Animal twoa = new Animal("two",12,"男");
            Animal threea = new Animal("three",13,"女");
            //多态  向上转
            List anList = new ArrayList();
            //将三个对象放到ArrayList中
            anList.add(onea);
            anList.add(twoa);
            anList.add(threea);
            //判断个数
            System.out.println("共有"+anList.size()+"个");
            System.out.println("遍历输出名字 :");
            //通过循环遍历
            for(Object obj:anList){
                //转换为 Animal 类
                Animal resan = (Animal)obj;
                //打印名字
                System.out.println(resan.getName());
            }
    
        }
    
    }

    由于ArrayList集合可以使用索引来直接获取元素,所以其优点是遍历元素和随机访问的效率比较高,但是由于ArrayList集合采用了和数组相同的存储方式,

    在内存中分配连续的空间,因此在添加和删除非尾部元素时会导致后面所有的元素移动,这就造成了在插入、删除等操作频繁的应用场景下使用ArrayList性能低下。

    List 接口下的LinkedList类

    特点:

    LinkedList 类是List 接口的链接列表的实现类,支持实现所有List接口可选的列表操作,并允许所有的元素值是任何数据,包括null。

    LinkedList 采用链表存储方式存储数据,在插入、删除元素时效率比较高,但是查找效率低。

     特殊的方法:

    除了包含ArrayList 类的方法外,还可以对LinkedList 类的首部或尾部进行插入删除操作。

     //try 

    package com.obge.boge;
    
    import com.obge.model.Animal;
    
    import java.util.LinkedList;
    
    public class LinkedListStu {
    
        public static void main(String[] args) {
            //链表的方式存储
            Animal animal = new Animal("dog",0,"男");
            Animal animal1 = new Animal("dog1",1,"男");
            Animal animal2 = new Animal("dog2",2,"男");
            Animal animal3 = new Animal("dog3",3,"男");
            //实例化一个linkedlist集合存储数据
            LinkedList alist = new LinkedList();
            //放到里面
            alist.add(animal);
            alist.add(animal1);
            //观察下标位置
            System.out.println("第一次animal的下标是:"+alist.indexOf(animal));
            //把 animal3 放到首位
            alist.addFirst(animal3);
            //aniaml2 放到末尾
            alist.addLast(animal2);
            //在看位置
            System.out.println("第二次animal的下标是:"+alist.indexOf(animal));
            //打印有多少个
            System.out.println("存储了:"+alist.size()+"个");
            //获取最后一个动物名成
            Animal lastAnimal;
            lastAnimal = (Animal)alist.getFirst();
            System.out.println("获取最后一个名字:"+lastAnimal.getName());
            //删除第一个
            alist.removeFirst();
            //输出打印
            System.out.print("遍历输出:");
            for(Object resLin:alist){
                Animal ani = (Animal)resLin;
                System.out.print(ani.getName()+"   ");
            }
        }
    
    
    }
    ArrayList 类和 LinkedList 类的区别
    //ArrayList 类和 LinkedList 类的区别
    1.ArrayList 与 LinkedList 都是 List 接口的实现类,因此都实现了 List 的所有未实现的方法,只是实现的方式有所不同。
    
    2.ArrayList 是基于动态数组数据结构的实现,访问元素速度优于 LinkedList。LinkedList 是基于链表数据结构的实现,占用的内存空间比较大,但在批量插入或删除数据时优于 ArrayList。
    
    3.对于快速访问对象的需求,使用 ArrayList 实现执行效率上会比较好。需要频繁向集合中插入和删除元素时,使用 LinkedList 类比 ArrayList 类效果高。不同的结构对应于不同的算法,有的考虑节省占用空间,有的考虑提高运行效率,高运行速度往往是以牺牲空间为代价的,而节省占用空间往往是以牺牲运行速度为代价的。 
  • 相关阅读:
    UVa 10118 记忆化搜索 Free Candies
    CodeForces 568B DP Symmetric and Transitive
    UVa 11695 树的直径 Flight Planning
    UVa 10934 DP Dropping water balloons
    CodeForces 543D 树形DP Road Improvement
    CodeForces 570E DP Pig and Palindromes
    HDU 5396 区间DP 数学 Expression
    HDU 5402 模拟 构造 Travelling Salesman Problem
    HDU 5399 数学 Too Simple
    CodeForces 567F DP Mausoleum
  • 原文地址:https://www.cnblogs.com/obge/p/12435744.html
Copyright © 2011-2022 走看看