博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第50节:Java的当中的泛型
阅读量:5250 次
发布时间:2019-06-14

本文共 10610 字,大约阅读时间需要 35 分钟。

标题图

Java当中的泛型

01

import java.util.ArrayList;import java.util.List;public class Demo{ public static void main(String[] args){  // 创建list集合  List list = new ArrayList(); // 特性为长度可变,可以存储对象(对象可以是任意的)  list.add("abcdefg"); // 为对象  list.add(1); // 为对象  // 循环取出对象  for(Iterator it = list.iterator(); it.hasNext(); ){   Object object = (Object) it.next();   System.out.println(object.toString());  }  // 打印字符串的长度  // 因为字符串的长度是字符串的特有方法,所以需要进行转型  String str = (String) it.next();  System.out.println(str.length()); }}
String str = (String) it.next();System.out.println(str.length());// 导致错误java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String// 因为存储的对象有Integer类型不能转换为String类型

这就存在一个问题,如果集合存储元素时,而且存储对象有很多,而且对象类型不相同,就很容易导致隐患。

Java中该文件xxx.java在编译的时候不会出现错误是因为该存储的是Object的任何类型的对象,所以不会出现错误,编译通过了。编译后为xxx.class到运行。

如果要解决问题,可以把问题提前到编译的时候去解决,让集合更加安全,但是如何解决呢?

在集合中存储的类型是可以任意的,所以会导致留下隐患,我们认识的数组在存储的时候就不会出现这种错误,因为它一开始就明确了存储的内存类型,一旦不是它要存储的类型就会编译不过去导致出错。

在集合中,我们可以一开始就明确要在容器中存储的什么类型的元素,跟数组一样就好了啊!那就不会出现ClassCastException的问题啦!

那么如何创建集合,规定存储定义的类型呢?这就需要有泛型了,有了泛型,就可以保证安全机制了,可以将运行时期转移到编译时期,泛型的出现就是为了给编译使用的,泛型的出现就可以不用强转了。

List
list = new ArrayList
();

泛型类运用

一直以来,你看到的<E>,就是所谓的泛型表达

java.util接口 Collection

泛型案例

public class Demo{ public static void main(String[] args){  // 添加泛型  Set
set = new TreeSet
(); // 添加元素 set.add("a"); set.add("ab"); for(Iterator
it = set.iterator(); it.hasNext();){ // 不用转换了 String str = it.next(); System.out.println(str); } }}

进行比较长度:

Set
set = new TreeSet
(new Comperator>(){ @Override public int compare(String o1, String o2){ int temp = o1.length() - o2.length(); return temp == 0 ? o1.compareTo(o2) : temp; }}

泛型类 可能导致ClassCastException

// 简书作者:达叔小生public static void main(String[] args){ Demo d = new Demo(); d.setObject(23); String s = (String) d.getObject(); System.out.println(s);}
class Demo{ private String str; public String getStr(){  return str; } public void setStr(String str){  this.str = str; }}// Objectclass Demo{ private Object object; public Object getObject(){  return object; } public void setObject(Object object){  this.object = object; }}

02

JDK1.5开始的新技术

// 泛型类-泛型定义在类上class Demo(D){ private D object; public D getObject(){  return object; } public void setObject(D object){  this.object = object; }}
Demo
d = new Demo
();d.setObject("abc"); // 只能传递String类型String s = d.getObject();System.out.println(s);

泛型方法的使用

// 简书作者:达叔小生class Demo
{ public
void show(D d){ // 泛型方法 System.out.println("show"+d); } public static
void print(E e){ // 方法为静态,使用泛型,需要定义在方法上 System.out.println("print"+d); }}
public static void mian(String[] args){ Demo
demo = new Demo
(); demo.show("abc"); demo.print("abc");}

泛型接口

// 简书作者:达叔小生interface Inter
{ void show(E e);}
class InterDemo implements Inter
{ ...}class InterDemo
implements Inter
{ public void show(T t){ ... }}

泛型通配符

public class Demo{ public static main(String[] args){  List
list = new ArrayList
(); list.add(new Student("dashu",20)); list.add(new Student("dashu1",21)); list.add(new Student("dashu2",22)); for(Iterator
it = list.iterator(); it.hasNext();){ System.out.println(it.next()); } // 打印 private static void print(Collection
coll){ for(Iterator
it = coll.iterator(); it.hasNext();){ System.out.println(it.next()); } // 打印 private static void printList(Collection
coll){ for(Iterator
it = coll.iterator(); it.hasNext();){ System.out.println(it.next().toString()); } // 打印 private static void printList(Collection
coll){ for(Iterator
it = coll.iterator(); it.hasNext();){ Person p = it.next(); System.out.println(p.getName()); } } } }}

? extends E:接收E类型或者E的子类型

? super E:接收E类型或者E的父类型

// 简书作者:达叔小生public class Person{ // 定义属性 private String name; private int age; // 定义构造方法 public Person(){  super(); } // 有参的构造方法 public Person(String name, int age){  super();  this.name = name;  this.age = age; } public String getName(){  return name; } public void setName(String name){  this.name = name; } public int getAge(){  return age; } public void setAge(int age){  this.age = age; } // toString @Override public String toString(){  return "Person [ name=" + name + ",age=" + age + "]"; }}
public class Student extends Person{ public Student(){  super(); } public Student(String name, int age){  super(name,age; }@Override public String toString(){  return "Student [getName()=" + getName() + ",getAge()=" + getAge() + "]"; }}
public class Worker extends Person{ public Worker(){  super(); } public Worker(String name, int age){  super(name, age); } @Override public String toString(){  return "Worker [name =" + getName() + ", age =" + getAge() + "]"; }}

通配符的体现

Collection
c1 = new ArrayList
();c1.add("dashu");Collection
c2 = new ArrayList
();c2.add("dashucoding");boolean b = c1.containsAll(c2);// boolean containsAll(Collection
c);System.out.println("b="+b);// 结果为 false

内源码

// 简书作者:达叔小生public boolean containsAll(Collection
c){ for(Object o : c){ if(!contains(o)){ return false; } return true; }}
java.util类 TreeSet
java.lang.Object -> java.util.AbstractCollection
-> java.util.AbstractSet
-> java.util.TreeSet
参数E:为此set要维护的元素类型
public class TreeSet
extends AbstractSet
implements NavigableSet
,Cloneable,Serializable

TreeSet的构造方法

方法 说明
TreeSet() 构造方法,更具元素自然排序
TreeSet(Collection<? extends E> c) 构造一个包含collection元素的新TreeSet,按照其元素自然顺序进行排序
TreeSet(Comparator<? super E> comparator) 构造一个新的空TreeSet,它根据指定比较进行排序
TreeSet(Sorted s) 构造一个有序的set,具有相同的映射关系与相同排序的TreeSet
public class Person implements Comparable
{ // 定义属性 private String name; private int age; // 定义构造方法 public Person(){ super(); } // 有参的构造方法 public Person(String name, int age){ super(); this.name = name; this.age = age; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } // toString @Override public String toString(){ return "Person [ name=" + name + ",age=" + age + "]"; } @Override public int compareTo(Person o){ int temp = this.age - o.age; return temp == 0?this.name.compareTo(o.name) : temp; return 0; }}
Collection
c = new ArrayList
();c.add(new Person("dashu",12));c.add(new Person("dashucoding",13));TreeSet
ts = new TreeSet
(c);ts.add(new Person("dashuxiaosheng",14));for(Iterator
it = ts.iterator(); it.hasNext();){ Person person = it.next((); System.out.println(person);}
// 简书作者:达叔小生TreeSet
ts = new TreeSet
(new ComparetoName() );ts.add(new Student("dashu",12));ts.add(new Student("dashucoding",13));for(Iterator
it = ts.iterator(); it.hasNext();){ Student student = it.next(); System.out.println(student);}
class ComparetoName implements Comparator
{ @Override public int compare(Student o1, Student o2){ int temp = o1.getName().compareTo(o2.getName()); return temp == 0 ? o1.getAge() - o2.getAge() : temp; }}
ArrayList
a = new ArrayList
(); // 可以ArrayList
a = new ArrayList
(); // 不可以

泛型的特点

public class Demo{ public static void main(String[] args){  // 获取集合中的最大值元素  Collection c = new ArrayList();  c.add(new Student("da",12));  c.add(new Student("dashu",13));  c.ass(new Student("dashucoding",14));  Student stu = getMax(c);  System.out.println(stu); } public static Student getMax(collection
c){ Iterator
it = c.iterator(); Student max = it.next(); while(it.hasNext()){ Student temp = it.next(); if(temp.compareTo(max) > 0){ max = temp; } } return max; }}
// 简书作者:达叔小生public static 
> T getMax(Collection
c){ Iterator
it = c.iterator(); T max = it.next(); while(it.haxNext()){ T temp = it.next(); if(temp.compareTo(max)>0){ max = temp; } }}

Collections工具类

java.util类 Collectionsjava.lang.Object -> java.util.Collections
public class Collectionsextends Object
public class CollectionsDemo{ // 集合框架中的操作集合对象的工具类,静态的方法 Collection
c = new ArrayList
(); c.add("dashu"); c.add("dashucoding"); String max = Collections.max(c);}
maxpublic static 
> T max(Collection
coll)

源码

// 简书作者:达叔小生public static 
> T max(Collection
coll){ Iterator
i = coll.iterator(); T candidate = i.next(); while(i.hasNext()){ T next = i.next(); if(next.compareTo(candidate) > 0){ candidate = next; } return candidate; }}
maxpublic static 
T max (Collection
coll,Comparator
comp)// 可以根据比较器产生顺序
Collection
c = new ArrayList
(); c.add("dashu"); c.add("dashucoding"); String max = Collections.max(c, new Comparator
(){@Override public int compare(String o1, String o2){ int temp = o1.length() - o2.length(); return temp == 0?o1.compareTo(o2) : temp; }});

源码

public static 
T max(Collection
coll, Comparator
comp){ if(comp == null){ return (T)max((Collection
)(Collection) coll); Iterator
i = coll.iterator(); T candidate = i.next(); while(i.hasNext()){ T next = i.next(); if(comp.compare(next, candidate) > 0) candidate = next; } return candidate; }}

排序

List
llist = new ArrayList
();list.add("a");list.add("add");list.add("sl");list.add("dljf");Collections.sort(list);

长度排序

public class ComparatorLength implements Comparator
{ @Override public int compare(String o1, String o2){ int temp = o1.length() - o2.length(); return temp == 0 ? o1.compareTo(o2) : temp; }}

集合和数组

public class ArraysDemo{ public static void main(String[] args){ int[] arr = {23,434,575}; System.out.println(Arrays.toString(arr));  String[] strs = {"dashu","da","shu"};  List
list = Arrays.asList(strs); System.out.println(list); }}

往后余生,唯独有你

简书作者:达叔小生
90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通
简书博客:

结语

  • 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
  • 小礼物走一走 or 点赞

转载于:https://www.cnblogs.com/dashucoding/p/9711191.html

你可能感兴趣的文章
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
perl 学习笔记
查看>>
31 Days of Windows Phone
查看>>
poj 1184(聪明的打字员)
查看>>
Ubuntu下面安装eclipse for c++
查看>>
C#压缩或解压(rar和zip文件)
查看>>
让IE浏览器支持CSS3圆角属性的方法
查看>>
巡风源码阅读与分析---nascan.py
查看>>
LiveBinding应用 dataBind 数据绑定
查看>>
Linux重定向: > 和 &> 区别
查看>>
nginx修改内核参数
查看>>
【欧拉函数模板题】最大公约数
查看>>
C 筛选法找素数
查看>>
TCP为什么需要3次握手与4次挥手(转载)
查看>>
IOC容器
查看>>
织梦仿站第三课:网站的文件分割
查看>>
Windows 2003全面优化
查看>>