java基础学习(六)

时间:2021-04-03 19:42:47   收藏:0   阅读:14

java基础学习(六)

十八、异常处理
十九、java集合、泛型、枚举

十八、异常处理

十九、java集合、泛型、枚举

1. 总论:

2.Collection接口

3.List集合

1.ArrayList 类

2.LinkedList 类

3.ArrayList 类和 LinkedList 类的区别

4.Set集合

1.HashSet 类

HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时就是使用这个实现类。HashSet 是按照 Hash 算法来存储集合中的元素。因此具有很好的存取和查找性能。

HashSet 具有以下特点:

当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据该 hashCode 值决定该对象在 HashSet 中的存储位置。如果有两个元素通过 equals() 方法比较返回的结果为 true,但它们的 hashCode 不相等,HashSet 将会把它们存储在不同的位置,依然可以添加成功。

也就是说,两个对象的 hashCode 值相等且通过 equals() 方法比较返回结果为 true,则 HashSet 集合认为两个元素相等。

在 HashSet 类中实现了 Collection 接口中的所有方法。HashSet 类的常用构造方法重载形式如下。

2.TreeSet 类

5.Map集合

6.遍历map集合的四种方式

  1. 在 for 循环中使用 entries 实现 Map 的遍历(最常见和最常用的)。

    • public static void main(String[] args) {
          Map<String, String> map = new HashMap<String, String>();
          map.put("Java入门教程", "http://c.biancheng.net/java/");
          map.put("C语言入门教程", "http://c.biancheng.net/c/");
          for (Map.Entry<String, String> entry : map.entrySet()) {
              String mapKey = entry.getKey();
              String mapValue = entry.getValue();
              System.out.println(mapKey + ":" + mapValue);
          }
      }
      
  2. 使用 for-each 循环遍历 key 或者 values,一般适用于只需要 Map 中的 key 或者 value 时使用。性能上比 entrySet 较好。

    • Map<String, String> map = new HashMap<String, String>();
      map.put("Java入门教程", "http://c.biancheng.net/java/");
      map.put("C语言入门教程", "http://c.biancheng.net/c/");
      // 打印键集合
      for (String key : map.keySet()) {
          System.out.println(key);
      }
      // 打印值集合
      for (String value : map.values()) {
          System.out.println(value);
      }
      
  3. 使用迭代器(Iterator)遍历。

    • Map<String, String> map = new HashMap<String, String>();
      map.put("Java入门教程", "http://c.biancheng.net/java/");
      map.put("C语言入门教程", "http://c.biancheng.net/c/");
      Iterator<Entry<String, String>> entries = map.entrySet().iterator();
      while (entries.hasNext()) {
          Entry<String, String> entry = entries.next();
          String key = entry.getKey();
          String value = entry.getValue();
          System.out.println(key + ":" + value);
      }
      
  4. 通过键找值遍历,这种方式的效率比较低,因为本身从键取值是耗时的操作。

    • for(String key : map.keySet()){
          String value = map.get(key);
          System.out.println(key+":"+value);
      }
      

7.Iterator(迭代器)

8.泛型

  1. 泛型集合

    • 泛型本质上是提供类型的“类型参数”,也就是参数化类型。我们可以为类、接口或方法指定一个类型参数,通过这个参数限制操作的数据类型,从而保证类型转换的绝对安全。
  2. 泛型类

    • 除了可以定义泛型集合之外,还可以直接限定泛型类的类型参数。语法格式如下:

      public class class_name<data_type1,data_type2,…>{}
      

      其中,class_name 表示类的名称,data_ type1 等表示类型参数。Java 泛型支持声明一个以上的类型参数,只需要将类型用逗号隔开即可。

      泛型类一般用于类中的属性类型不确定的情况下。在声明属性时,使用下面的语句:

      private data_type1 property_name1;
      private data_type2 property_name2;
      

      该语句中的 data_type1 与类声明中的 data_type1 表示的是同一种数据类型。

  3. 泛型方法

    • [访问权限修饰符][static][final]<类型参数列表>返回值类型方法名([形式参数列表])
      

      例如:

      public static List<T> find(Class<T>class,int userId){}
      

      一般来说编写 Java 泛型方法,其返回值类型至少有一个参数类型应该是泛型,而且类型应该是一致的,如果只有返回值类型或参数类型之一使用了泛型,那么这个泛型方法的使用就被限制了。

  4. 泛型高级用法

    1. 限制泛型可用类型

      • 在 Java 中默认可以使用任何类型来实例化一个泛型类对象。当然也可以对泛型类实例的类型进行限制,语法格式如下:

        class 类名称<T extends anyClass>
        

        其中,anyClass 指某个接口或类。使用泛型限制后,泛型类的类型必须实现或继承 anyClass 这个接口或类。无论 anyClass 是接口还是类,在进行泛型限制时都必须使用 extends 关键字。

    2. 使用类型通配符

      • Java 中的泛型还支持使用类型通配符,它的作用是在创建一个泛型类对象时限制这个泛型类的类型必须实现或继承某个接口或类。

        使用泛型类型通配符的语法格式如下:

        泛型类名称<? extends List>a = null;
        

        其中,“<? extends List>”作为一个整体表示类型未知,当需要使用泛型对象时,可以单独实例化。

    3. 继承泛型类和实现泛型接口

      • 定义为泛型的类和接口也可以被继承和实现。例如下面的示例代码演示了如何继承泛型类。

        public class FatherClass<T1>{}
        public class SonClass<T1,T2,T3> extents FatherClass<T1>{}
        

        如果要在 SonClass 类继承 FatherClass 类时保留父类的泛型类型,需要在继承时指定,否则直接使用 extends FatherClass 语句进行继承操作,此时 T1、T2 和 T3 都会自动变为 Object,所以一般情况下都将父类的泛型类型保留。

9.枚举

  1. 声明枚举

    • 声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等。枚举声明的语法如下:

      enum-modifiers enum enumname:enum-base {
          enum-body,
      }
      

      其中,enum-modifiers 表示枚举的修饰符主要包括 public、private 和 internal;enumname 表示声明的枚举名称;enum-base 表示基础类型;enum-body 表示枚举的成员,它是枚举类型的命名常数。

      任意两个枚举成员不能具有相同的名称,且它的常数值必须在该枚举的基础类型的范围之内,多个枚举成员之间使用逗号分隔。

      提示:如果没有显式地声明基础类型的枚举,那么意味着它所对应的基础类型是 int。

  2. 枚举类

    • ava 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。

      所有枚举实例都可以调用 Enum 类的方法,常用方法如表 1 所示。

      方法名称 描述
      values() 以数组形式返回枚举类型的所有成员
      valueOf() 将普通字符串转换为枚举实例
      compareTo() 比较两个枚举成员在定义时的顺序
      ordinal() 获取枚举成员的索引位置
  3. EnumMap类

    • EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但是使用 EnumMap 会更加高效。

      HashMap 只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值,使得 EnumMap 的效率非常高。

  4. EnumSet类

    • EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。EnumSet 提供了许多工厂方法以便于初始化,如表 2 所示。

      方法名称 描述
      allOf(Class element type) 创建一个包含指定枚举类型中所有枚举成员的 EnumSet 对象
      complementOf(EnumSet s) 创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象, 并包含所有 s 中未包含的枚举成员
      copyOf(EnumSet s) 创建一个与指定 EnumSet 对象 s 相同的枚举类型 EnumSet 对象, 并与 s 包含相同的枚举成员
      noneOf(<Class elementType) 创建指定枚举类型的空 EnumSet 对象
      of(E first,e...rest) 创建包含指定枚举成员的 EnumSet 对象
      range(E from ,E to) 创建一个 EnumSet 对象,该对象包含了 from 到 to 之间的所有枚 举成员

接下来看java基础学习(七)

原文:https://www.cnblogs.com/namusangga/p/14613672.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!