详细分析Java 泛型的使用

一、泛型的简介

1、为什么要使用泛型?

  一般使用在集合上,比如现在把一个字符串类型的值放入到集合里面,这个时候,这个值放到集合之后,失去本身的类型,只能是object类型。这时,如果想要对这个值进行类型转换,很容易出现类型转换错误,怎么解决这个问题,可以使用泛型来解决。

2、在泛型里面写是一个对象,String 不能写基本的数据类型 比如int,要写基本的数据类型对应的包装类

基本数据类型 对应包装类 基本数据类型 对应包装类
byte Byte short   Short
int Integer long Long
float Float double Double
char Character boolean Boolean

二、在集合上如何使用泛型

-常用集合 list set map
 -泛型语法:集合<String> 比如list<String>

//泛型在list上的使用
  @Test
  public void testList() {
    List<String> list = new ArrayList<String>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    //for循环
    for (int i = 1;i<list.size();i++) {
      String s = list.get(i);
      System.out.println(s);
    }
    System.out.println("=================");
    //增强for循环
    for (String string : list) {
      System.out.println(string);
    }
    //迭代器
    Iterator<String> it = list.iterator();
    while (it.hasNext()){
      System.out.println(it.next());
    }
  }
 //泛型在set上的使用
  @Test
  public void testSet() {
    Set<String> set = new HashSet<String>();
    set.add("www");
    set.add("qqq");
    set.add("zzz");
    //使用增强for循环
    for (String s2 : set) {
      System.out.println(s2);
    }
    System.out.println("=============");
    //使用迭代器
    Iterator<String> iterator = set.iterator();
    while (iterator.hasNext()) {
      System.out.println(iterator.next());
    }
  }
 //在map上使用泛型
  @Test
  public void testMap() {
    Map<String,String> map = new HashMap<String, String>();
    map.put("aaa","111");
    map.put("bbb","222");
    map.put("ccc","333");
    //遍历map,有两种
    //1、获取所有的key,通过key得到value,使用get方法
    //2、获取key和value的关系
    //使用第一种方式遍历
    //获取所有的key
    Set<String> sets = map.keySet();
    //遍历所有的key
    for (String key : sets) {
      String value = map.get(key);
      System.out.println(key+":"+value);
    }
    System.out.println("========");
    //使用第二种方式遍历
    //得到key和value的关系
    Set<Map.Entry<String,String>> sets1 = map.entrySet();
    //遍历sets1
    for (Map.Entry<String,String> entry :sets1) {
      String keyv = entry.getKey();
      String valuev = entry.getValue();
      System.out.println(keyv+":"+valuev);
    }
  }

三、在方法上使用泛型

  定义一个数组,实现指定位置上数组元素的交换

  方法逻辑相同,只是数据类型不同,这个时候使用泛型方法

/*
* 使用泛型方法需要定义一个类型使用大小字母表示T:T表示任意的类型
* 写在返回值之前void之前
* =========表示定义了一个类型,这个类型是T
* 在下面就可以使用类型
* */
public static <T> void swap(T[] arr,int a,int b) {
  T temp = arr[a];
  arr[a] = arr[b];
  arr[b] = temp;
}

四、泛型在类上的使用

public class TestDemo04<T> {
   //在类里面可以直接使用T的类型
  T aa;
  public void test1(T bb) {}

  //写一静态方法,在类上面定义的泛型,不能在静态方法里面使用,需重新定义泛型
  public static <A> void test2(A cc) {}
}

以上就是详细分析Java 泛型的使用的详细内容,更多关于Java 泛型的使用的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java 泛型总结(三):通配符的使用

    简介 前两篇文章介绍了泛型的基本用法.类型擦除以及泛型数组.在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用. 这个系列的另外两篇文章: Java 泛型总结(一):基本用法与类型擦除 Java 泛型总结(二):泛型与数组 数组的协变 在了解通配符之前,先来了解一下数组.Java 中的数组是协变的,什么意思?看下面的例子: class Fruit {} class Apple extends Fruit {} class Jonathan extends Apple {} class

  • Java静态泛型使用方法实例解析

    前言:当工具类对多个模型类进行排序,比较等操作的时候,需要书写大量重复代码,因为懒人总要想怎么省事的,所以考虑使用泛型这个玩意简化代码 案例:当前存在两个模型类,Fruit和Person,他们都需要排序方法而且业务逻辑各不相同,因此需要分别写两个排序方法,但因为排序相同的地方太多,唯一的区别就是判断两个对象的大小关系,于是在此做简化操作. 执行步骤: 1.编写模型类接口 interface Model public interface Model<T> { public int compare

  • Java泛型<T> T与T的使用方法详解

    泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 在集合框架(Collection framework)中泛型的身影随处可见.例如,Map 类允许向一个 Map 类型的实例添加任意类的对象,即使最常见的情况在给定映射(map)中保存一个string键值对. 命名类型参数 对于常见的泛型模式,推荐的泛型类型

  • java泛型类的定义与使用详解

    本文为大家分享了java泛型类的定义与使用的具体代码,供大家参考,具体内容如下 当类中要操作的引用数据类型不确定时,可以定义泛型类完成扩展.下面是程序演示. package packB; class Student { //定义学生类 public String st = "student"; } class Worker { //定义工人类 public String wo = "worker"; } //定义泛型类 class Operate<type&g

  • 解析Java 泛型什么情况下不能使用

    一.前言 Java泛型来保证类型安全,防止在运行时发生类型转换异常,让类型参数化,提高了代码的可读性和重用率.但是有些情况下泛型也是不允许使用的,以下是不能使用泛型的一些场景. 二. 什么情况下不能使用Java泛型 1 不能使用泛型的形参创建对象. T o=new T(); // 不允许 2 在泛型类中,不能给静态成员变量定义泛型 Java 中的静态类型随着类加载而实例化,此时泛型的具体类型并没有声明.同时因为静态变量作为所有对象的共享变量,只有类实例化或者方法调用时才能确定其类型.如果是泛型类

  • Java中泛型使用的简单方法介绍

    一. 泛型是什么 "泛型",顾名思义,"泛指的类型".我们提供了泛指的概念,但具体执行的时候却可以有具体的规则来约束,比如我们用的非常多的ArrayList就是个泛型类,ArrayList作为集合可以存放各种元素,如Integer, String,自定义的各种类型等,但在我们使用的时候通过具体的规则来约束,如我们可以约束集合中只存放Integer类型的元素,如List<Integer> iniData = new ArrayList<>().

  • 详细分析Java 泛型的使用

    一.泛型的简介 1.为什么要使用泛型? 一般使用在集合上,比如现在把一个字符串类型的值放入到集合里面,这个时候,这个值放到集合之后,失去本身的类型,只能是object类型.这时,如果想要对这个值进行类型转换,很容易出现类型转换错误,怎么解决这个问题,可以使用泛型来解决. 2.在泛型里面写是一个对象,String 不能写基本的数据类型 比如int,要写基本的数据类型对应的包装类 基本数据类型 对应包装类 基本数据类型 对应包装类 byte Byte short Short int Integer

  • Java详细分析讲解泛型

    目录 1.泛型概念 2.泛型的使用 2.1泛型类语法 2.2泛型方法语法 2.3泛型接口语法 2.4泛型在main方法中的使用 3.擦除机制 4.泛型的上界 5.通配符 5.1通配符的上界 5.2通配符的下界 6.包装类 6.1装箱和拆箱 1.泛型概念 泛型就是将类型参数化 所谓类型参数化就是将类型定义成参数的形式,然后在使用此类型的时候的时候再传入具体的类型 到这我们可以看出来:泛型在定义的时候是不知道具体类型的,需要在使用的时候传入具体的类型,泛型可以用在类.接口和方法中,这样做的好处是一个

  • 详细分析JAVA 线程池

    系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互.在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似的是,线程池在系统启动时即创建大量空闲的线程,程序将一个 Runnable 对象或 Callable 对象传给线程池,线程池就会启动一个线程来执行它们的 run() 或 call() 方法,当 run() 或 call() 方法执行结束后,该线程并不会死亡,而是再次返回线程池成为空闲状态,等待执行下一个

  • 详细分析java 动态代理

    1.动态代理的特点: 字节码随用随创建,随用随加载 2.作用: 不修改源码的基础上对源码进行加强 3.分类: (1)基于接口的动态代理: 涉及到的类:Proxy,由JDK官方提供,使用Proxy类中的newProxyInstance方法创建对象.创建代理对象时要求被代理对象至少实现一个接口,否则无法使用 参数: ClassLoader:类加载器,他是用于加载对象字节码的,和被代理对象使用相同的类加载器,为固定写法 class[]:字节码数组,他是用于让代理对象和被代理对象具有相同的方法,也是固定

  • 详细分析java并发之volatile关键字

    Java面试中经常会涉及关于volatile的问题.本文梳理下volatile关键知识点. volatile字意为"易失性",在Java中用做修饰对象变量.它不是Java特有,在C,C++,C#等编程语言也存在,只是在其它编程语言中使用有所差异,但总体语义一致.比如使用volatile 能阻止编译器对变量的读写优化.简单说,如果一个变量被修饰为volatile,相当于告诉系统说我容易变化,编译器你不要随便优化(重排序,缓存)我. Happens-before 规范上,Java内存模型遵

  • 详细分析Java Lambda表达式

    在了解Lambda表达式之前我们先来区分一下面向对象的思想和函数式编程思想的区别 面向对象的思想: 做一件事情,找一个能解决这个事情的对象,调用他的方法来解决 函数时编程思想: 只要能获取到结果,谁去做的都不重要,重视的是结果,不重视过程 使用Lambda表达式的目的是为了简化我们的代码 匿名内部类虽然也简化了我们的代码,但是Lambda比他更简单,而且语法也更加少 下面我用一段代码来演示一下二者的区别 public class Main { public static void main(St

  • 详细分析JAVA加解密算法

    加解密算法分析 日常开发中,无论你是使用什么语言,都应该遇到过使用加解密的使用场景,比如接口数据需要加密传给前端保证数据传输的安全:HTTPS使用证书的方式首先进行非对称加密,将客户端的私匙传递给服务端,然后双方后面的通信都使用该私匙进行对称加密传输:使用MD5进行文件一致性校验,等等很多的场景都使用到了加解密技术. 很多时候我们对于什么时候要使用什么样的加解密方式是很懵的.因为可用的加解密方案实在是太多,大家对加解密技术的类型可能不是很清楚,今天这篇文章就来梳理一下目前主流的加解密技术,本篇文

  • 详细分析Java内部类——局部内部类

    今天介绍第二种内部类--局部内部类. 局部内部类是什么?顾名思义,那就是定义在局部内部的类(逃).开玩笑的,局部内部类就是定义在代码块.方法体内.作用域(使用花括号"{}"括起来的一段代码)内的类.局部内部类有以下特性: 局部内部类只能在代码代码块.方法体内和作用域中使用. 局部内部类同样可以无限制调用外部类的方法和属性. 可以使用abstract修饰,声明为抽象类. 举个栗子: public class Outer2 { public void print(){ class Inne

  • 详细分析Java内存模型

    目录 一.为什么要学习并发编程 二.为什么需要并发编程 三.从物理机中得到启发 四.Java 内存模型 五.原子性 5.1.什么是原子性 5.2.如何保证原子性 六.可见性 6.1.什么是可见性 6.2.如何保证可见性 七.有序性 7.1.什么是有序性 7.2.如何保证有序性 一.为什么要学习并发编程 对于 "我们为什么要学习并发编程?" 这个问题,就好比 "我们为什么要学习政治?" 一样,我们(至少作为学生党是这样)平常很少接触到,然后背了一堆 "正确且

  • 详细分析Java并发集合ArrayBlockingQueue的用法

    在上一章中,我们介绍了阻塞队列BlockingQueue,下面我们介绍它的常用实现类ArrayBlockingQueue. 一. 用数组来实现队列 因为队列这种数据结构的特殊要求,所以它天然适合用链表的方式来实现,用两个变量分别记录链表头和链表尾,当删除或插入队列时,只要改变链表头或链表尾就可以了,而且链表使用引用的方式链接的,所以它的容量几乎是无限的. 那么怎么使用数组来实现队列,我们需要四个变量:Object[] array来存储队列中元素,headIndex和tailIndex分别记录队列

随机推荐