栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java基础(三)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java基础(三)

文章目录

1 集合框架

1.1 框架1.2 集合实现类(集合类)1.3 总结 2 java ArrayList

2.1其他的引用类型2.2 排序2.3 常用方法 3.java linkedList4 java HashSet5 java HashMap6 java Iterator(迭代器)7 java Object类8 java泛型

8.1 泛型方法8.2 泛型类8.3 类型通配符 随便说说

1 集合框架 1.1 框架

整个集合框架围绕一组标准接口而设计。可以直接使用这些接口的标准实现,诸如: linkedList, HashSet, 和 TreeSet 等,除此之外也可以通过这些接口实现自己的集合。

从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合。
另一种是图(Map),存储键/值对映射。
Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、linkedList、HashSet、linkedHashSet、HashMap、linkedHashMap 等等。

集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象。

实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、linkedList、HashSet、HashMap。

算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。

Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包。

Set和List的区别
1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素

2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>

3. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,linkedList,Vector>

1.2 集合实现类(集合类)

Java提供了一套实现了Collection接口的标准集合类。其中一些是具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的部分实现。

标准集合类汇总于下表:


通过java.util包中定义的类,如下所示:


遍历 ArrayList
实例**

import java.util.*;
 
public class Test{
 public static void main(String[] args) {
     List list=new ArrayList();
     list.add("Hello");
     list.add("World");
     list.add("HAHAHAHA");
     //第一种遍历方法使用 For-Each 遍历 List
     for (String str : list) {            //也可以改写 for(int i=0;i ite=list.iterator();
     while(ite.hasNext())//判断下一个元素之后有值
     {
         System.out.println(ite.next());
     }
 }
}

解析:

三种方法都是用来遍历ArrayList集合,第三种方法是采用迭代器的方法,该方法可以不用担心在遍历的过程中会超出集合的长度。推荐第一种。

遍历Map
实例

import java.util.*;
 
public class Test{
     public static void main(String[] args) {
      Map map = new HashMap();
      map.put("1", "value1");
      map.put("2", "value2");
      map.put("3", "value3");
      
      //第一种:普遍使用,二次取值
      System.out.println("通过Map.keySet遍历key和value:");
      for (String key : map.keySet()) {
       System.out.println("key= "+ key + " and value= " + map.get(key));
      }
      
      //第二种
      System.out.println("通过Map.entrySet使用iterator遍历key和value:");
      Iterator> it = map.entrySet().iterator();
      while (it.hasNext()) {
       Map.Entry entry = it.next();
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }
      
      //第三种:推荐,尤其是容量大时
      System.out.println("通过Map.entrySet遍历key和value");
      for (Map.Entry entry : map.entrySet()) {
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
      }
    
      //第四种
      System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
      for (String v : map.values()) {
       System.out.println("value= " + v);
      }
     }
}

1.3 总结

Java集合框架为程序员提供了预先包装的数据结构和算法来操纵他们。

集合是一个对象,可容纳其他对象的引用。集合接口声明对每一种类型的集合可以执行的操作。

集合框架的类和接口均在java.util包中。

任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。

2 java ArrayList

ArrayList类是一个可以动态修改的数组,与普通数组的区别是它没有固定大小的限制,可以添加或删除元素

ArrayList继承了AbstractList,并实现了List接口。

ArrayList类位于java.util包中,使用前需要引入它,语法格式如下:

import java.util.ArrayList;//引入ArrayList类

ArrayList objectName=new ArrayList<>();//初始化

E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
objectName: 对象名。
ArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能
1.添加元素
ArrayList 类提供了很多有用的方法,添加元素到 ArrayList 可以使用 add() 方法:
实例

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList sites = new ArrayList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites);
    }
}

以上实例,执行输出结果为:

[Google, Runoob, Taobao, Weibo]
2.访问元素
访问ArrayList中的元素可以使用get()方法。
实例:

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList sites = new ArrayList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites.get(1));  // 访问第二个元素
    }
}

注意:数组的索引值从 0 开始。

以上实例,执行输出结果为:

Runoob
3.修改元素
如果要修改 ArrayList 中的元素可以使用 set() 方法:
实例

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList sites = new ArrayList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值
        System.out.println(sites);
    }
}

以上实例,执行输出结果为:

[Google, Runoob, Wiki, Weibo]
4.删除元素
如果要删除 ArrayList 中的元素可以使用 remove() 方法:

实例

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList sites = new ArrayList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        sites.remove(3); // 删除第四个元素
        System.out.println(sites);
    }
}

以上实例,执行输出结果为:

[Google, Runoob, Taobao]
5.计算大小
如果要计算 ArrayList 中的元素数量可以使用 size() 方法:

实例

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList sites = new ArrayList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites.size());
    }
}

以上实例,执行输出结果为:

4
6.遍历数组列表
使用for来遍历元素

for (int i = 0; i < sites.size(); i++) {
            System.out.println(sites.get(i));
        }

使用for-each遍历元素

for (String i : sites) {
            System.out.println(i);
        }
2.1其他的引用类型

ArrayList 中的元素实际上是对象,在以上实例中,数组列表元素都是字符串 String 类型。

如果我们要存储其他类型,而E只能为引用数据类型,这时就需要使用到基本类型的包装类

基本类型对应的包装类表如下:


此外,BigInteger、BigDecimal 用于高精度的运算,BigInteger 支持任意精度的整数,也是引用类型,但它们没有相对应的基本类型。

ArrayList li=new Arraylist<>();     // 存放整数元素
ArrayList li=new Arraylist<>();   // 存放字符元素

以下实例使用 ArrayList 存储数字(使用 Integer 类型):
实例

import java.util.ArrayList;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList myNumbers = new ArrayList();
        myNumbers.add(10);
        myNumbers.add(15);
        myNumbers.add(20);
        myNumbers.add(25);
        for (int i : myNumbers) {
            System.out.println(i);
        }
    }
}

以上实例,执行输出结果为:

10
15
20
25

2.2 排序

Collections 类也是一个非常有用的类,位于 java.util 包中,提供的 sort() 方法可以对字符或数字列表进行排序

以下实例对字母进行排序:

Collections.sort(sites);  // 字母排序
import java.util.ArrayList;
import java.util.Collections;  // 引入 Collections 类

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList sites = new ArrayList();
        sites.add("Taobao");
        sites.add("Wiki");
        sites.add("Runoob");
        sites.add("Weibo");
        sites.add("Google");
        Collections.sort(sites);  // 字母排序
        for (String i : sites) {
            System.out.println(i);
        }
    }
}

以上实例,执行输出结果为:

Google
Runoob
Taobao
Weibo
Wiki

2.3 常用方法


3.java linkedList

链表(linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。

链表可分为单向链表和双向链表。

一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。

一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。

Java linkedList(链表) 类似于 ArrayList,是一种常用的数据容器。

与 ArrayList 相比,linkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。


linkedList类位于java.util包中,使用前需要引入它,语法格式如下:

//引入linkedList类
import java.util.linkedList;

linkList list=new linkedList();//普通创建方法
或者
linkedList list=new linkedList(Collection c);//使用集合创建链表

创建一个简单的链表实例:

// 引入 linkedList 类
import java.util.linkedList;

public class RunoobTest {
    public static void main(String[] args) {
        linkedList sites = new linkedList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites);
    }
}

以上实例,执行输出结果为:

[Google, Runoob, Taobao, Weibo]

在列表开头添加元素:

  sites.addFirst("Wiki");

实例

// 引入 linkedList 类
import java.util.linkedList;

public class RunoobTest {
    public static void main(String[] args) {
        linkedList sites = new linkedList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        // 使用 addFirst() 在头部添加元素
        sites.addFirst("Wiki");
        System.out.println(sites);
    }
}

以上实例,执行输出结果为:

[Wiki, Google, Runoob, Taobao]
在列表结尾添加元素:

  sites.addFirst("Wiki");

实例

// 引入 linkedList 类
import java.util.linkedList;

public class RunoobTest {
    public static void main(String[] args) {
        linkedList sites = new linkedList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        // 使用 addLast() 在尾部添加元素
        sites.addLast("Wiki");
        System.out.println(sites);
    }
}

以上实例,执行输出结果为:

[Google, Runoob, Taobao, Wiki]
在列表开头移除元素:

sites.removeFirst();

实例

// 引入 linkedList 类
import java.util.linkedList;

public class RunoobTest {
    public static void main(String[] args) {
        linkedList sites = new linkedList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        // 使用 removeFirst() 移除头部元素
        sites.removeFirst();
        System.out.println(sites);
    }
}

以上实例,执行输出结果为:

[Runoob, Taobao, Weibo]

在列表结尾移除元素:

sites.removeLast();

实例

// 引入 linkedList 类
import java.util.linkedList;

public class RunoobTest {
    public static void main(String[] args) {
        linkedList sites = new linkedList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        // 使用 removeLast() 移除尾部元素
        sites.removeLast();
        System.out.println(sites);
    }
}

以上实例,执行输出结果为:

[Google, Runoob, Taobao]

获取列表开头的元素:

sites.getFirst()

实例

// 引入 linkedList 类
import java.util.linkedList;

public class RunoobTest {
    public static void main(String[] args) {
        linkedList sites = new linkedList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        // 使用 getFirst() 获取头部元素
        System.out.println(sites.getFirst());
    }
}

以上实例,执行输出结果为:

Google

获取列表结尾的元素:

sites.getLast()

实例

// 引入 linkedList 类
import java.util.linkedList;

public class RunoobTest {
    public static void main(String[] args) {
        linkedList sites = new linkedList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        // 使用 getLast() 获取尾部元素
        System.out.println(sites.getLast());
    }
}

以上实例,执行输出结果为:

Weibo
遍历元素

使用for循环遍历

for (int size = sites.size(), i = 0; i < size; i++) {
            System.out.println(sites.get(i));
        }

使用for-each遍历

for (String i : sites) {
            System.out.println(i);
        }

常用方法

4 java HashSet

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。

HashSet 允许有 null 值。

HashSet 是无序的,即不会记录插入的顺序。

HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 必须在多线程访问时显式同步对 HashSet 的并发访问。
HashSet 实现了 Set 接口。

HashSet 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。

基本类型对应的包装类表如下:


HashSet类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.HashSet; // 引入 HashSet 类

以下实例我们创建一个 HashSet 对象 sites,用于保存字符串元素:

HashSet sites = new HashSet();

1.添加元素
HashSet 类提供类很多有用的方法,添加元素可以使用 add() 方法:

实例

// 引入 HashSet 类      
import java.util.HashSet;

public class RunoobTest {
    public static void main(String[] args) {
    HashSet sites = new HashSet();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Zhihu");
        sites.add("Runoob");  // 重复的元素不会被添加
        System.out.println(sites);
    }
}

执行以上代码,输出结果如下:

[Google, Runoob, Zhihu, Taobao]
在上面的实例中,Runoob 被添加了两次,它在集合中也只会出现一次,因为集合中的每个元素都必须是唯一的。
2.判断元素是否存在
可以使用 contains() 方法来判断元素是否存在于集合当中:

sites.contains("Taobao")

存在的话返回true
3.删除元素
使用remove删除集合中的元素

sites.remove("Taobao");  // 删除元素,删除成功返回 true,否则为 false

执行以上代码,输出结果如下:

[Google, Runoob, Zhihu]
删除集合中所有元素可以使用 clear 方法:

sites.clear();  

4.计算大小
使用size()方法

sites.size();

4.迭代

for (String i : sites) {
            System.out.println(i);
        }
5 java HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。

HashMap 是无序的,即不会记录插入的顺序。

HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。

HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。


HashMap 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。

基本类型对应的包装类表如下:

HashMap 类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.HashMap; // 引入 HashMap 类

以下实例我们创建一个 HashMap 对象 Sites, 整型(Integer)的 key 和字符串(String)类型的 value:

HashMap Sites = new HashMap();

1.添加元素
添加键值对(key-value)可以使用put()方法

// 引入 HashMap 类      
import java.util.HashMap;

public class RunoobTest {
    public static void main(String[] args) {
        // 创建 HashMap 对象 Sites
        HashMap Sites = new HashMap();
        // 添加键值对
        Sites.put(1, "Google");
        Sites.put(2, "Runoob");
        Sites.put(3, "Taobao");
        Sites.put(4, "Zhihu");
        System.out.println(Sites);
    }
}

执行以上代码,输出结果如下:

{1=Google, 2=Runoob, 3=Taobao, 4=Zhihu}
2.访问元素
使用get(key)来获取key对应的value:

Sites.get(3)

3.删除元素
使用remove(key)方法来删除key对应的键值对(key-value):

 Sites.remove(4);

删除所有键值对(key-value)可以使用 clear 方法:

Sites.clear();

4.计算大小
使用size方法:

Sites.size()

5.迭代
可以使用 for-each 来迭代 HashMap 中的元素。

只想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,只想获取 value,可以使用 values() 方法。

// 输出 key 和 value
        for (Integer i : Sites.keySet()) {
            System.out.println("key: " + i + " value: " + Sites.get(i));
        }
        // 返回所有 value 值
        for(String value: Sites.values()) {
          // 输出每一个value
          System.out.print(value + ", ");
        }

Java HashMap 常用方法列表如下:

6 java Iterator(迭代器)

Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。

Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。

迭代器it的两个基本操作是next、hasNext和remove.
调用it.next()会返回迭代器的下一个元素,并且更新迭代器的状态。
调用it.hasNext()用于检测集合中是否还有元素。
调用it.remove()将迭代器返回的元素删除。
Iterator类位于java.util包中,使用前需要引入它,语法格式去下:

import java.util.Iterator;//引入Iterator类

获取一个迭代器
集合想获取一个迭代器可以使用iterator()方法:
实例

// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;

public class RunoobTest {
    public static void main(String[] args) {

        // 创建集合
        ArrayList sites = new ArrayList();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Zhihu");

        // 获取迭代器
        Iterator it = sites.iterator();

        // 输出集合中的第一个元素
        System.out.println(it.next());
    }
}

执行以上代码,输出结果如下:

Google
循环集合元素
让迭代器 it 逐个返回集合中所有元素最简单的方法是使用 while 循环:

while(it.hasNext()) {
    System.out.println(it.next());
}

删除元素
要删除集合中的元素可以使用 remove() 方法。

以下实例我们删除集合中小于 10 的元素:

实例

// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList numbers = new ArrayList();
        numbers.add(12);
        numbers.add(8);
        numbers.add(2);
        numbers.add(23);
        Iterator it = numbers.iterator();
        while(it.hasNext()) {
            Integer i = it.next();
            if(i < 10) {  
                it.remove();  // 删除小于 10 的元素
            }
        }
        System.out.println(numbers);
    }
}

执行以上代码,输出结果如下:

[12, 23]

7 java Object类

Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。

Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。

Object 类可以显示继承,也可以隐式继承,以下两种方式时一样的:

显示继承:

public class Runoob extends Object{

}

隐式继承

public class Runoob{
}

类的构造函数

Object()//构造一个新对象

类的方法

8 java泛型

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现?
答案是可以使用 Java 泛型。

使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。

8.1 泛型方法


Java中泛型标记符:

EElement
TType(java类)
Kkey(键)
Vvalue(值)
NNumber(数值类型)
?表示不确定的Java类型)

实例
下面的例子演示了如何使用泛型方法打印不同类型的数组元素:

public class GenericMethodTest
{
   // 泛型方法 printArray                         
   public static < E > void printArray( E[] inputArray )
   {
      // 输出数组元素            
         for ( E element : inputArray ){        
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }
 
    public static void main( String args[] )
    {
        // 创建不同类型数组: Integer, Double 和 Character
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
 
        System.out.println( "整型数组元素为:" );
        printArray( intArray  ); // 传递一个整型数组
 
        System.out.println( "n双精度型数组元素为:" );
        printArray( doubleArray ); // 传递一个双精度型数组
 
        System.out.println( "n字符型数组元素为:" );
        printArray( charArray ); // 传递一个字符型数组
    } 
}

编译以上代码,运行结果如下所示:

整型数组元素为:
1 2 3 4 5

双精度型数组元素为:
1.1 2.2 3.3 4.4

字符型数组元素为:
H E L L O

有界的类型参数:

可能有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受Number或者Number子类的实例。这就是有界类型参数的目的。

要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。

实例
下面的例子演示了"extends"如何使用在一般意义上的意思"extends"(类)或者"implements"(接口)。该例子中的泛型方法返回三个可比较对象的最大值。
实例

public class MaximumTest
{
   // 比较三个值并返回最大值
   public static > T maximum(T x, T y, T z)
   {                     
      T max = x; // 假设x是初始最大值
      if ( y.compareTo( max ) > 0 ){
         max = y; //y 更大
      }
      if ( z.compareTo( max ) > 0 ){
         max = z; // 现在 z 更大           
      }
      return max; // 返回最大对象
   }
   public static void main( String args[] )
   {
      System.out.printf( "%d, %d 和 %d 中最大的数为 %dnn",
                   3, 4, 5, maximum( 3, 4, 5 ) );
 
      System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1fnn",
                   6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
 
      System.out.printf( "%s, %s 和 %s 中最大的数为 %sn","pear",
         "apple", "orange", maximum( "pear", "apple", "orange" ) );
   }
}

编译以上代码,运行结果如下所示:

3, 4 和 5 中最大的数为 5

6.6, 8.8 和 7.7 中最大的数为 8.8

pear, apple 和 orange 中最大的数为 pear

8.2 泛型类

泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。

和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。

实例
如下实例演示了如何定义一个泛型类

public class Box {
   
  private T t;
 
  public void add(T t) {
    this.t = t;
  }
 
  public T get() {
    return t;
  }
 
  public static void main(String[] args) {
    Box integerBox = new Box();
    Box stringBox = new Box();
 
    integerBox.add(new Integer(10));
    stringBox.add(new String("菜鸟教程"));
 
    System.out.printf("整型值为 :%dnn", integerBox.get());
    System.out.printf("字符串为 :%sn", stringBox.get());
  }
}

编译以上代码,运行结果如下所示:

整型值为 :10

字符串为 :菜鸟教程

8.3 类型通配符

1、类型通配符一般是使用 ? 代替具体的类型参数。例如 List 在逻辑上是 List,List 等所有 List<具体类型实参> 的父类。

实例

import java.util.*;
 
public class GenericTest {
     
    public static void main(String[] args) {
        List name = new ArrayList();
        List age = new ArrayList();
        List number = new ArrayList();
        
        name.add("icon");
        age.add(18);
        number.add(314);
 
        getData(name);
        getData(age);
        getData(number);
       
   }
 
   public static void getData(List data) {
      System.out.println("data:" + data.get(0));
   }
}

输出结果为:

data:icon
data:18
data:314
解析: 因为 getData() 方法的参数是 List 类型的,所以 name,age,number 都可以作为这个方法的实参,这就是通配符的作用。

2、类型通配符上限通过形如List来定义,如此定义就是通配符泛型值接受Number及其下层子类类型。

实例

import java.util.*;
 
public class GenericTest {
     
    public static void main(String[] args) {
        List name = new ArrayList();
        List age = new ArrayList();
        List number = new ArrayList();
        
        name.add("icon");
        age.add(18);
        number.add(314);
 
        //getUperNumber(name);//1
        getUperNumber(age);//2
        getUperNumber(number);//3
       
   }
 
   public static void getData(List data) {
      System.out.println("data:" + data.get(0));
   }
   
   public static void getUperNumber(List data) {
          System.out.println("data:" + data.get(0));
       }
}

输出结果:

data:18
data:314
解析: 在 //1 处会出现错误,因为 getUperNumber() 方法中的参数已经限定了参数泛型上限为 Number,所以泛型为 String 是不在这个范围之内,所以会报错。
3、类型通配符下限通过形如 List 来定义,表示类型只能接受 Number 及其上层父类类型,如 Object 类型的实例。

随便说说

来个大神带带我–太累了
最近要开始节俭过日子了—小时候是往存钱罐里天天存钱,现在是往自己的小金库天天掏钱–太难了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785727.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号