集合类
数组可以储存统一数据类型的数据,但长度固定,不适合在数组元素数量未知的情况下使用。集合弥补了数组的这一缺陷。集合API中的接口和类主要位于java.util包中。
1) 集合只能存放对象。比如咱们将一个int类型数据 2020放入集合中,其实该数据是自动转换成Integer对象后存入集合中。
2) 集合存放的是对象的引用,对象本身还是放在堆内存中。
3) 集合元素数量可改变
集合简介
Collection 接口是集合层次框架的根接口,是储存单一对象的集合(即每个位置保存的是单一的对象)。
1、Collection接口有两个直接扩展的子接口:List 与 Set 。
1)List 接口里存在的集合元素顺序,可以重复。接口常用的实现类主要有ArrayList、Vector 和 LinkedList。
ArrayList 和 Vector相似,都是顺序储存,支持对元素的快速访问,但是插入与修改速度慢。
LinkedList是链式储存,元素插入与删除性能好。
2)Set 接口不按顺序存放集合元素,不允许重复元素存在,只是简单地把对象加入到集合中。Set中的实现类有HashSet、LinkedHashSet、TreeSet。
2、Iterator 是用于遍历集合元素的接口,相当于指向集合元素的指针。大部分集合类都实现Iterator接口。
public boolean hasNext(); // 是否还会有下一个元素 public Object next(); // 指针移动到下一个元素,并返回下一个元素对象 public void remove(); // 删除当前指针指向的元素
3、Map是java.util包中的另一个集合接口,它和Collection接口没有关系,但都属于集合类的一部分。Map集合中存储的是键值对,而不是单个的对象,键不能重复,值可以重复。
Collection接口
Collection接口中定义了很多集合共有的成员方法。
public boolean add (Object obj); // 将对象obj 加入到当前集合中。 public boolean addAll (Collection c); // 将集合c 添加到当前集合中。 public void clear(); // 清理当前集合中的所有元素。 public boolean contains(Object obj); // 判断当前集合中是否含有obj 对象。 public Iterator iterator(); // 得到当前集合的迭代器(指针)。 public boolean remove(Object obj); //删除当前集合中的obj 对象。 public boolean isEmpty(); // 判断当前集合是否为空。 public int size(); // 得到当前集合中元素的总数。 public Object[] toArray(); // 将当前集合对象转换为对象数组。
Set接口
Set 接口是Collection 接口的子接口。Set 中的元素没有顺序,不允许有重复的元素,不重复是指集合中任意的2个对象x与y,x.equals(y)始终为 false。
Set常见的实现类主要有AbstractSet、HashSet、LinkedHashSet、TreeSet 等。
AbstractSet: 所有的Set的实现类直接或者间接继承AbstractSet父类。
HashSet: 使用哈希表实现的Set集合,允许存放null元素,不保证元素排列顺序,在编程中常使用该类。
LinkedHashSet: 使用链表实现Set 集合,既有HashSet 的查询速度,又能保存元素的插入顺序。
TreeSet: 使用二叉树实现Set集合,用来对元素进行排序,保证元素的唯一。
// Set与HashSet的用法 public class SetDemo{ public static void main(String []args){ Set set=new HashSet(); set.add("a3"); set.add("a2"); set.add(new Double(7.0)); set.add(new Integer(1)); set.add("a3"); System.out.println("set = "+set); for(Object o:set){ System.out.print( ""+o); } } } // 输出结果如下 set = [a2, 1, a3, 7.0] a2 1 a3 7.0 // 注意: 1) 输出结果中集合里的元素没有顺序(即没有按照输入顺序,也没有按照自然顺序)。 2) 输出结果中没有重复元素。如重复的字符a3 就没有重复的。
List接口
List 接口是Collection接口的子接口,定义一个允许重复元素存在的有序对象集合。List 中存放元素的数量(List的容量)可以随着插入操作自动进行调整。
除了从Collection接口中继承的方法外,List接口新增如下的成员方法。
1) public void add(int index,Object obj); // 当前集合index 位置插入对象obj 2) public boolean addAll(int index,Collection c); // 当前集合index 位置插入集合c 3) public Object set(int index,Object obj); // 将集合index 位置的元素用对象obj替换 4) public Object get(int index); // 返回index 位置的元素 5) public Object remove(int index); // 删除index 位置的元素 6) public int indexOf (Object obj); // 返回对象o在集合中第一次出现的位置,如果不存在则返回-1 7) public int lastIndex (Object o); // 返回对象o在集合中最后一次出现的位置,如果不存在则返回-1 8) public List subList (int fromIndex,int toIndex); // 得到一个从fromIndex 开始到toIndex处的当前集合的一个子集合。 9) public ListIterator listIterator(); // 返回当前集合中元素的列表迭代器对象。 10) public ListIterator listIterator(int index); // 从当前集合的指定位置index开始,返回当前集合中元素的列表迭代器。
List 接口常用实现类 ArrayList、Vector、LinkedList、Stack。
1.ArrayList
ArrayList使用顺序存储结构储存对象元素,随机访问速度快。但从ArrayList 集合的中间位置插入或者删除元素时,需要对元素进行复制、移动,代价比较高。因此ArrayList适合进行随机查找和遍历,插入和删除速度慢。
构造方法如下
public ArrayList(); //构造一个空List集合对象。 public ArrayList(Collection c) //构造一个包含指定集合c 的List集合对象。 public ArrayList(int iny); // 构造一个指定大小为iny但内容为空的List集合对象。
// List和ArrayList的用法 import java.util.ArrayList; import java.util.List; public class ListDemo { public static void main(String []args) { List list =new ArrayList(); list.add("1"); list.add(new Double(3.0)); list.add("1"); System.out.println("List= "+list); } } // 运行结果 List= [1, 3.0, 1]
2.Vector
Vector 跟ArrayList 类似,也是采用顺序储存结构储存元素对象。不同点是Vector 是线程安全的,同时可按指定个数扩大容量或翻倍扩大容量。而ArrayList 不是线程安全的,按照50%的比例扩大空间。
3.LinkedList
LinkedList用链表结构储存数据,适合数据的动态插入和删除,随机访问和遍历速度慢。
构造方法如下
public LinkedList(); // 构造一个空的LinkedList集合对象
常用的成员方法
4.Stack
Stack(栈)是一种”先进后出“的数据结构,输入或输出数据的一端叫做“栈顶”,另一端叫“栈底”。Stack是专门用来实现栈的工具类,继承自Vecter类。
构造方法如下
public Stack();
常用的成员方法
public
Iterator接口
所有实现Collection接口的类都有一个iterator()方法,用来返回一个实现Iterator接口的对象,其作用是对Collection的元素进行遍历等操作,只能单向移动。它有以下3个成员方法。
public boolean hasNext(); //判断集合中是否还有元素。 public Object next(); // 得到下一个元素。 public void remove(); // 从集合中删除当前元素。
// 利用Iterator 接口遍历Set中的元素 Set set = new HashSet(); set.add("123"); set.add("abc"); Itera
ListIterator 接口
List集合类现了ListIterator接口,在List接口中有listIterator()方法用于返回ListIterator接口。
istIterator的功能更加强大,定义的方法有: 1).hasNext() 向前遍历时,如果有下一个元素返回真; 2).next() 返回下一个元素的值,并将指针加1; 3).hasPrevious() 向相反方向遍历时,如果还有元素返回真; 4).previous() 返回上一个元素的值,并将指针前移1; 5).nextIndex() 返回此时调用next()方法时返回的元素的索引; 6).previousIndex() 返回此时调用previous()方法时返回的元素的索引; 7).remove() 移除最近一次调用next()或previous()方法返回的元素(可选); 8).set(E e) 用元素e将如果此时调用next()或previous()方法返回的元素替换掉; 9).add(E e) 添加元素到此时调用next()返回的元素之前,或此时调用previous()返回的元素之后。
集合遍历的方法
List集合遍历三种方法
第一种、最基础的遍历方式:for循环,指定下标长度,使用List集合的size()方法,进行for循环遍历
import java.util.ArrayList; public class Demo01 { public static void main(String[] args) { ArrayList<News> list = new ArrayList<News>(); list.add(new News(1,"list1","a")); list.add(new News(2,"list2","b")); list.add(new News(3,"list3","c")); list.add(new News(4,"list4","d")); for (int i = 0; i < list.size(); i++) { News s = (News)list.get(i); System.out.println(s.getId()+" "+s.getTitle()+" "+s.getAuthor()); } } }
第二种、较为简洁的遍历方式:使用foreach遍历List,但不能对某一个元素进行操作(这种方法在遍历数组和Map集合的时候同样适用)
import java.util.ArrayList; public class Demo02 { public static void main(String[] args) { ArrayList<News> list = new ArrayList<News>(); list.add(new News(1,"list1","a")); list.add(new News(2,"list2","b")); list.add(new News(3,"list3","c")); list.add(new News(4,"list4","d")); for (News s : list) { System.out.println(s.getId()+" "+s.getTitle()+" "+s.getAuthor()); } } }
第三种、适用迭代器Iterator遍历:直接根据List集合的自动遍历
import java.util.ArrayList; public class Demo03 { public static void main(String[] args) { ArrayList<News> list = new ArrayList<News>(); list.add(new News(1,"list1","a")); list.add(new News(2,"list2","b")); list.add(new News(3,"list3","c")); list.add(new News(4,"list4","d")); Iterator<News> iter = list.iterator(); while (iter.hasNext()) { News s = (News) iter.next(); System.out.println(s.getId()+" "+s.getTitle()+" "+s.getAuthor()); } } }