集合工具类

在我们讲完常用的基本集合后,我们就要介绍下位于java.util包下的collections类,注意:我们之前的collection是集合的接口,而collections是一个类。collections里面的方法也都是静态的,所以可以说是集合的工具类。接下来还是看几个常用的方法:

sort方法可以对List集合进行一个排序。(排序前提是类实现了comparable的接口,或者方法中传入一个comparator比较器)

还记得我们在说Arrays工具类中也有binarySearch方法——二分法查找,这种方法前提都是排好序的。这里就需要一个排好序的List了。因为底层有调用对应的比较方法,所以要么里面的元素对应的类实现了comparable接口,又或者传入comparator比较器才能实现。

和上面的解释差不多,可以用它们找出最值。

可以返回指定元素在Collection集合中出现的次数。

不管传进去的List是不是有序的,都可以使之的顺序颠倒过来。

使对应的集合变成线程安全(学会了线程就知道这个方法的意义了)

泛型

在集合的文章中作者说了集合里面可以放不同数据类型,但在我们的实际运用中,其实一般都是存放同一种数据类型。那我们怎么去保证一个集合去指定只能存取的数据类型呢?这时候就需要用到我们的泛型机制了。泛型机制是JDK5的新特性。我们看下百度百科对之的解释:

百度百科说了,泛型的本质是参数化类型,那么这是什么意思呢?我们之前自定义方法的时候用形参来代替之后传入的实参数据。泛型也是差不多的原理,只是它是不是用来代替数据的,而是用来代替对应的作用范围内的数据类型

泛型的最基本特征就是<>符号。相信读者在看集合的源代码的时候肯定多次看到<>这个符号了,上面的集合工具类中也有。接下来我们通过Map及子类来理解泛型机制。

泛型类

后面的继承与实现我们姑且不看,就看HashMap后面的,这就是一个泛型了。那么这个K和V分别有什么用呢?我们先看看HashMap中的put方法:

我们可以看到put的返回值是一个V,而传入的key和value的数据类型写着K和V。这时候读者应该能知道了,这里的K和V对应着我们HashMap后面的。也就是说将来我们构造的时候传入的是什么数据类型,那么对应的put中的K和V也对应着相同的数据类型。

注:HashMap的其他方法的K和V也是一样的,这里就用put来作简要说明。

看上面的例子我们可以看到指定的HashMap的key的数据类型为Integer,而value为String。这时候我们如果不按这个规定,编译器就会报错。

从以上的例子我们就可以知道一个基本泛型类的定义格式为:

修饰符 class 类名 {  }

泛型的类体可以写有泛型标识的方法或者属性。所以泛型类中的泛型标识就是为了来代替类中的属性的数据类型或者方法中的一些参数的数据类型的。

泛型方法

上述的put方法里面有了泛型标识就可以说它就是一个泛型方法了嘛?答案是不是的。一个泛型方法的格式应该是这样的:

修饰符  返回值类型 方法名 (参数列表) {  }

泛型方法必须在修饰符和返回值类型中加,否则不算泛型方法!那么泛型方法我们可以在哪里看到呢?其实很简单的,集合的工具类就用到了泛型方法。例如sort方法:

是不是可以看到它的修饰符和返回值类型中就有泛型标识了呢?

那么泛型方法什么时候用的多呢?当我们在一个非泛型类中想在方法中用泛型时,泛型方法的作用就来了。我们看集合工具类的源代码可以看到Collections不是一个泛型类,而sort方法是一个泛型方法,那么修饰符类型和返回值之间声明的其实就是为了说明方法内对应的泛型标识是使用了泛型机制,不然编译器不知道你使用的是泛型机制,会报错。

那泛型类中能用泛型方法嘛?当然是可以的。不过我们需要注意一点:

我们可以看到我们在一个泛型类中用一个T来代表这个类的泛型,然后在泛型方法中用了同一个T,那么如果按照我们之前的说法我们new一个Integer泛型的Generics,里面的print方法只能传入Integer类型才是,这时候我们传字符串居然没有报错?这时候我们就要细分了:泛型类的泛型标识只是用来代替类体中非泛型方法和属性中相同的泛型标识,泛型方法中相同的泛型标识代替不了。(所以上面泛型方法的T非泛型类中的T)

泛型接口

从Map源代码就可以知道泛型接口的书写格式了,这里作者就不写了,对于泛型接口需要知道的是,当我们在实现泛型接口时,其需要有对应的泛型标识(一般是数量一致)。看HashMap可以知道它在实现Map接口时,就有对应的泛型标识了。

泛型类型限制范围

对于泛型,有时候我们不想让传入的泛型类型太过宽泛,我们可以定义泛型的上下界。我们看集合工具类中的一个简单例子:

看这个泛型方法的泛型标识:

>

咋一眼看有点复杂,但我们拆解来看,我们会发现有一个?,这个符号是什么呢?我们可以这么理解:?是一个实际参数,代表我们Java中所有的数据类型,因此也称为通配符。要与T等这种泛型标识区分开,这种泛型标识(如:T,K,V等)是我们自定义的,所以是形式参数,需要我们传值才有实际作用。

先看 super T>,这个代表什么意思呢?super我们都知道,是上级的意思,那么super T就可以理解为T类型的上级,也就是T的父类。所以Comparable中的对应的数据类型只能是T的父类。

(源代码)

接着看>,extends我们也都知道是继承的意思,T去继承Comparable<...>,那传入的参数只能是comparable<...>的子类。

经过简单的解释,可以知道extends和super关键字在泛型中代表范围限制extends用来声明使用泛型的上界,super用来声明使用泛型的下界

于是乎,上面的sort方法传入的List的T需要满足下面的条件:1、T必须包含在Comparable里。2、Comparable接口里的泛型必须是T的父类型。

其他注意事项

1、泛型传入的实参只能是引用数据类型,不能是基本数据类型。

2、泛型类不可以继承Exception类。

3、数组没有泛型机制。

到这,读者不妨再返回去看看集合中那些用到泛型机制的内容,相信这时候你一定能够豁然开朗的。最后,我们看下之前我们在TreeMap中写的没有泛型的比较器:

可以看到没有用泛型的时候我们重写方法时参数只能是Object,于是在比较时需要强制转换数据类型,一旦数据类型不匹配就会报类型转换异常。这无疑是不理想的,但是如果我们用泛型的话:

可以看到,这样我们就不用进行强制类型转换了,减少了错误率。

sqlite工具类 java_Java之泛型、集合工具类相关推荐

  1. [工具类]DataTable与泛型集合List互转

    写在前面 工作中经常遇到datatable与list,对于datatable而言操作起来不太方便.所以有的时候还是非常希望通过泛型集合来进行操作的.所以这里就封装了一个扩展类.也方便使用. 类 方法中 ...

  2. java list排序工具类_java 之 Collections集合工具类排序

    数组有工具类Arrays,集合也有一个工具类Collections. sort方法: sort(List list):根据其元素natural ordering对制定的列表进行排序 sort(List ...

  3. Java集合工具类(三)-泛型集合工具类,用于便捷快速的定义、操作集合。包含Set的交集、并集......

    为什么80%的码农都做不了架构师?>>>    /**      * 用该方法来代替 { @code new LinkedList<E>()} 方式获得新的 { @cod ...

  4. 小汤学编程之JAVA基础day11——集合框架:List/Set/Map集合、Collections集合工具类、泛型、TreeMap和TreeSet

    一.集合的特点 二.继承结构图 三.List集合 1.特点     2.ArrayList类     3.LinkedList类     4.两者的对比     5.集合的遍历 四.Set集合 1.特 ...

  5. Java学习day18-集合框架2(泛型,工具类,TreeMap)

    集合框架2 今日目标 一.泛型 1.泛型类 2.泛型接口 3.泛型方法 4.泛型通配符 二.集合工具类 三.TreeMap和TreeSet 作业: 今日目标 泛型 集合工具类 自带排序集合 一.泛型 ...

  6. 6w字泛型集合知识梳理总结

    泛型&集合 即使再小的帆也能远航~ 一.目录 泛型 集合框架 list接口 Set接口 List和Set总结 Map接口 Collections集合工具类 Iterator接口 Queue接口 ...

  7. C#中的集合、哈希表、泛型集合、字典

    集合ArrayList 集合:集合可以看做是数组,可以将其看成"长度可变,具有很多方法的数组".使用ArrayList,首先需要导入命名空间using.system.collect ...

  8. java基础(类与对象、集合)

    java基础(类与对象.集合) 类与对象 类与对象中的栈和堆 构造方法 this关键字 面向对象三大特性 封装性(private) 继承性(extends) 方法重写(@override) 多态性 向 ...

  9. C#设计一个Windows应用程序,要求如下。 ①构造一个产品基类。 ②分别定义家电、日用百货、衣服等派生类,要求具有不同的特征和行为。 ③定义一个泛型货架类,约束参数类型为产品类。该泛型的货架类包

    设计一个Windows应用程序,要求如下. 1.构造一个产品基类. 2.分别定义家电.日用百货.衣服等派生类,要求具有不同的特征和行为. 3.定义一个泛型货架类,约束参数类型为产品类.该泛型的货架类包 ...

最新文章

  1. 用洪小文,人工智能予力永续未来
  2. 常用软件架构模式分类
  3. linux下安装jdk+tomcat+eclipse+mysql
  4. php微信公众号开发入门
  5. js中一些常用的基本函数
  6. win7电脑假死机怎么办
  7. iPhone 史上最大优惠;摩拜「裁员门」反转;百度网盘缩减空间 | 极客头条
  8. apiCloud实现加载更多效果,基本完美~
  9. Eclipse安装包官网无法下载,需修改镜像地址
  10. 显示器测试软件 绿色,DisPlayX-显示器测试工具
  11. Django 个人博客网站+simpleui后台
  12. pycharm个人最喜欢的配色方案
  13. 腾讯加入“三月宕机全家桶”:系上海网络运营商光纤故障
  14. Python进阶实战 1.0 :爬取豆瓣TOP250电影排行榜
  15. 京东双11准点秒杀脚本
  16. xmind zen 同步问题解决 坚果云
  17. LeetCode—5757. 矩阵中最大的三个菱形和(Get Biggest ...)[中等]—分析及代码(Java)
  18. 告别传统IT 信天通信助推教育行业云化变革
  19. nextcloud19.0.1部署
  20. SAP云上自适应跨可用区高可用方案

热门文章

  1. SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59
  2. 正确理解hibernate的inverse属性
  3. Golang CSP并发模型
  4. linux 查看系统版本 32位 or 64位
  5. Composer -- PHP依赖管理的用法
  6. 如何向github提交更新
  7. PHP的chunk_split() 函数把字符串分割为一连串更小的部分
  8. java输入hello_详解JAVA输出Hello World
  9. 关于微信授权与登录的相关操作(纯手敲)
  10. win上mysql忘记root密码_MySQL数据库之windows下mysql忘记root密码的解决方法