java高级特性:1.集合框架和泛型(一)list、Set 、Iterator

集合框架和泛型(一)list Set Iterator

集合与数组
数组
• 数组可以用来保存多个基本数据类型的数据,也可以用来保存多个对象。
• 数组的长度是不可改变的,一旦初始化数组时就指定了数组的长度(无论是静态初始化还是动态初始化)。
• 数组无法保存具有映射关系的数据。
集合
• 集合是只用于存储数量不等的对象。
• 集合的长度是可变的。
• 集合可以保存具有映射关系的数据。
相同点
• 数组和集合类同是容器。
不同点
• 数组的长度是固定的,集合的长度是可变的。
• 数组只能存储同类型的对象,集合可以存储不同类型的对象。
• 集合只能存储对象不能存储基本类型

java常用集合关系简图
java常用集合关系简图

集合中接口和类的关系
Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让其被继承产生了两个接口,就是Set和List。Set中不能包含重复的元素。List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。
Map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value对。Map不能包含重复的key,但是可以包含相同的value。
Iterator所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
1.hasNext()是否还有下一个元素。
2.next()返回下一个元素。
3.remove()删除当前元素。
list(有序、可重复)
List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。
ArrayList
  ArrayList是基于数组的,在初始化ArrayList时,会构建空数组(Object[ ] elementData={ })。ArrayList是一个无序的,它是按照添加的先后顺序排列,当然,他也提供了sort方法,如果需要对ArrayList进行排序,只需要调用这个方法,提供Comparator比较器即可
add操作:
  1)如果是第一次添加元素,数组的长度被扩容到默认的capacity,也就是10.
  2) 当发觉同时添加一个或者是多个元素,数组长度不够时,就扩容,这里有两种情况:
  只添加一个元素,例如:原来数组的capacity为10,size已经为10,不能再添加了。需要扩容,新的capacity=old capacity+old capacity>>1=10+10/2=15.即新的容量为15。
  当同时添加多个元素时,原来数组的capacity为10,size为10,当同时添加6个元素时。它需要的min capacity为16,而按照capacity=old capacity+old capacity>>1=10+10/2=15。new capacity小于min capacity,则取min capacity。
  对于添加,如果不指定下标,就直接添加到数组后面,不涉及元素的移动,如果要添加到某个特定的位置,那需要将这个位置开始的元素往后挪一个位置,然后再对这个位置设置。
Remove操作:
 Remove提供两种,按照下标和value。
  1)remove(int index):首先需要检查Index是否在合理的范围内。其次再调用System.arraycopy将index之后的元素向前移动。
  2)remove(Object o):首先遍历数组,获取第一个相同的元素,获取该元素的下标。其次再调用System.arraycopy将index之后的元素向前移动。
Get操作:
返回指定位置元素,取出元素是Object类型使用前需要强制转化。


package arrayslist;

import java.util.ArrayList;
import java.util.List;

public class Test {
	public static void main(String[] args) {
		
	
	 List list=new ArrayList();//创建List集合
	  //1:增加元素的方法:add方法  addAll()
	  list.add(10);
	  //2:将元素增加到指定位置
	  list.add(0,9);
	  System.out.println(list);
	  //3:获取集合中实际的元素个数
	  System.out.println(list.size());
	  //4:根据索引随机获取元素
	  System.out.println("集合中的第二个元素是:"+list.get(1));
	  //5:判断集合中是否存在该元素
	  System.out.println("集合中是否存在10?"+list.contains(10));
	  //6:移除集合元素的方法
	  Object o=10;
	  list.remove(o);
	  //7:按照指定位置移除元素
	  list.remove(0);
	  System.out.println(list);
}
}
输出结果
[9, 10]
2
集合中的第二个元素是:10
集合中是否存在10?true
[]

LinkedList
linkedList 是一个双向链表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增
  LinkedList是基于链表的,它是一个双向链表,每个节点维护了一个prev和next指针。同时对于这个链表,维护了first和last指针,first指向第一个元素,last指向最后一个元素。LinkedList是一个无序的链表,按照插入的先后顺序排序,不提供sort方法对内部元素排序。
Add元素:
  LinkedList提供了几个添加元素的方法:addFirst、addLast、addAll、add等,时间复杂度为O(1)。
Remove元素:
  LinkedList提供了几个移除元素的方法:removeFirst、removeLast、removeFirstOccurrence、remove等,
Get元素:
  根据给定的下标index,判断它first节点、last直接距离,如果index<size(数组元素个数)/2,就从first开始。如果大于,就从last开始。这个和我们平常思维不太一样,也许按照我们的习惯,从first开始。这也算是一点小心的优化吧。
遍历
在类集中提供了以下四种的常见输出方式:
1)Iterator:迭代输出,是使用最多的输出方式。
2)ListIterator:是Iterator的子接口,专门用于输出List中的内容。
3)foreach输出:JDK1.5之后提供的新功能,可以输出数组或集合。
4)for循环
代码示例如下:
for的形式:for(int i=0;i<arr.size();i++){…}
foreach的形式: for(int i:arr){…}
iterator的形式:
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); …}


import java.util.LinkedList;

public class LinkedListTest {
	  public static void main(String[] args) {
		// 创建集合对象
			LinkedList list=new LinkedList();
			//添加新闻标题
			list.add("新闻标题2");
			list.add("新闻标题3");
			//添加最末尾的新闻标题
			list.addLast("新闻标题4");
			//添加首部新闻标题
			list.addFirst("新闻标题1");
			System.out.println(list);
			//按照指定位置移除下标为1的元素
			list.remove(1);
			System.out.println(list);
			//删除list中第一个元素
			list.removeFirst();
			System.out.println(list);
		}
}
输出结果
[新闻标题1, 新闻标题2, 新闻标题3, 新闻标题4]
[新闻标题1, 新闻标题3, 新闻标题4]
[新闻标题3, 新闻标题4]

Set(无序、不能重复)
Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。
HashSet
  HashSet是基于HashMap来实现的,操作很简单,更像是对HashMap做了一次“封装”,而且只使用了HashMap的key来实现各种特性,而HashMap的value始终都是PRESENT。
  HashSet不允许重复(HashMap的key不允许重复,如果出现重复就覆盖),允许null值,非线程安全。
构造方法
HashSet()
  构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。
HashSet(Collection<? extends E> c)
  构造一个包含指定 collection 中的元素的新 set。
HashSet(int initialCapacity)
  构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
HashSet(int initialCapacity, float loadFactor)
  构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。
方法
boolean add(E e)
  如果此 set 中尚未包含指定元素,则添加指定元素。
void clear()
  从此 set 中移除所有元素。
** Object clone()
  返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。
boolean contains(Object o)
  如果此 set 包含指定元素,则返回 true。
boolean isEmpty()**
  如果此 set 不包含任何元素,则返回 true。
** Iterator iterator()
  返回对此 set 中元素进行迭代的迭代器。
boolean remove(Object o)
  如果指定元素存在于此 set 中,则将其移除。
int size()**
  返回此 set 中的元素的数量(set 的容量)。

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
		Set sets=new HashSet();
		sets.add("1");
		sets.add("2");
		sets.add("3");
		sets.add("4");
		System.out.println(sets);
	    //Iterator:迭代器
		Iterator iterator = sets.iterator();
		while(iterator.hasNext()){//迭代器中是否存在下一个元素 boolean
			System.out.println(iterator.next());
		}
	}
}
输出结果
[3, 2, 1, 4]
3 2 1 4 

list效率对比
在这里插入图片描述

ListIterator和Iterator的区别
1、迭代器指向的位置是元素之前的位置。
在这里插入图片描述

当使用语句Iterator it=List.Iterator()时,迭代器it指向的位置是Iterator1指向的位置,当执行语句it.next()之后,迭代器指向的位置后移到Iterator2指向的位置。
二者的不同之处:
1、使用范围不同,iterator可以应用于所有的集合,Set、List和Map以及这些集合的子类型ListIterator只能用于List及其子类型。
2、ListIterator有add方法,可以向List中添加对象,而Iterator不能。
3、ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向遍历,但是iterator不可以。
4、ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
5、都可以实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能实现修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值