java集合

.集合和数组的对比
集合对象是用来存放其他对象的,并且只能存放对象,不能存放基本类型的数据。
数组对象是用来存放数据的,这个数据可以是对象,也可以是基本类型的数据。
因为数组可以声明为引用类型数组和基本类型数组
集合的长度是可以变化的,随着存储数据的增多,集合中的总长度也会随之变化。
数组的长度一旦确定,就无法改变。
集合是由javase-api中的java.util包里面所提供的接口和实现类组成的,这里面定义并实现了很多方法,我们可以使用集合对象直接调用,然后完成对集合中数据的操作。
数组是由JVM中现有的 类型+[] 组合而成的,除了一个length属性,还有从Object中继承过来的方法之外,我们使用数组对象就调用不到其他属性和方法了.
集合中可以存放不同的类型的对象。
例如一个集合对象中可以存放Student对象,同时还可以存放进来Teacher对象。
数组中只能存放同一类型的对象。
例如一个数组对象中,要么只能存放Student对象(Student[]),要么只能存放Teacher对象(Teacher[]
集合对象除了自己本身有的众多方法可以来操作数据之外,javase-api中还提供了一个辅助工具类,可以专门帮我们来操作集合对象。
java.util.Collections 类
数组对象本身没有什么方法可以被调用的(除了从Object继承过来的之外),javase-api中提供了一个辅助工具类,可以专门帮我来操作数组对象。
java.util.Arrays 类
注意,集合对象或者数组对象,都可以把多个数据给保存起来,当我们有多个数据,并且需要把这个多个数据保存到一个对象中的时候,可以考虑使用集合或者数组。
例如,我们有一个方法,方法中从数据库查询到了10条数据,那么这个时候我们就可以把这个10条数据存到集合或者数组中,然后再作为方法的返回值,返回给调用者。
将来调用者调用这个方法之后,拿到方法的返回值,这个返回值是一个集合,集合中存放了这个查询到的10条数据,或者返回值是一个数组,数组中存放了这个10条数据。
最后再结合具体的操作,就是用户拿到这个集合或者数组后,还要不要再继续的做其他的操作了,结合实际的情况,根据数组和集合的特点,最后选择一种。
总结:数组简单通用,是最简单的存储多个数据的机构。
集合复杂一些,但是集合本身所提供的方法比较丰富。
3.集合框架的组成
集合中分为俩个大的的类型:Collection 和 Map

							Iterable	接口


							Collection	接口


				List接口						Set接口

				实现类							实现类
				ArrayList						HashSet
				LinkedList						TreeSet
				Vector

				注意,SortedSet是Set接口下面的一个子接口
		---------------------------------------------------
						
						Map 接口


						实现类
						HashMap
						TreeMap
						HashTable

				注意,SortedMap是Map接口下面的一个子接口

Iterable接口
注意,这个接口是java.lang包下的,其他和集合相关的接口都在java.util包中。
这个接口不代表集合,但是很多集合实现了这个接口,集合实现这个接口后,就可以实现迭代的功能。
Iterable接口中的抽象方法:
Iterator iterator();

现这个接口的集合中,都可以调用iterator方法,该方法返回一个迭代器,使用这个迭代器就要可以迭代出集合中的每一个元素。
该方法的反正类型是Iterator,这也是一个接口,表示迭代器类型
Iterator接口中的抽象方法:
boolean hasNext()
Returns true if the iteration has more elements.
Object next()
Returns the next element in the iteration.
注,集合中的数据也称为元素。
Collection接口
这个接口代表一种集合类型。这个接口继承了父接口Iterable,所以只要实现这个接口的集合,都可以调用iterator()方法来获取迭代器,从而迭代集合中的元素。
该接口中定义了一些Collection类型集合必须要有的基本的方法:
例如
boolean add(E e)
boolean addAll(Collection<? extends E> c)
void clear()
boolean contains(Object o)
boolean containsAll(Collection<?> c)
boolean isEmpty()
Iterator iterator()
boolean remove(Object o)
boolean removeAll(Collection<?> c)
boolean retainAll(Collection<?> c)
int size()
Object[] toArray()
T[] toArray(T[] a)
int hashCode()
boolean equals(Object o)
List接口和Set接口
这个俩个接口都是Collection接口的子接口。
List接口所代表的集合特点:
有序可重复
往List类型集合中存储的数据是有顺序的,这个顺序就是我们往集合中存放数据的顺序。同时还可以把同一个数据重复存到List类型集合中。
Set接口所代表的集合特点:
无序不可重复
往Set类型集合中存储的数据默认是无序的,同时Set类型集合中不能存放相同的数据。
注意,Set接口的一个子接口SortedSet,是允许把存放到集合中的数据进行排序的。
注意,set集合是根据对象的hashCode和equals方法来判断当前这个对象是否和集合中的其他对象相同。
List接口
除了从父接口Collection中继承过来的方法之外,List接口中还定义了一些自己独有的方法:
E get(int index);
E set(int index, E element);
void add(int index, E element);
boolean addAll(int index, Collection<? extends E> c);
E remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
List subList(int fromIndex, int toIndex);
ListIterator listIterator();
ListIterator listIterator(int index);
set接口
除了从父接口Collection中继承过来的方法之外,Set接口中还定义了一些自己独有的方法:
@Override
default Spliterator spliterator() {
return Spliterators.spliterator(this, Spliterator.DISTINCT);
}
注意,set接口中,除了从父接口Collection中继承过来的方法之后,就只添加就一个默认方法。并没有添加其他的抽象方法。

		Map接口
			Map是和Collection不同的一种集合。
			Map中存放数据的特点和Collection不同,Collection就是直接把数据存放进去就可以了,但是Map要求存放的数据都要有一个唯一的标识。
			Map存放数据都要以K-V的方式进行存放,V是需要存放的数据,K是这个数据在Map中的唯一标识。这种方式又称为键值对。
			
			键值对:Key-Value  

			Map接口中定义了,这个类型集合必须要实现的方法:
			V 				put(K key, V value)
			void 			putAll(Map<? extends K,? extends V> m)
			boolean 		containsKey(Object key)
			boolean 		containsValue(Object value)
			void 			clear()
			boolean 		equals(Object o)
			int 			hashCode()
			V 				get(Object key)
			V 				remove(Object key)
			int 			size()
			boolean 		isEmpty()
			Set<K> 			keySet()
			Collection<V> 	values()
			Set<Map.Entry<K,V>> 	entrySet()

.集合中的实现类
List接口的实现类中,常用的有ArrayList、LinkedList、Vector
ArrayList和LinkedList的对比
ArrayList内部使用数组来实现List集合的特点,所以在使用访问元素的时候可以使用数组自带的下标来访问元素,效果比高。但是在ArrayList中插入元素的话,其他元素就会要移动位置,这种操作效率就会低一些
LinkedList内部使用链表来实现List集合的特点,所以在LinkList中进行元素插入的时候,效率比较高。但是如果要使用下标来访问元素的时候,LinkedList的效率就会比较低,因为链表中本来没有下标,它的这个下标是模拟出来的。(Arraylist中的下标是数组自带的)
Vector这个实现类主要是实现List集合中的操作,并且保证了这些操作在【多线程】的环境下也是安全的。这个类中对元素操作的实现方法上,都加入了关键字synchronized,这个关键字是给方法中的代码进行加锁的,加锁后就能保证这个代码的线程安全。
Set集合的实现类有HashSet,HashSet是直接实现了Set接口,Set接口还有一个子接口为SortedSet,这个接口可以运行对数据进行排序,这个接口下有个常用的实现类TreeSet
Set接口的特点为 :无序不可重复
List接口的特点为:有序可重复
注意,Set接口中没有定义额外的抽象方法,这里的抽象方法都是从父接口(Collection)中继承过来的。
Set集合的无序特点,是因为一般情况下,每次存放进去的对象的哈希值时候不可预料的,所以导致了对象的顺序是无序的,其实内部会按照对象的哈希值进行排列。
Set集合的不可重复特点,通过所接收的新对象的hashCode和equals俩个方法来进行判断,当前新对象是否有和集合中的其他对象重复的情况。所以,当我们把一个自定义对象存到Set集合中的时候,需要重写hashCode和equals方法,来配合Set集合对象不可重复的判断操作。
虽然Set集合是无序的不可重复的,但是Set的子接口SortedSet是允许我们对存进去的数据进行排序的。
SortedSet接口有个实现类:TreeSet
TreeSet集合默认会把对象从小到大进行排列。但是前提是对象和对象之间必须可以比较出大小,有大小之分,那么才可以从小到大进行排列。
注,TreeSet只会这一种排列的方式,就是把对象从小到大排。但是对象在比较的时候,谁大谁小,是我们说了算的。我们可以在重写的方法中定义自己比较规则,按照这个规则就可以得出对象的大小。也就是说我们虽然改变不了排序的方式,但是我们可以改变比较大小的规则。
在java中,实现了Comparable接口的类的对象,是可以比较大小的,通过调用接口中的方法compareTo方法就可以比较俩个对象的大小。在compareTo方法中,可以按照自己定义的规则来比较俩个对象的大小。
Map接口常用的的实现类有:HashMap、TreeMap、HashTable

		HashMap类的声明:
		public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
			
			//...
		
		}
		
		Map接口中定义的方法:
			V 				put(K key, V value)
			void 			putAll(Map<? extends K,? extends V> m)
			boolean 		containsKey(Object key)
			boolean 		containsValue(Object value)
			void 			clear()
			V 				get(Object key)
			V 				remove(Object key)
			int 			size()
			boolean 		isEmpty()
			Set<K> 			keySet()
			Collection<V> 	values()
			Set<Map.Entry<K,V>> 	entrySet()
			boolean 		equals(Object o)
			int 			hashCode()

注意,HashMap是一个很中的集合,就连HashSet中的很多方法都是借助于HashMap的功能来实现的。
Map接口有一个子接口SortedMap,这个接口的实现类可以对存放进来的key-value进行排序,并且使用的是key值来进行的排序。
注意,TreeSet中的功能大多数也是由TreeMap来实现的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值