集合框架下面就对这些常用的集合进行简单分析: 既然都是集合,那么为什么需要这么多接口呢?一个不是更好学吗? 因为每一个容器对数据的存储方式都不同,这个存储方式称为:数据结构。 List和Set的不同Collertion下有List和Set,其中List元素是有序的,元素可以重复,因为该集合体系有索引。而Set元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。 集合与数组的不同先说一下数组,数组就是存储一堆相同数据类型的容器,有两种定义方式: 1. 动态定义数组:比如:int[] a=new int[5]; 定义了一个长度为5的整型数组; 2. 静态定义数组:比如:int[] a={1,2,3}, 长度为3,直接给出了元素1,2和3。 重点:数组在运行时,长度是不可变的,而集合长度是可变的。 数组只可以存储基本数据类型,也可以存储对象,集合只能存储对象,如果想存储基本数据类型们就需要进行包装。 例如:ArrayList<Integer> list=new ArrayList<>();这样就可以存储整型。 集合的使用集合的使用分为三个步骤: 1. 导包。 2. 创建 3. 使用 常用的方法: package cn.itcast.list.demo; import java.util.ArrayList; /** *@Description: java类作用描述 *@Author: sgy *@CreateDate: 2018/7/17$ 16:09$ */ public class CollectionDemo { public static void main(String[] args) { //创建一个集合容器,使用collection接口的子类:ArrayList。 ArrayList al=new ArrayList(); //1.添加元素 。 al.add("I Love Java01"); al.add("I Love Java02"); al.add("I Love Java03"); al.add("I Love Java04"); //打印原集合 sop(al); //2.获取个数。集合长度。 sop(al.size()); //4 //3.删除元素 al.remove("I Love Java02"); //打印改变后的集合 sop(al); //4.清空集合 al.clear(); sop(al); //5.判断集合是否为空 sop(al.isEmpty()); } public static void sop(Object obj){ System.out.println(obj); } } 运行结果: List特有方法,凡是可以操作索引的方法都是List体系特有的方法。 增 add(index,element); addAll(index,Collection); 删 remove(index); 改 set(index,element); 查 get(index); subList(from,to); ListIterrator(); List 集合元素是有序,不唯一: ArrayList 底层是数组,替代了Vector,查询速度快; LinkedList 底层是链表,,增删速度快; Vector 底层也是数组,速度很慢,已经过时;(不再描述) ArrayListArray 是数组结构,有角标,查询速度很快。 public class ArrayListDemo { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); String s1 = "曹操"; String s2 = "孙权"; String s3 = "刘备"; list.add(s1); list.add(s2); list.add(s3); //获取指定索引位置上的元素 System.out.println(list.get(2)); System.out.println(list.get(0)); System.out.println(list.get(1)); //集合的长度 System.out.println(list.size()); //移除指定位置的元素,返回元素值 System.out.println(list.remove(2)); System.out.println("===================="); //遍历输出 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } 运行结果: LinkedListlink 就是链表结构:增删速度快,而且 有特有方法,addFirst、addLast、removeFirst()、removeLast()、getFirst()、getLast()。 其中getFirst()、getLast()获取但不删除元素,removeFirsst()、removeLast()获取并删除元素。 public static void main(String[] args) { LinkedList list=new LinkedList(); //将元素添加到集合首, list.addFirst("迪丽热巴"); list.addFirst("古力娜扎"); list.addFirst("玛尔扎哈"); //输出结果为 玛尔扎哈、古力娜扎、迪丽热巴 sop(list); //获取首部元素 迪丽热巴 sop(list.getFirst()); //获取尾部元素 玛尔扎哈 sop(list.getLast()); //移除并获取首部元素,把第一个元素迪丽热巴移除后,古力娜扎就会成为第一个元素 //所以输出结果为 迪丽热巴 古力娜扎 sop(list.removeFirst()); sop(list.removeFirst()); } public static void sop(Object obj){ System.out.println(obj); } SetHashSet 底层是哈希表,线程是非同步的, TreeSet 底层是二叉树。 HashSet验证HashSet元素的无序性和唯一性,不废话,贴代码 public class HashSetDemo { public static void main(String[] args) { HashSet hs=new HashSet(); //加入元素,验证无序性和唯一性 hs.add("java01"); hs.add("java01"); hs.add("java02"); hs.add("java02"); hs.add("java03"); hs.add("java04"); sop(hs); } public static void sop(Object obj){ System.out.println(obj); } } 运行结果: 可以看到,输出结果并不是加入的元素顺序,也没有重复的元素,重复元素的返回值为false. TreeSet可以对Set集合中的元素进行排序。二叉树 不废话,上图 运行结果: 可以看出,字母对应的ASCII码表中的数字从小到大,运行几次都是这样的结果,Set集合的无序性是说存和取的顺序不一定一样,TreeSet的有序是说按照一定的规则对其中的元素进行排序。
|