黑马程序员——常用集合特点及其方法

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

	Collection
		|--List	有序,可重复
			|--ArrayList
				底层数据结构是数组,查询快,增删慢。
				线程不安全,效率高
			|--Vector
				底层数据结构是数组,查询快,增删慢。
				线程安全,效率低
			|--LinkedList
				底层数据结构是链表,查询慢,增删快。
				线程不安全,效率高
		|--Set	无序,唯一
			|--HashSet
				底层数据结构是哈希表。
				如何保证元素唯一性的呢?
					依赖两个方法:hashCode()和equals()
					开发中自动生成这两个方法即可
				|--LinkedHashSet
					底层数据结构是链表和哈希表
					由链表保证元素有序
					由哈希表保证元素唯一
			|--TreeSet
				底层数据结构是红黑树。
				如何保证元素排序的呢?
					自然排序
					比较器排序
				如何保证元素唯一性的呢?
					根据比较的返回值是否是0来决定

 
  
	Collection
	顶层接口,有两个主要的子接口:List(有序、可重复)和Set(无序,唯一)
	主要方法有:
		添加:
			boolean add(E e);
			boolean addAll(Collection c);
		删除:
			boolean remove(Object o);
			boolean removeAll(Collection c);
			void clear();
		判断:
			boolean contains(Object o);
			boolean containsAll(Collection c);
			boolean isEmpty();
		长度:
			int size();
		交集:
			boolean retainAll(Collection c);
		集合转数组:
			Object[] toArray();
		List
			特有功能
			void add(int index,E element);
			E remove(int index);
			E get(int index);
			E set(int index,E element);
			ListIterator listIterator();
			实现类:
				ArrayList
					底层数据结构是数组,查询快,增删慢;线程不安全,效率高
					无特有功能;
				Vector
					底层数据结构是数组,查询快,增删慢;线程安全,效率低
					特有功能已被取代
					特有功能已被取代
						public void addElement(E obj)
						public E elementAt(int index) 
						public Enumeration elements()
				LindedList
					底层数据结构是链表,查询慢,增删快;线程不安全,效率高
					特有功能:
						public void addFirst(E e);	addLast(E e);
						public E getFirst();	getLast();
						public E removeFirst();	removeLast();

 
  
 
  
		Set
			无特有功能
			实现类:
				HashSet
					底层数据结构是哈希表(元素是链表的数组),依赖于哈希值存储
					添加功能依赖于两个方法保证元素的唯一:
					int hashCode();		boolean equals(Object o);
				LinkedHashSet
					元素有序且唯一,链表保证有序,哈希表保证唯一。
				TreeSet
					底层数据结构是红黑树(是一种自平衡的二叉树)
					根据创建对象时使用的构造方法决定是自排序还是构造器排序
	Map
	双列集合接口,包含的元素是将键映射到值的对象,键不可重复,值可以重复
	键可以理解为是Set类型的集合,值可以理解为是List类型的集合
	集合的数据结构对键有效,与值无关
	主要方法有:
		V put(K key,V value);
		V remove(Object key);
		void clear();
		boolean containsKey(Object key);
		boolean containsValue(Object value);
		boolean isEmpty();
		int size();
		V get(Object key);
		Set keySet();
		Collection values();
		Set> entrySet();
	实现类:
		HashMap:键是哈希表结构,唯一,无序
		LinkedHashMap:Map接口的哈希表和链表实现,具有可预知的迭代顺序。
		TreeMap:键是红黑树结构,唯一,有序
到底使用那种集合
	单列还是双列
		单列:Collection
			元素重复吗?
				重复:List
					要安全吗?
						要:Vector
						不要:
							查询多:ArrayList
							增删多:LindedList
				不重复:Set
					有序吗?
						无序:HashSet
						有序:TreeSet
			如果只知道是单列,不知道其他的,就使用ArrayList
		双列:Map
			键有序吗?
				无序:HashMap
				有序:TreeMap
			如果不知道就用HashMap

Collections

	(1)是针对集合进行操作的工具类
	(2)面试题:Collection和Collections的区别
		A:Collection 是单列集合的顶层接口,有两个子接口List和Set
		B:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等
	(3)常见的几个小方法:
		A:public static  void sort(List list)
		B:public static  int binarySearch(List list,T key)
		C:public static  T max(Collection coll)
		D:public static void reverse(List list)
		E:public static void shuffle(List list)

泛型

	(1)泛型概述
		是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的
		特殊的类型。
	(2)格式:
		<数据类型>
		注意:该数据类型只能是引用类型。
	(3)好处:
		A:把运行时期的问题提前到了编译期间
		B:避免了强制类型转换
		C:优化了程序设计,解决了黄色警告线问题,让程序更安全

静态导入

	(1)可以导入到方法级别的导入
	(2)格式:
		import static 包名....类名.方法名;
	(3)注意事项:
		A:方法必须是静态的
		B:如果多个类下有同名的方法,就不好区分了,还得加上前缀。
			所以一般我们并不使用静态导入,但是一定要能够看懂。

可变参数

	(1)如果我们在写方法的时候,参数个数不明确,就应该定义可变参数。
	(2)格式:
		修饰符 返回值类型 方法名(数据类型... 变量) {}
		
		注意:
			A:该变量其实是一个数组名
			B:如果一个方法有多个参数,并且有可变参数,可变参数必须在最后
	(3)Arrays工具类的一个方法
		asList()把数组转成集合。
		注意:这个集合的长度不能改变。

在集合中常见的数据结构

	ArrayXxx:底层数据结构是数组,查询快,增删慢
	LinkedXxx:底层数据结构是链表,查询慢,增删快
	HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
	TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

你可能感兴趣的:(java,集合,iterator,hashcode,arraylist,java基础)