21、JAVA进阶——集合(2)

简介: 21、JAVA进阶——集合(2)

一、Collections类


 1、解释

       (1)Collections类是Java提供的一个集合操作工具类。它包含了大量的静态方法,用于实现对集合元素的排序、查找和替换等操作。


       (2)Collections和Collection是不同的,前者是集合的操作类,后者是集合接口。


 2、对集合元素排序与查找

       (1)排序是针对集合的一个常见需求。要排序就要知道两个元素哪个大哪个小。在Java中,如果要实现一个类的对象之间比较大小,那么这个类就要实现Comparable接口。


       (2)Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo()方法被称为它的自然比较方法。


       (3)compareTo()方法用于比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。


       (4)compareTo()方法的定义语法格式如下


               int compareTo(Object obj);


               -->参数obj:obj是要比较的对象


               -->返回值:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象返回不同的值


       (5)实现Collections接口的对象列表(和数组)可以通过Collections.sort()方法(和Arrays.sort()方法)进行自动排序。


       (6)元素之间可以比较大小之后,就可以使用Collections类的sort()方法对元素进行排序操作了。Map接口本身是无序的,不能对Map接口做排序操作;List接口是有序的,可以对List接口进行排序。


       (7)使用binarySearch()方法可以查找集合中的元素,但是在使用binarySearch()方法之前需要使用sort()方法对集合进行排序,否则不能保证查找结果的正确性。


package cn.bdqn.demo04;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
public class CollectionsDemo01 {
  public static void main(String[] args) {
  ArrayList al=new ArrayList();
  al.add("sdf");
  al.add("gfd");
  al.add("htr");
  al.add("jhj");
  al.add("kyt");
  al.add("ewf");
  System.out.println("*****排序前*****");
  for (String string : al) {
    System.out.println(string);
  }
  System.out.println("*****排序后*****");
  Collections.sort(al);  
  Iterator it=al.iterator();
  while(it.hasNext()){
    System.out.println(it.next());
  }
  System.out.println("gfd在第"+(Collections.binarySearch(al, "gfd")+1)+"位");
  }
}


 3、替换集合元素

       可以使用Collections类的静态方法fill()方法把集合中的所有元素都替换为相同的元素。


二、认识泛型


       (1)泛型是JDK1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,使代码可以应用于多种类型。


       (2)Java语言引入泛型的好处是安全简单,且所有强制转换都是自动和隐式进行的,提高了代码的重用率。

 1、 泛型的定义

       (1)将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。这就是泛型。泛型的本质就是参数化类型。


       (2)泛型的定义语法格式如下:


               类1或者接口<类型实参> 对象 = new 类2<类型实参>();


               注意:


                       -->“类2”可以是“类1”本身,可以是“类1”的子类,还可以是接口的实现类。


                       -->“类2”的类型实参必须和“类1”中的类型实参相同。


       (3)例如:ArrayList list = new ArrayList();


           上述代码表示创建一个ArrayList集合,当规定该集合中存储的元素类型必须为String类型。

 2、 泛型在集合中的应用

       (1)JDK1.5中已经改写了集合框架中的所有接口和类,增加了对泛型的支持,也就是泛型集合。


       (2)使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行强制类型转换,并且如果把非指定类型对象放入到集合中,会出现编译错误。


       (3)List和ArrayList的泛型形式是List和ArrayList,ArrayList与ArrayList类的常用方法基本一样。


       (4)Map与HashMap也有它们的泛型形式,即Map和HashMap,因为它们的每一个元素都包含两个部分,及key和value,所以,在应用泛型时,要同时指定key的类型和value的类型,K表示key的类型,V表示value的类型。HashMap操作数据的方法与HashMap基本一样。


       (5)泛型使集合的使用更方便,也提升了安全:


               -->存储数据时进行严格类型检查,确保只有合适类型的对象才能存储在集合中。


               -->从集合中检索对象时,减少了强制类型转换。


package cn.bdqn.demo03;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapDemo02 {
  public static void main(String[] args) {
  //创建3个Student类对象
  Student stu1 = new Student("张三", 18);
  Student stu2 = new Student("李四", 19);
  Student stu3 = new Student("如花", 20);
  //创建集合容器
  HashMap map = new HashMap();
  //将学生对象和其英文名称存储到集合中
  map.put("JackMa", stu1);
  map.put("TomLei", stu2);
  map.put("MissDong", stu3);
  //遍历map集合
  //获取键的集合,然后通过键来找值
  Set keys=map.keySet();
  for(String key:keys){
    Student student1 =map.get(key);
    System.out.println(key+"对应的学生:"+student1);
  }
  System.out.println("---------------------");
  Iterator it = keys.iterator();
  while(it.hasNext()){
    String key2=it.next();
    Student student2 =map.get(key2);
    System.out.println(key2+"对应的学生:"+student2);
  }
  System.out.println("---------------------");
  //map集合的第3种遍历方式
  Set> keyValues=map.entrySet();
  for(Map.Entry me:keyValues){
    //获取键
    String key= me.getKey();
    //获取值
    Student student =me.getValue();
    System.out.println(key+"对应的学生:"+student);
  }
  }
}

三、深入泛型



       (1)在集合中使用泛型只是泛型多种应用的一种,在接口、类、方法等方面也有着泛型的广泛应用。


       (2)泛型的本质就是参数化类型,参数化类型的重要性在于允许创建一些类、接口和方法,其操作的数据类型被定义为参数,可以在真正使用时指定具体的类型。


       参数化类型:参数化类型包含一个类或者接口,以及实际的类型参数列表。


       类型变量:是一种非限定性标识符,用来指定接口或者方法的类型。


 1、 定义泛型类、泛型接口和泛型方法

       (1)对于一些常常处理不同类型数据转换的接口或者类,可以使用泛型定义,如Java中的List接口。


       (2)定义泛型接口或类的过程,与定义一个接口或者类相似。


             1)泛型类


               概念:泛型类简单地说就是具有一个或者多个类型参数的类。


               语法:

                                   访问修饰符 class className


                   TypeList表示类型参数列表,每个类型变量之间以逗号分隔。


               举例:

                                   public class GenericClass{······}


               创建泛型类实例:

                                   new className(argList);


                   TypeList表示定义的类型参数列表,每个类型变量之间以逗号分隔。


                   argList表示实际传递的类型参数列表,每个类型变量之间同样以逗号分隔。


               举例:

                                   new GenericClass("this is String Object");


             2)泛型接口


               概念:泛型接口就是拥有一个或者多个类型参数的接口。泛型接口的定义方式与定义泛

型类类似。


               语法:

                                   访问修饰符 interface interfaceName


                   TypeList表示由逗号分隔的一个或多个类型参数列表。


               举例:

                                   public interface TestInterface{


                                          public T print(T t);


                                   }


               泛型类实现泛型接口:

                                   访问修饰符 class className implements                 interfaceName


             3)泛型方法


               概述:


               一些方法常常需要对某一类型数据进行处理,若处理的数据乐行不确定,则可以通过泛型方法的方式来定义,达到简化代码、提高代码重用性的目的。


               泛型方法实际上就是带有类型参数的方法。


               定义泛型方法与方法所在的类、或者接口是否是泛型类或者泛型接口没有直接的关系,也就是说无论是泛型类还是非泛型类,如果需要就可以定义泛型方法。


               语法:

                               访问修饰符 <类型参数> 返回值 方法名(类型参数列表)


               注意:

                               类型变量放置在访问修饰符与返回值之间。


               举例:

                               public  void showName(String s){}


 2、 多个参数的泛型类

       (1)泛型类的类型参数可以有一个或者多个。


       (2)比如HashMap就有两个类型参数,一个指定key的类型,一个指定value的类型。


 3、 从泛型类派生子类

       (1)面向对象的特征同样适用于泛型类,所以泛型类也可以继承。


       (2)继承了反省类的子类,必须也是泛型类。


       (3)继承泛型类的语法格式:class 子类 extends 父类{}


四、集合框架和泛型章节总结


       1、 集合弥补了数组的缺陷,它比数组更灵活实用,而且不同的集合适用于不同场合。


       2、 Java集合框架共有3大类接口,即Map接口、List接口和Set接口。


       3、 ArrayList和数组采用相同的存储方式,它的特点是长度可变且可以存储任何类型的数据,它的优点在于遍历元素和随机访问元素的效率较高。


       4、 LinkedList类采用链表存储方式,优点在于插入、删除元素时效率较高。


       5、 Iterator为集合而生,专门实现集合的遍历,它隐藏了各种集合实现类的内部细节,提供了遍历集合的统一编程接口。


       6、 HashMap类是最常用的Map实现类,它的特点是存储键值对数据,优点是查询指定元素效率高。


       7、 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,使代码可以应用于多种数据类型。


       8、 使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行强制类型转换。


       9、 在集合中使用泛型只是泛型多种应用的一种,在接口、类、方法等方面也有着泛型的广泛应用。


       10、 如果数据类型不确定,可以通过泛型方法的方式,达到简化代码、提高代码重用性的目的。


相关文章
|
2月前
|
安全 Java 容器
【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理
CopyOnWriteArrayList是一种线程安全的ArrayList,通过在写操作时复制新数组来保证线程安全,适用于读多写少的场景,但可能因内存占用和无法保证实时性而有性能问题。
|
2月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
2月前
|
Java
【Java集合类面试二十八】、说一说TreeSet和HashSet的区别
HashSet基于哈希表实现,无序且可以有一个null元素;TreeSet基于红黑树实现,支持排序,不允许null元素。
|
2月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
2月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
2月前
|
存储 Java 索引
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
ArrayList基于动态数组实现,支持快速随机访问;LinkedList基于双向链表实现,插入和删除操作更高效,但占用更多内存。
|
27天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
6天前
|
存储 算法 安全
深入理解Java中的集合框架
【9月更文挑战第34天】本文将带你走进Java的集合框架,探索其背后的设计哲学和实现细节。我们将从集合的基本概念出发,逐步深入到具体的接口和类的实现,最后通过一个实际的例子来展示如何在Java程序中高效地使用集合。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深度理解。
12 1
|
16天前
|
存储 安全 Java
Java 常用集合分类
Java 常用集合分类
14 2
|
2天前
|
存储 分布式计算 Java
Stream很好,Map很酷,但答应我别用toMap():Java开发中的高效集合操作
在Java的世界里,Stream API和Map集合无疑是两大强大的工具,它们极大地简化了数据处理和集合操作的复杂度。然而,在享受这些便利的同时,我们也应当警惕一些潜在的陷阱,尤其是当Stream与Map结合使用时。本文将深入探讨Stream与Map的优雅用法,并特别指出在使用toMap()方法时需要注意的问题,旨在帮助大家在工作中更高效、更安全地使用这些技术。
8 0