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 类效果高。不同的结构对应于不同的算法,有的考虑节省占用空间,有的考虑提高运行效率,高运行速度往往是以牺牲空间为代价的,而节省占用空间往往是以牺牲运行速度为代价的。 
原文地址:https://www.cnblogs.com/obge/p/12435744.html