1.长度
数组长度固定;
集合长度可变。
2.内容
数组可存储基本数据类型或引用数据类型,但只可选其一;
集合只能存储引用数据类型,可同时使用不同类型,但通常情况下不会同时使用多种数据类型。
list | set | |
有序性 | 按插入顺序排序 | 按特定算法排序 |
唯一性 | 可以重复 | 元素唯一 |
元素获取 | 通过索引直接获取 | 不能通过索引获取 |
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
(1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
(2)LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
(3)Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
1 //初始化一个空的arraylist列表 2 List<String> alist=new ArrayList<>(); 3 System.out.println(alist.toString()+"是否为空:"+alist.isEmpty()); 4 5 //向列表添加元素 6 alist.add("a"); 7 alist.add("b");alist.add("b0");alist.add("b"); 8 alist.add("c"); 9 System.out.println(alist.toString()+" "+alist.size()+"个元素"); 10 System.out.println("是否包含c:"+alist.contains("c")); 11 12 //删除一个链表中等于此参数的元素 13 alist.remove("b"); 14 System.out.println(alist.toString()+" "+alist.size()+"个元素"); 15 //删除指定位置的元素 16 alist.remove(1); 17 System.out.println(alist.toString()+" "+alist.size()+"个元素"); 18 //修改指定位置的值 19 System.out.println("修改前的值: "+alist.set(2,"ccc")); 20 System.out.println(alist.toString()); 21 //第一次出现的索引 22 System.out.println("b的索引: "+alist.indexOf("b")); 23 System.out.println(alist.get(1)); 24 //截取 25 System.out.println("获取0(包含)-1(不含)间的元素,返回值为列表 "+alist.subList(0,1).toString()); 26 27 List<String> blist=new ArrayList<>(); 28 //将alist的元素全部添加到blist中 29 blist.addAll(alist); 30 System.out.println("b: "+blist.toString()); 31 32 //使用iterator访问集合 33 Iterator<String> it=blist.iterator(); 34 System.out.print("iterator "); 35 while (it.hasNext()) { 36 System.out.print(it.next()+" "); 37 } 38 39 //在指定位置添加元素 40 blist.add(2,"b2"); 41 System.out.println("\n"+blist.toString()); 42 43 System.out.println("-----------列表与数组的转换------------"); 44 /* 45 * 将arraylist转换为字符串数组 46 * 1.初始化一个数组,需指定数组大小 47 * 2.使用arraylist.toArray(array)完成转换 48 * */ 49 String[] arr1=new String[blist.size()]; 50 blist.toArray(arr1); 51 for (String i:arr1) 52 System.out.print(i+" "); 53 /* 54 * 将一个字符串数组转换为arraylist 55 * */ 56 ArrayList<String> clist=new ArrayList<String>(Arrays.asList(arr1)); 57 System.out.println("\n"+clist.toString());
(1)HashSet底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性;
(2)LinkedHashSet底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高;
(3)TreeSet底层数据结构采用二叉树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。
1 System.out.println("------------hashset-------------"); 2 //初始化一个hashset 3 HashSet<String> aset=new HashSet<>(); 4 aset.add("aaa"); 5 aset.add("bbb"); 6 aset.add("ccc"); 7 //hashset不会按插入顺序存储数据 8 System.out.println(aset.toString()); 9 // for (String i:aset){ 10 // System.out.print(i+" "); 11 // } 12 //向hashset中添加重复元素时,set不会改变 13 aset.add("aaa"); 14 System.out.println(aset.toString()); 15 16 System.out.println("-------------treeset--------------"); 17 //自动排序 18 TreeSet<Integer> bset=new TreeSet<>(); 19 bset.add(5); 20 bset.add(2); 21 bset.add(7); 22 bset.add(9); 23 bset.add(6); 24 bset.add(7); 25 // for(Integer i:bset){ 26 // System.out.print(i+" "); 27 // }//不能使用普通for遍历 28 System.out.println(bset.toString()); 29 30 Integer[] sort={7,3,6,2,4,6,8}; 31 TreeSet<Integer> cset=new TreeSet<Integer>(Arrays.asList(sort)); 32 System.out.println(cset.toString());
五.使用场景
【图片...】