java集合框架详解
1.java集合框架概述
java SE包含了由一组类和接口组成的java集合框架(java Collection Framework,简称JCF),其主要功能是用来将存储的数据以某种结构组织,并以特定的方式来访问这些数据,其目标是提供一个处理对象集合的通用框架,减少程序员处理不同对象集合时的编码量。
集合类中的一些区别,除了它们是否支持重复元素操作外,还包括元素是否有顺序,以及是否允许添加null元素。java集合框架中根据这三个区别,将对象的存储方式分为三种类型,分别是:
- Set(集):对象容器中的对象没有顺序,且不能重复。
- List(列表):对象容器中的对象按照索引顺序排序,而且可以有重复的对象。
- Map(映射):对象容器中的元素包含一对“键对象-值对象”映射,其中键对象不能重复,值对象可以重复。
为支持对象的排序和遍历访问操作,java集合框架中又提供了几个接口:
- 接口SortedSet为Set类型容器提供拍戏功能。
- 接口SortedMap为Map类型容器提供对键对象的排序。
- 接口Comparable和comparator用来实现集合中对象的排序。
2.Collection接口和Iterator接口
Collection接口中定义了Collection对象共有的一些基本方法
方法 | 描述 |
int size() | 返回当前集合中包含的元素个数 |
isEmpyt() | 判断集合中是否含有元素 |
boolean contains(Objact o) | 判断集合中是否含有某一指定元素 |
add(Objact o) | 向集合中添加某一个元素 |
remove(Objact o) | 从集合中删除某一元素 |
Iterator iterator() | 返回一个遍历器,用来访问集合中的各个元素 |
Iterator接口是一种用于遍历集合的接口。
方法 | 描述 |
hasNext() | 如果集合中还有更多元素,该方法返回true |
next() | 返回集合中的下一个元素 |
remove() | 删除Iterator返回的最后一个元素 |
1.List接口
List接口继承自Collection接口,它有如下特点:
- List中的元素是有顺序的。
- List通常允许重复元素。
- List的实现类通常支持null元素。
- 可以通过索引访问List对象容器中的元素。
List接口最常用的实现类是ArrayList类和LinkedList类。
1).ArrayList
程序实例:
package lei; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List list = new ArrayList<>(); list.add(1); list.add("zhangsan"); list.add(false); list.add('a'); list.add(0, "lisi"); list.add(1); list.remove(1); list.remove(2); list.set(0, "wangwu"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } }
Object类定义的equals()方法只有在传递给该方法的对象与调用该方法的对象是同一对象的时候,才会返回true。可以通过重写equals()方法来把具有相同状态的两个对象被看做是同一对象。
2).LinkedList
方法 | 描述 |
void addFirst | 在链表开头添加一个对象 |
void addLast | 在链表末尾添加一个对象 |
getFirst() | 返回链表中的第一个元素 |
getLast() | 返回链表中的最后一个元素 |
removeFirst() | 删除链表中的第一个元素 |
removeLast() | 删除链表中的最后一个元素 |
程序实例:
package lei; import java.util.LinkedList; import java.util.List; public class Test2 { public static void main(String[] args) { LinkedList l=new LinkedList<>(); l.add("zhangsan"); l.add("lisi"); l.addFirst(1); l.addLast(4); System.out.println(l.getFirst()); System.out.println(l.getLast()); l.removeFirst(); l.removeLast(); for (int i = 0; i < l.size(); i++) { System.out.println(l.get(i)); } } }
LinkedList与ArrayList的选择
如果列表需要快速存取,但不经常进行元素的插入和删除操作,那么选择ArrayList会好一些;如果需要对;列表进行频繁的插入和删除操作,那么就应该选择LinkedList。
2.set接口
set接口继承自Collectiion接口,同时也继承了Collection接口的全部方法。set接口有以下特点:
- Set类型容器中不能包含重复元素。当加入一个元素到容器中时,要比较元素的内容是否存在重复的,所以加入Set类型对象容器的对象必须重写equals()方法。
- 元素能能有顺序,也可能没有顺序。
- 因为元素可能没有顺序,所以不能基于下标访问Set中费元素。
实现Set接口最常用的是HashSet类和TreeSet类。
1).Hashset
Hashset类是基于哈希算法的Set接口实现,它主要有如下几个特点:
- 当遍历Hashset时,其中的元素是没有顺序的。
- Hashset中不允许出现重复元素。这里的重复元素是指有相同的哈希码,并且用equals()方法进行比较时,返回true的两个对象。
- 允许包含null元素。
如果我们编写的类重新定义了equals方法,那么这个类也必须重新定义hashCode()方法,并且保证当两个对象用equals方法比较结果为true时,这两个对象的hashCode()方法的返回值相等。
程序实例:
package lei; import java.util.HashSet; import java.util.Set; public class Test4 { public static void main(String[] args) { Set<String> set=new HashSet<String>(); set.add("zhangsan"); set.add("lisi"); for(String s:set){ System.out.println(s); } } }
2).TreeSet
TreeSet类不仅实现类Set接口,还实现了SortedSet接口,从而保证集合中的对象按照一定的顺序排序。当向TreeSet集合中添加一个对象时,会把它插入到有序的对象序列中,但是这种排序并不是按照对象添加的顺序排序,而是按照一定的算法来排序。
TreeSet使用元素的自然顺序对元素进行排序,或者根据创建Set时提供的Comparator进行排序。TreeSet支持自然排序和自定义排序两种排序方式。
3.Map接口
Map(映射)接口是java集合框架中不同于Collection接口的另一个重要接口,它对应的是在一种从键(Key)到值(Value)的对应关系的集合。Map类型的对象容器里面保存着两组对象,一组对象用于保存Map里的Key,另外一组用于保存Value。Key和Value可以升级任何引用类型的数据。Key不能重复,但是Value可以重复。
1).HashMap
HashMap是基于哈希算法的Map接口的实现。HashMap将它的键保存在哈希表中进行维护,键是唯一的。但是,HashMap并不保证键以特定顺序排列,特别是不保证顺序永久不变。
HashMap类实现了Map接口,从而具有Map接口的所有方法。
package day1228; import java.util.*; public class HashMapDemo { public static void main(String[] args) { // 创建一个新的HashMap Map<String, String> map = new HashMap<String, String>(); map.put("a1", "xiao"); map.put("b2", "xiaol"); map.put("a4", "xiaosd"); map.put("b1", "12a"); map.put("a3", "1"); // 使用iterator遍历 键和值 System.out.println("之前的Map值是:"); Set<String> keys = map.keySet(); for (Iterator<String> i = keys.iterator(); i.hasNext();) { String key = i.next(); String value = map.get(key); System.out.println(key + "=" + value); } // 删除键为"a4"的值 System.out.println("\n删除键值为a4的元素"); map.remove("a4"); // //使用iterator遍历 键和值 System.out.println("\n之后的Map值:"); keys = map.keySet(); for (Iterator<String> i = keys.iterator(); i.hasNext();) { String key = i.next(); String value = map.get(key); System.out.println(key + "=" + value); } } }
2).TreeMap
TreeMap类是基于红黑树算法的Map接口实现。TreeMap中键的存放方式与TreeSet相似,它将键存放在树中,键的顺序按照自然顺序或者自定义顺序两种方式排列。
程序实例:
package day1228; import java.util.*; public class TreeMapDemo { public static void main(String[] args) { //创建一个新的TreeMap Map<Integer, String> map = new TreeMap<Integer, String>(); map.put(1, "one"); map.put(2, "two"); map.put(3, "three"); map.put(4, "four"); map.put(5, "five"); //使用iterator显示键和值 System.out.println("之前的map值为:"); Set<Integer> keys=map.keySet(); for(Object key:keys){ String value=map.get(key); System.out.println(key+"="+value); } //删除键为3的值 System.out.println("\n删除键值为3的元素"); map.remove(3); //使用iterator显示键和值 System.out.println("\n之后的值Map为:"); for(Object key:keys){ String value=map.get(key); System.out.println(key+"="+value); } } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!