集合框架是Java编程语言中的一个重要部分,它提供了一组接口和类,用于存储、检索和操作对象组。这个框架定义了各种类型的集合,包括列表、队列、集合和映射。
Java集合框架主要包括以下几个部分:
- 接口:集合框架定义了一些基本接口,如Collection、List、Set和Map。这些接口定义了集合类应该提供的方法。
- 实现类:Java集合框架提供了多种实现类,如ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。这些类实现了集合接口,提供了高效的实现。
- 算法:Java集合框架还包含了一些算法,如排序和搜索,这些算法可以在集合上执行。
下面是一些主要的接口和类:
- Collection:这是所有集合的根接口,定义了添加、删除和检查元素的方法。
- List:这是一个有序的集合,元素可以重复。List接口继承了Collection接口,并添加了一些额外的功能,如索引访问。
- Set:这是一个无序的集合,元素不能重复。Set接口继承了Collection接口,并添加了一些额外的功能,如检查成员资格。
- Map:这是一个键值对的集合,每个键都映射到一个值。Map接口定义了添加、删除和检索键值对的方法。
这些接口和类提供了丰富的功能,使得Java程序员可以方便地处理对象组。它们还提供了线程安全和并发控制机制,使得在多线程环境中也可以安全地使用。
一、Collection集合
Collection是Java集合框架中的根接口,它定义了所有集合的基本操作。Collection接口的主要方法包括添加、删除和检查元素。
Collection接口的一些主要方法包括:
add(E e)
: 添加一个元素到集合中。remove(Object o)
: 删除集合中的一个元素。contains(Object o)
: 检查集合中是否包含某个元素。size()
: 返回集合中的元素数量。isEmpty()
: 检查集合是否为空。
Collection接口是所有集合类的基本接口,包括List、Set和Queue等。这些接口都继承了Collection接口,并添加了一些特定的功能。例如,List接口提供了基于索引的访问,而Set接口不允许元素重复。
除了定义基本操作外,Java集合框架还提供了多种实现类,如ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等,这些类实现了Collection接口或其子接口,提供了高效的实现。
@Test
public void collectionTest() {
Collection collection=new ArrayList();
System.out.println(collection);//[]
boolean b=collection.add("one");//[one]
System.out.println("b="+b);//true
collection.add(2);//[one,2]
collection.add('a');//[one,2,a]
collection.add(3.14);//[one,2,a,3.14]
collection.add("张飞");//[one,2,a,3.14,张飞]
System.out.println(collection);
System.out.println("----------------------");
b= collection.contains("two");
System.out.println("b="+b);
b= collection.contains("one");
System.out.println("b="+b);
b= collection.isEmpty();
System.out.println("b="+b);
System.out.println("==========================");
System.out.println("集合中的元素有:"+collection);
b= collection.remove("one");
System.out.println("b="+b);
System.out.println("集合中的元素有:"+collection);
System.out.println("==========================");
Object[] objects=collection.toArray();
for(int i=0;i<objects.length;i++){
System.out.println(objects[i]);
}
List objects1=Arrays.asList(objects);
System.out.println(objects1);
System.out.println("===========================");
Iterator it=objects1.iterator();
/*b= it.hasNext();
System.out.println("b="+b);
Object obj=it.next();
System.out.println("元素:"+obj);*/
while (it.hasNext()==true){
Object obj=it.next();
System.out.println(obj);
}
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
for(Object obj:objects1){
System.out.println(obj);
}
}
二、List接口
List接口是Java集合框架中的一种接口,它继承了Collection接口,并添加了一些额外的功能。List接口表示有序的集合,元素可以重复。
List接口的主要特点包括:
- 有序性:List中的元素按照特定的顺序排列,可以通过索引访问元素。
- 元素可重复:List中的元素可以重复,即可以有多个相同的元素。
- 允许插入null值:List允许插入null值,表示该位置没有元素。
List接口的主要方法包括:
get(int index)
: 通过索引获取元素。set(int index, E element)
: 通过索引设置元素。add(int index, E element)
: 在指定位置插入元素。remove(int index)
: 删除指定位置的元素。listIterator(int index)
: 返回一个ListIterator对象,可以用来在指定位置插入和删除元素。
List接口的实现类包括ArrayList、LinkedList等。ArrayList基于动态数组实现,提供了快速的随机访问;LinkedList基于双向链表实现,提供了快速的插入和删除操作。
@Test
public void listTest(){
List list=new ArrayList();
int size=list.size();
System.out.println(size);
System.out.println(list);
list.add(0,"one");
list.add(1,2);
list.add(2,'3');
list.add(3,3.14);
System.out.println(list);
List list1=new ArrayList<>();
list1.add("two");
list1.add(10);
list.addAll(list1);
System.out.println("---------------------");
Object o=list.get(3);
System.out.println(o);
o=list.set(0,1);
System.out.println("下标为0的位置修改为:"+o);
System.out.println(list);
o=list.remove(0);
System.out.println("删除的元素:"+o);
System.out.println("============================");
System.out.println(list);
List list2=list.subList(0,3);
System.out.println("list集合:"+list);
System.out.println("字集合中的元素"+list2);
list2.remove(0);
}
三、 Queue集合
Queue是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,在表的后端(rear)进行插入操作。这种数据结构遵循先进先出(FIFO)的原则。
Queue接口的主要方法包括:
add(E e)
: 在队列尾部添加一个元素。remove()
: 移除并返回队列头部的元素。如果队列为空,则抛出异常。peek()
: 返回队列头部的元素,但不移除它。如果队列为空,则返回null。poll()
: 移除并返回队列头部的元素。如果队列为空,则返回null。
Queue接口的实现类包括LinkedList、PriorityQueue、ArrayBlockingQueue等。LinkedList作为实现类之一,它基于双向链表实现,具有插入和删除操作效率较高的特点。PriorityQueue是一个优先级队列,它的元素按照自然顺序或者比较器定义的顺序进行排序。ArrayBlockingQueue是一个基于数组的有界阻塞队列,它实现了BlockingQueue接口,可以在多线程环境中安全使用。
在Java集合框架中,Queue接口通常用于实现生产者消费者模型,生产者用于向队列中添加元素,而消费者用于从队列中取出元素。这种模型可以有效地协调多个线程之间的操作,提高程序的并发性能。
@Test
public void queueTest(){
Queue<Integer> queue=new LinkedList<>();
for(int i=1;i<=5;i++){
queue.offer(i*11);
System.out.println(queue);
}
Integer it=queue.peek();
System.out.println("队首元素:"+it);
int len=queue.size();
for(int i=0;i< len;i++){
Integer it1=queue.poll();
System.out.println(it1);
}
}
四、Set集合
Set是一种不包含重复元素的集合。Set集合也是继承了Collection,所以Collection中的操作广场对Set集合同样适用。
Set集合的主要特点包括:
- 无序性:Set中的元素没有特定的顺序,即无法通过索引访问元素。
- 不允许重复元素:Set中的元素不能重复,即每个元素只能出现一次。
Set接口的主要方法包括:
add(E e)
: 添加一个元素到集合中。remove(Object o)
: 删除集合中的一个元素。contains(Object o)
: 检查集合中是否包含某个元素。size()
: 返回集合中的元素数量。isEmpty()
: 检查集合是否为空。
Set接口的实现类包括HashSet、TreeSet等。HashSet基于哈希表实现,其性能通常优于TreeSet,但在需要排序的功能时,我们才使用TreeSet。TreeSet基于树结构实现,可以对元素进行升序排序。
总的来说,Set集合主要用于存储唯一元素,并提供了常用的集合操作。在Java集合框架中,Set接口和它的实现类被广泛应用于各种数据结构和算法中,以解决各种实际问题。
@Test
public void setTest(){
Set<String> set=new HashSet<>();
boolean b=set.add("two");
System.out.println("b="+b);
System.out.println(set);
b=set.add("one");
System.out.println("b="+b);
System.out.println(set);
b=set.add("three");
System.out.println("b="+b);
System.out.println(set);
b=set.add("four");
System.out.println("b="+b);
System.out.println(set);
b=set.add("five");
System.out.println("b="+b);
System.out.println(set);
b=set.add("one");
System.out.println("b="+b);
System.out.println(set);
}
五、Map集合
Map是一种特殊的集合,它存储的是键值对。Map集合中的每个元素包含一个键对象和一个值对象,其中键对象唯一标识该元素,而值对象可以重复。Map集合可以通过键映射到值,即通过键查找对应的值。
Map接口的主要方法包括:
put(K key, V value)
: 添加或更新一个键值对。get(Object key)
: 通过键获取对应的值。remove(Object key)
: 删除指定键的键值对。containsKey(Object key)
: 检查集合中是否包含指定的键。containsValue(Object value)
: 检查集合中是否包含指定的值。
Map接口的实现类包括HashMap、TreeMap等。HashMap基于哈希表实现,它使用哈希算法来快速定位键值对。TreeMap基于红黑树实现,它按照键的自然顺序或者自定义比较器定义的顺序进行排序。
在Java集合框架中,Map集合主要用于存储键值对数据,并提供快速查找、添加和删除操作。Map集合常用于需要映射关系的数据结构,如数据库查询、缓存系统等。通过使用Map集合,可以方便地实现数据的快速查找和操作,提高程序的性能和效率。
@Test
public void hashMapTest(){
Map<Integer,String> map=new HashMap<>();
map.put(1,"a");
map.put(2,"b");
map.put(3,"c");
map.put(4,"d");
System.out.println(map);
String value=map.get(3);
System.out.println("3="+value);
boolean b=map.containsKey(5);
System.out.println(b);
b=map.containsKey(2);
System.out.println(b);
b=map.containsValue("eefa");
System.out.println(b);
b=map.containsValue("a");
System.out.println(b);
String v=map.remove(3);
System.out.println("删除的值为:"+v);
v=map.remove(5);
System.out.println("删除的值为:"+v);
}
@Test
public void interatorMapTest(){
Map<Integer,String> map=new HashMap<>();
map.put(1,"a");
map.put(2,"b");
map.put(3,"c");
map.put(4,"d");
System.out.println(map);
System.out.println("------------------------");
Set<Integer> set=map.keySet();
for(Integer it:set){
System.out.println(it+"="+map.get(it));
}
System.out.println("=========================");
Set<Map.Entry<Integer,String>> entries=map.entrySet();
for(Map.Entry<Integer,String> e:entries){
System.out.println(e);
}
}
六、泛型
泛型是Java编程语言的一种特性,它允许在类、接口和方法的定义中使用类型参数。这些类型参数在实例化对象或调用方法时被具体的类型替代,从而实现了代码的复用性和类型安全性。
泛型的主要目的是提高代码的灵活性和复用性,使得相同的代码可以处理多种数据类型,而不需要进行大量的重写和修改。通过使用泛型,程序员可以在不改变代码逻辑的前提下,将代码应用于各种不同的数据类型。
在Java集合框架中,泛型被广泛应用。例如,ArrayList、LinkedList等集合类都使用了泛型,通过指定元素类型来创建特定类型的集合。这使得集合类可以存储、操作特定类型的对象,并在编译期间进行类型检查,避免了运行时类型转换和ClassCastException异常。
使用泛型时,需要使用尖括号<>来指定类型参数。例如,ArrayList<String>表示一个存储String类型元素的ArrayList集合。
值得注意的是,泛型在运行期间会失去类型信息,这是因为泛型是在编译期进行类型检查的。因此,泛型参数只能是类类型,不能是原始数据类型(如int、char等)。
总的来说,泛型是Java编程语言中一个强大的工具,它能够提高代码的复用性和安全性,使得代码更加灵活和易于维护。通过使用泛型,可以避免许多常见的类型错误,并提高程序的可靠性。