Java 集合

389 阅读4分钟

一. 对象的存储

① 数组(基本数据类型 & 引用数据类型)
② 集合(引用数据类型)

数组储存数据的弊端: 长度一旦初始化以后, 就不可变; 真正给数组元素赋值的个数没有现成的方法可用

二. 集合框架

Collection接口: (两个子接口 List、Set)

List接口: 
	① 存储有序的, 可以重复的元素(相当于动态数组)
	② 新增的方法: 删除remove(int index) 修改set(int index, Object obj) 获取get(int index) 插入add(int index, Object obj)
	③ 添加进List集合中的元素(或对象)所在类一定要重写equals()方法
    
    Ⅰ. ArrayList(主要的实现类)
	Ⅱ. LinkedList(适合频繁的插入、删除操作)
	Ⅲ. Vector(古老的实现类、线程安全, 但效率低于ArrayList)
Set接口:  
	① 无序性: 不是随机性, 指的是元素在底层存储的位置是无序的
	② 不可重复性: 当向Set中添加进相同的元素的时候, 后边的这个不能添加进去 (要求添加进Set中的元素所在的类, 一定要重写equals() 和 hashCode()方法, 进而保证Set中元素的不可重复性)
	③ 存储的元素使用了哈希算法: 当向Set中添加对象时, 首先调用些对象所在类的hashCode()方法, 计算此对象的哈希值, 此哈希值已有对象存储, 再通过equals()比较这两个对象是否相同. 如果相同, 后一个对象就不能再添加进来 (hashCode()方法要与equals()方法一致).
    
	注: Set中常用的方法都是Collection下定义的. 
    
	Ⅰ. HashSet(主要的实现类)
    
	Ⅱ. LinkedHashSet:
		① 是HashSet的子类, 当我们遍历集合元素时, 是按照添进去的顺序实现的, 频繁的遍历, 较少的添加、插入操作建议选择此
		使用链表维护了一个添加进集合中的吮吸. 导致当我们便利LinkedHashSet集合元素时, 是按照添加进去的顺序遍历的
    
	Ⅲ. TreeSet
    	向TreeSet中添加的元素必须是同一个类的
        可以按照添加进集合中的元素的指定的顺序遍历(像String, 包装类等默认按照从小到大的顺序遍历)
		向TreeSet中添加元素时, 首先按照compareTo()进行比较, 一旦返回0, 虽然仅是两个对象的此属性相同, 但是程序会认为这两个对象是相同的, 进而后一个对象就不能添加进进来(compareTo()与hashCode()以及equals()三者保持一致)
		当向TreeSet中添加自定义类的对象时, 又两种排序方法: 
			① 自然排序 要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法, 再此方法中, 指定按照自定义类的那个属性进行排序; 若不实现此接口会报运行时异常
			② 定制排序
				创建一个实现了Comparator接口的实现类对象. 在实现类中重写Comparator的compare(Object o1, Object o2)方法
				在此compare()方法中指明按照元素所在类的那个属性进行排序
				将此实现Comparator接口的实现类的对象作为形参传递给TreeSet的构造器中
				向TreeSet中添加元素即可. 若不实现此接口, 会报运行时异常
				要求重写的compareTo()或者compare()方法与equals()和hashCode()方法保持一致

Map接口: 存储 "键-值" 对的数据

	Ⅰ. HashMap: (主要的实现类)
    	① key是用Set来存放的, 不可重复. value使用Collection来存放的, 可重复. 一个key-value对, 是一个Entry. 所有的Entry是用Set存放的, 也是不可重复的
        ② 向HashMap中添加元素时, 会调用key所在类的equals()方法, 判断两个key是否相同. 若相同则只能添加后进的元素
	Ⅱ. LickedHashMap: (时HashMap的子类, 可以按照添加进Map的顺序实现遍历)
		使用链表维护添加进Map中的顺序, 故遍历Map时, 是按添加的顺序遍历的
	Ⅲ. TreeMap:
		需要按照key所在的类的指定属性进行排序. 要求key时同一个类的对象
	Ⅳ. Hashtable:
		古老的实现类, 线程安全, 不可以添加null键, null值(不建议使用)
	Ⅴ. properties :
		常用来处理属性文件. 键和值都为String类型的

三. Collections的基本使用

反转排序List集合:
	Collections.reverse(list);

随机排序List集合:
	Collections.shuffle(list);

自然排序List集合:
	Collections.sort(list);

指定排序List集合:
	Collections.sort(list, Comparator);
    
交换的List集合元素:
	Collections.swap(list, int i, int j);
    
获取List元素最大值:
	Collections.max(list);
	Collections.max(list, Comparator);
    
获取List元素最小值:
	Collections.min(list);
    Collections.min(list, Comparator);
    
获取List某个元素出现的次数:
	Collections.frequency(list, Object);
    
实现List元素的复制:
	List newList = Arrays.asList(new Object[list.size()]);
	Collections.copy(newList, list);
    
实现List集合中值的替换:
	Collections.replaceAll(list, oldValue, newValue);

四. Collections的同步控制

	Collection newCollection = Collections.synchronizedCollection(list);
	List<Object> newList = Collections.synchronizedList(list);
	Map<Object, Object> newMap = Collections.synchronizedMap(map);
	Set<Object, Object> newSet = Collections.synchronizedSet(set)

五. Enumeration

Enumeration 接口是 Iterator 迭代器的"古老版本"

	Enumeration enumeration = new StringTokenizer("12-ab-#r-8h", "-");
    
	while (enumeration.hasMoreElements()) {
		System.out.println(enumeration.nextElement());
	}