主要集合概述:
- List:是一个有序集合,可以放重复的数据
- Set:是一个无序集合,不允许放重复的数据
- Map:是一个无序集合,集合中包含一个键对象,一个值对象,键对象不允许重复 ,值对象可以重复(身份证号—姓名)
Collection 详解:
注意:
Collection 是java.until下的接口,是各种集合结构的父接口,
Collections 是java.until下的类,包含各种有关集合操作的镜头方法
Collection 以及几个重要实现类和接口的继承关系图:
注:
Collection 只能存储引用数据类型,并且是单个存储
ArrayList 底层所采用的是数组存储元素,所以 ArrayList 集合适合查询,不适合频繁地随机增删元素
LinkedList 底层采用的是双层链表存储数据,链表适合频繁地增删元素,不适合查询操作
Vector 的底层实现和ArrayList集合相同,但是 Vector 是线程安全的,效率较低,所以使用较少(所以图中显示为灰色)
HashSet 的底层实现是一个哈希表/散列表
关于 ArrayList 的练习:
1 package com.neu.core; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 import java.util.Iterator; 6 7 public class ArrayListTest { 8 public static void main(String[] args) { 9 Collection<Integer> a = new ArrayList<>(); 10 11 // 添加对象 12 a.add(1);// 自动装箱 13 a.add(2); 14 a.add(3); 15 16 // 1.父类或者接口是否可以调用子类或实现类的独有方法? 17 // 错误的写法,c为一个Collection对象,不存在set方法 18 // c.set(0, 4); 19 // 正确的写法s 20 ArrayList<Integer> al = (ArrayList<Integer>) a; 21 al.set(0, 4); 22 23 // 2.插入类型不同的对象会发生什么? 24 // 会在强制类型转换的时候发生ClassCastException 25 // al.add("qwer"); 26 27 // 3.输出对象的方式? 28 System.out.println("======foreach循环======"); 29 for (Integer integer : a) { 30 System.out.println(integer); 31 } 32 System.out.println("======for循环======"); 33 for (int i = 0; i < al.size(); i++) { 34 // 将 Object 强制转换为 Integer 35 Integer e = (Integer) al.get(i); 36 System.out.println(e); 37 } 38 System.out.println("======while+迭代器======"); 39 Iterator<Integer> it = al.iterator(); 40 while (it.hasNext()) { 41 System.out.println(it.next()); 42 } 43 System.out.println("======while+for循环======"); 44 for (it = al.iterator(); it.hasNext();) { 45 System.out.println((Integer) it.next()); 46 } 47 // Iterator使用完不能再使用,只能返回一个新的迭代器 48 49 // 4.删除集合中的元素? 50 // al.remove(2); 51 // System.out.println("============"); 52 // for (Integer integer : al) {// al变成[4,2] 53 // System.out.println(integer); 54 // } 55 al.remove(new Integer(2)); 56 System.out.println("============"); 57 for (Integer integer : al) {// al变成[4,3] 58 System.out.println(integer); 59 } 60 // 以上两种方式不一样,第一种传入的是下标,第二种传入的是对象引用 61 62 // 5.判断是否含某个对象 63 System.out.println("============"); 64 System.out.println(al.contains(3)); 65 66 // 6.判断是否为空 67 System.out.println("============"); 68 System.out.println(al.isEmpty()); 69 70 // 7.转换为对象数组 71 System.out.println("============"); 72 Object[] oArray1 = al.toArray(); 73 for (int i = 0; i < oArray1.length; i++) { 74 Integer v = (Integer) oArray1[i]; 75 System.out.println(v); 76 } 77 System.out.println("============"); 78 Integer[] iArray = new Integer[al.size()]; 79 al.toArray(iArray); 80 for (int i = 0; i < iArray.length; i++) { 81 int v = iArray[i]; 82 System.out.println(v); 83 } 84 85 } 86 }
LinkedList 的用法与 ArrayList 类似,就不再写例子了
哈希表简单解释:哈希表是一种数据结构,哈希表能够提供快速存取操作。哈希表是基于数组的,所以也存在缺点,数组一旦创建将不能扩展。正常的数组,如果需要查询某个值,需要对数组进行遍历,只是一种线性查找,查找的速度比较慢。如果数组中的元素值和下标能够存在明确的对应关系,那么通过数组元素的值就可以换算出数据元素的下标,通过下标就可以快数定位数组元素,这样的数组就是哈希表 。
一张哈希表:
元素值 10 11 12 13 14 15 16 17 18
元素下标 0 1 2 3 4 5 6 7 8
以上我们的示例元素值和下标的关系为:
元素下标=元素值-10,此时的示例 hashcode就是和数组下标一致了,取得 hashcode 方法如下:
1 //取得 hashCode 2 pubic int hashCode(int value) { 3 return value – 10; 4 }
有了 hashCode 后,我们就可以快速的定位相应的元素,查找到相应的信息
由此算法衍生出 HashSet ,HashSet 中的数据是无序的不可重复的。HashSet 按照哈希算法存取数据的,具有非常好性能,它的工作原理是这样的,当向 HashSet 中插入数据的时候,他会调用对象的 hashCode得到该对象的哈希码,然后根据哈希码计算出该对象插入到集合中的位置。
关于 HashSet 的练习
1 package com.neu.core; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 import java.util.Set; 6 7 public class HashSetTest { 8 public static void main(String[] args) { 9 Set<String> set = new HashSet<>(); 10 // 无序且不重复 11 set.add("a"); 12 set.add("b"); 13 set.add("c"); 14 // 输出无序 15 for (Iterator<String> it = set.iterator(); it.hasNext();) { 16 System.out.println(it.next()); 17 } 18 // 加入重复数据 19 set.add("a"); 20 for (Iterator<String> it = set.iterator(); it.hasNext();) { 21 System.out.println(it.next()); 22 } 23 24 String s1 = new String("abc"); 25 String s2 = new String("abc"); 26 27 System.out.println(s1.equals(s2)); 28 System.out.println(s1.hashCode()); 29 System.out.println(s2.hashCode()); 30 31 String s3 = new String("ghj"); 32 System.out.println(s1.equals(s3)); 33 System.out.println(s3.hashCode()); 34 35 } 36 }