和数组相比
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 类效果高。不同的结构对应于不同的算法,有的考虑节省占用空间,有的考虑提高运行效率,高运行速度往往是以牺牲空间为代价的,而节省占用空间往往是以牺牲运行速度为代价的。