Java——集合

mac2022-06-30  78

一、集合接口和迭代器

在Java类库中,Collection接口是所有集合类的基本接口。这个接口有两个基本方法:add和iterator。 add方法用于向集合中添加元素。如果结果改变返回true,否则返回false。 iterator方法用于返回一个实现了Iterator接口的对象。 public interface Iterator{ Boolean hasNext(); Object next(); void remove(); }

通过反复调用next方法,可以遍历集合中每个元素。为了防止在到达集合末尾时抛出异常,我们需要在调用next之前调用hasNext方法,如果迭代器对象还有多个可访问的元素,则返回true,否则返回false。

public class Ergodic { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.add(5); list.add(2); list.add(3); java.util.Iterator<Integer> it = list.iterator(); while (it.hasNext()) { int i = (Integer) it.next(); System.out.println(i); } }

当然,这里循环有更加简便的方法。

public class Ergodic { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.add(5); list.add(2); list.add(3); System.out.println("用iterator+while"); java.util.Iterator<Integer> it = list.iterator(); while (it.hasNext()) { int i = (Integer) it.next(); System.out.println(i); } System.out.println("用for循环遍历"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } System.out.println("用增强for循环"); for (Integer i : list) { System.out.println(i); } System.out.println("用iterator+for"); for (java.util.Iterator<Integer> iter = list.iterator(); iter.hasNext();) { int i = (Integer) iter.next(); System.out.println(i); } } }

由此可见,用增强for循环可以更加简练的表示同样的操作,并且对于任意标准类库中的集合都可以使用“for each”循环。

 

二、具体集合

集合类存放于java.util包中。 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。 集合类型主要有3种:set(集)、list(列表)和map(映射)。

 

集set (没有重复项目的集合)  

HashSet-构造一个散列集,用hashCode()方法返回这个对象的散列码。

TreeSet-构造一个有序树集  

public class TreeSetT { public static void main(String[] args) { SortedSet<String> set = new TreeSet<>(); set.add("B"); set.add("C"); set.add("A"); for(String s:set){ System.out.println(s); } } }

运行结果:ABC

对象的比较,这里使用compareTo,如果this位于other之前返回负值,如果两个对象在排列中处于相同的位置,返回0 ,否则返回正值。

LinkedHashSet-对集迭代时,按增加顺序返回元素 

 

列表List (描述一个有序的集合)

ArrayList(封装了一个动态再分配的对象数组)-类似于Vector。区别:

一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。二.数据增长:当需要增长时,Vector默认增长为原来一倍,而ArrayList却是原来的一半。

因此,在使用时代码要在同步上耗费大量时间,所以在不需要同步时,使用ArrayList。

LinkedList(链表)-是双向链表,每个节点都有两个指针指向上一节点和下一节点。 

用add()加入元素,将对象添加至链表的尾部。 remove()删除元素。 运行结果:[B, C]

public class LinkedListT { public static void main(String[] args) { List<String> list = new LinkedList<>(); list.add("A"); list.add("B"); list.add("C"); java.util.Iterator<String> iter = list.iterator(); iter.next();//返回第一个元素。 iter.remove(); System.out.println(list); } }

由于要将元素添加至链表的中间,子接口ListIterator用来反向遍历链表,与next方法一样,previous返回越过的对象。

下面是越过链表中第一个元素A并在第二个元素B之前添加元素a的一个例子。运行结果:[A, a, B, C]

public class LinkedListT { public static void main(String[] args) { List<String> list = new LinkedList<>(); list.add("A"); list.add("B"); list.add("C"); java.util.ListIterator<String> iter = list.listIterator(); iter.next(); iter.add("a"); System.out.println(list); } }

set()方法取代调用next或者previous返回的上一个元素。运行结果:[a, B, C][a, C]

public class LinkedListT { public static void main(String[] args) { List<String> list = new LinkedList<>(); list.add("A"); list.add("B"); list.add("C"); java.util.ListIterator<String> iter = list.listIterator(); iter.next();//返回第一个元素 iter.set("a"); System.out.println(list); iter.next();//返回下一个元素 iter.remove(); System.out.println(list); } }

 

映射表Map  (用于存放键/值对)

实现Map接口的两个类:

HashMap-散列表的通用映射表 

Map<String, Integer> map = new HashMap<>(); map.put("key", 1);

TreeMap-构造树映射表   

 

三个视图:

键集KeySet()  

值集合(不是集)values() 

键/值对集enrySet()

注意:KeySet既不是HashSet,也不是TreeSet,而是实现了Set接口的某个其他类的对象,Set扩展了Collection接口,因此可以与使用人任何集合一样使用KeySet。  

Set<Integer> keys = map.keySet(); for (Integer key : keys) { System.out.println(key); }

如果需要查看键与值,可用下面两种方法

public static void main(String[] args) { HashMap<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "a"); map.put(2, "b"); map.put(3, "c"); /* * 第一种 */ Set<Entry<Integer, String>> set = map.entrySet(); java.util.Iterator<Entry<Integer, String>> itor = set.iterator(); while (itor.hasNext()) { Entry<Integer, String> entry = itor.next(); System.out.println(entry.getKey() + " " + entry.getValue()); } /* * 第二种 */ for (Entry<Integer, String> entry : map.entrySet()) System.out.println(entry.getKey() + " " + entry.getValue()); }

 

专用集与映射表类

WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

LinkedHashMap用来记住插入元素项的顺序。

 

转载于:https://www.cnblogs.com/iCcccy/p/4708600.html

最新回复(0)