1.Java集合主要三种类型(两部分):
第一部分:Collection(存单个数据,只能存取引用类型)
(1).List :是一个有序集合,可以放重复的数据;(存顺序和取顺序相同)
(2).Set :是一个无序集合,不允许放置重复的数据;(存顺序和取顺序不一定相同)
(3).SortedSet:无序不可重复,存进去的元素可以按照元素的大小自动排序。
第二部分:Map(存成对数据)
(1).Map: 是一个无序集合,集合中包含一个键对象,一个值对象,键对象不允许重复,值对象可以重复(身份证号-姓名)。
2.Java集合存取数据类型及结构
2.1 常见集合的继承结构-Collection
2.1.1、集合中常用实现类的数据结构分析:
(1)List集合
List集合继承了Collection接口,因此包含了collection中所有的方法,此外,List接口还定义了以下两个非常重要的方法:
(a)get(int index):获得指定索引位置的元素
(b)set(int index,Object obj):将集合中指定索引位置的对象修改为指定对象。
(2)ArrayList
采用数组存储元素,适合查询,不适合随机增删元素。(常用)。是可变数组,允许保存所有的元素,包括null,并可以根据索引位置对集合进行快速的随机访问:缺点是指定的索引位置插入对象或删除对象的速度较慢。
(3)LinkedList
底层采用双向链表数据结构存储数据,适合频繁的增删元素,不适合查询元素。
(4)Vector
底层和ArrayList集合相同,但是 Vector是线程安全的,效率较低。(不常用)
(5)Set集合
Set集合中的元素不按特定的方式排序,只是简单地把对象加入集合,Set集合中不能包含重复对象。set集合有Set接口的实现类组成,set接口继承了Collection接口,因包含了Collction接口的所有方法。 Set的构造方法有一个约束条件,传入的Collection对象不能把有重复值,必须小心操作可变对象(Mutable Object)。如果一个Set中可变元素改变了自身状态导致Object。equals(Object) = true,则会出现一些问题。
(6)HashSet
哈希表/散列表,底层是一个HashMap。HashSet有以下特点:
a. 不能保证元素的排列顺序,顺序有可能发生变化
b.不是同步的
c. 集合元素可以是null,但只能放入一个null
当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。
简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等。
注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。
其规则是如果两个对 象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。
(5)TreeSet:
TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式, 自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。
Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。
obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。
如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0
b.定制排序
定制排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法
2.1.2、Collection接口中的方法分析:
(1).list集合
1 package list; 2 import java.util.*; 3 import java.util.ArrayList; 4 public class Gather { // 创建类Gather 5 public static void main(String[] args) { // 主方法 6 List<String> list = new ArrayList<>();//创建集合对象 7 list.add("a"); 8 list.add("b"); 9 list.add("c"); 10 //获得0~2之间随机数 11 int i = (int)(Math.random()*(list.size() - 1)); 12 System.out.println("随机数组中的元素: "+list.get(i)); 13 list.remove(2);//将指定索引位置的元素从集合中移除 14 System.out.println("将索引是2的元素从数组中移除后数组中的元素是:"); 15 for(int j = 0;j < list.size();j++){//循环遍历结合 16 System.out.println(list.get(j)); 17 } 18 } 19 20 } 21 /* 22 运行结果: 23 24 随机数组中的元素: a 25 将索引是2的元素从数组中移除后数组中的元素是: 26 a 27 b 28 */