关于集合

关于集合先放上自己的笔记,没有时间来排版,先记录一下。

作用:类集在JAVA中最为核心的用处就是实现了动态对象数组的操作
集合是什么:
			集合就是一个容器,里面存储大量对象元素。
与数组的区别是什么:
			数组是固定长度的,集合的长度是动态的;
			数组存储的同一类型的元素,而集合可以存储不同类型的对象。
为什么要提提供大量集合:
			按照不同的存、取方式。每种集合类的存、取方式各不相同,就会导致对于“集合内的元素”的“增删改查”等操作的效率不同,
			有些存储方式会导致查询慢,但增删快;有些存储方式会导致:查询快,增删慢。存储方式由数据结构决定。
常见的数据结构:
			1) 数组结构----ArrayList 内部是用数组实现的。(增删元素慢,查询快)
			2) 链表结构----LinkedList 查询慢,增删快
			3) 哈希表结构--HashSet 查询、增删都快,但所有操作都需要产生哈希值
			4) 树结构------TreeSet 对元素排序
			5) 图结构------Map
			6) 栈结构------Stack 后进先出,模拟现实的操作
			7) 队列--------Que.. 先进先出,模拟现实排队的操作

Java 中的集合分为两大类:(宏观上)
	1)Collenction集合 (单列集合)
	2)Map集合	(双列集合)
一 单对象保存父接口: Collection
特点:
	1)定义了 List 和 Set 集合中说应该具有的所有方法

	1.说明:
		1)Collenction 接口 JDK1.2 开始定义,并且所有数据用Object接收,不安全。
		2)JDK1.5 使用泛型定义,并且继承了 Iterable(迭代) 接口。
		3)JDK1.8 接口引入 static 和 default 定义方式,Collection中的方法得到扩充。
    2.9个常用方法

    	注:可以按添加、删除、判断、获取分类方法。

    	1)public boolean add(E e)	向集合里面保存数据
    		对于List集合,永远返回true;
    		对于Set集合,当添加重复元素时返回false。

    	2) public boolean addAll(Collection<? extends E> c)  追加一个集合

		3) public void clear() 清空结合,根元素为null
			对象.clear(); 表示把集合中的元素清空
			对象 = null; 表示取消这个集合的对象,输出为null,如果调用size()方法,空指针异

		4)public boolean isEmpty() 
			判断集合是否为空,为空返回true,否则返回fals。

		5) public boolean remove(Object o)
			删除成功返回true;没有指定的元素返回false;
			调用remove()方法,自定义类需要覆写equals()方法。

		6) public int size()
			返回集合中元素的个数

		7) public Object[] toArray()
			将集合内的所有元素转换为Object数组

		8) public Iterable<E> iterable()
			获取一个迭代器,用来遍历集合元素的对象
			获取一个迭代器:
						Collection<T> list = new ArrayList<T>();
						Iterable<T> it = list.iterable();
			迭代器是单向的,只能使用一次,如果想要再次使用,需要再创建一个迭代器。
			迭代的时候不允许增删集合中的元素。

		9) public boolean contains(Object o)
			判断集合是否存在指定元素,存在返回true;否则返回false。
			调用contains(),自定义类方法需要覆写equals()方法。

	3.子接口 
		1)List
			特点:
				1) 以线性方式存储,有序的(取出顺序与存入顺序一致)
				2) 可以存储重复元素,需要通过equals()方法来判断是否重复
				3) 可以通过索引访问集合中的元素
			扩充方法:
					public E get(int index)
						根据指定索引,获取该集合相应位置的元素。
					public E set(int index, E element)
						用指定元素替换集合中指定位置的元素,并返回被替换的元素
					public ListIterator<E> listIterator()
						List 的迭代器
					public E remove(int index)
						移除集合中指定索引的元素,并返回被移除的元素

		    子类实现:
		    	1) ArrayList
		    		数据存储的构为数组结构,增删慢,查找快,但是用ArrayList完成任何需求的做法是不提倡的,因为这并不严谨。
		    		默认开辟一个十个长度的内存空间。
		    	2) LinkedList	
		    		数据存储的结构是链表结构,LinkedList是一个双向链表,可以进行收尾操作。LinkedListye 也可以所谓堆栈和队列的结构使用。
		    	3)常用方法
		    		public void addFirst(E e)
		    		public void addLast(E e)
		    		public void getFirst()
		    		public void getLast()
		    		public E removeFirst()
		    		public E removeLast()
		    		public E pop()
		    			从此列表说表示的堆栈处弹出一个元素,如果为空不抛出异常,比较常用。
		    		public void push(E e)
		    			将元素推入此列表表示的堆栈
		    		public boolean isEmpty()
		2) set 
			并没有再Collection接口的基础上扩充功能,知识比Collect接口更加严格
			特点:
				(1)无序的
				(2)不能存储重复元素
			子类实现:
				(1)HashSet
					(a)存储的元素不可重复,并且集合中元素存取顺序不一致。
					(b)其底层是由HashMap支持的。
					(c)根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能,
					但任何操作都要先生成哈希值,快慢取决于哈希值。保证元素的唯一性依赖于 hashCode() 和 equals()方法
				 	原理
						(a)先来介绍一下哈希表:
								JDK1.8 之前,哈希表底层采用数组 + 链表来实现,即使用链表处理冲突么,同一hash值的链表都存储在一个链表里
								但一个桶中的元素较多,即hash值相等的元素较多时,使用key值一次查找的效率低,所以在 JDK1.8 中哈希表存储采用
								数组 + 链表 + 红黑树来实现,但链表长度超过阀值(8)时,将链表转换为红黑树,这样大大降低了查找时间。
						(b)图示
					注:hashCode()和 equals()方法保证了HashSet集合中元素的唯一性,所以在存储自定义类对象时,自定义类需要覆写hashCode()和 equals()方法。
				
				(2)LinkedHashSet
						LinkedHashSet 是有序的
						LinkedHashSet 是 链表 和 哈希表 组合的一个数据存储结构
						链表保证集合的有序性
						哈希表保证集合的唯一性
	3.Collections
		集合工具类,用来对集合进行操作
		(1)常用方法
			public static <T> boolean addAll(Collection<T> c, T... elements)
				向指定集合中添加多个元素
			public static void shuffle(List<?> list)
				打乱集合中元素的顺序
			public static <T> void sort(List<T> list)
				将集合中的元素按照默认规则排序
			public static <T> void sort(List<T> list, Comparator<? super T)
				将集合中的元素按照指定规则排序

二 Map集合
	映射是指事物之间一一对应的关系,而Java提供了专门的集合来存放这种映射关系的对象---Map接口
	Map内部也使用了数据结构,任何的数据结构都是应用在键上,不对值进行管理
	HashMap 的键是哈希表结构
	优点:
		1)查询速度很快
	1.Map接口下的集合与Collection接口下的集合存储数据的形式不同
		1)Collection 接口
				(1)单列集合规范了每次存储一个元素(单个元素)
				(2)元素是孤立存在的(理解为单身)
		2)Map 接口
				(1)规范了双列集合的规范 Map<K,V>,K 代表键的类型,V代表值的类型,每次存储一对儿元素
				(2)Map中的元素时成对儿存在的(理解为夫妻),通过键可以找对应的值
				(3)Map中的集合不能包含重复的键,值可以重复且每个键只能对应一个值
	2.常用方法
		public V put(K key, V value)
			把指定的键与指定的值添加到Map集合中
			注:若指定的键在集合中没有,则没有这个键所对应的值并返回null,并把指定的键值添加到集合中
				若存在,则返回键对应值,并把指定键所对应的值替换为指定的新值
		public V remove(Object key)
			把指定的键所对应的键值对儿元素在Map集合中删除,并返回被删除元素的值
			若该键不存在,则返回null
		public V get(Object key)
			根据指定的键,在Map集合中获取对应的值
			若该值不存在,则返回null
		public Set<K> keySet()
			获取Map集合中所有的键,存储到Set集合中
		public Set<Map.Entry<K,V>> entrySet()
			获取到Map集合中所有的键值对儿对象的集合(Set集合)
	3.Entry键值对对象
		1)键(key)与值(value)这种在Map集合中一一对应的关系,称为Map中的一个Entry(项)
			Entry将键值对的对应关系封装成了对象,即键值对对象。
		2)操作方法
			public K getKey()
				获取Entry对象中的键
			public V getValue()
				获取Entry对象中的值
		3)
			(1)Map接口中有一个内部接口,Entry,它里面定义了上述两个方法
			(2)HashMap中有一个内部类 Node 实现了Map.Entry接口
			(3)当我们想HashMap中添加一个键值对时,HashMap会将这个键值对直接防撞到一个Node对象中
	4.找值方式
		1)集合遍历键找对应值方式
		2)集合遍历键值对方式   Map集合不能直接使用迭代器或foreach进行遍历,需要转换成Set集合
		注:HashMap 存储自定义对象,如自定义对象作为key存在,要保证对象唯一,必须覆写 equals()和 hashCode() 方法
			若要保证map中的key存取顺序一致,可以使用 LinkedHashMap 集合来存放
	5.LinkedHashMap 
		1)组成
			LinkedHashMap 的键是由链表和哈希表组合的一个数据结构
		2)特点
			存取顺序一致
	6.JDK1.9 对集合添加的优化
		1)通常实例化集合的时候,add()方法调用使得代码重复
			在 JDK1.9 中添加了几种集合工厂方法,方便创建少量元素的集合、map实例。
			新的List、Set、Map的静态工厂方法可以更方便地创建集合的不可变实例。
		2)操作方法
			of() 方法是Map、List、Set这上个接口的静态方法,其父类接口和子类实现并没有这类方法,例如HashSet、ArrayList等。
		3)返回的集合是不可变的


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值