欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流
本文收录于算法与数据结构体系专栏,本专栏对于0基础者极为友好,欢迎与我一起完成算法与数据结构的从0到1的跨越
在上篇文章中,详细讲述了线性查找法并且对其进行了初步的优化:1️⃣使用static将方法写成一个静态的方法,2️⃣为了避免用户创造类的对象,将勾走凹函数声明为私有的。传送门:详解什么是算法?什么是线性查找法?
对于前面讲的线性查找法,它仍然存在一些需要改进的地方——当时的代码传入的是一个int型的数组,并且查找的元素也是一个int型,这些写完后,我们只可以在int型数组中查找一个int型的元素,但是在java中即使是基本类型也有8种,我们不可能对每一种类型都写一个线性查找的方法,这不是我们所希望的,不断重复写一个方法既不合理也是我们平时需要避免的
本篇文章就是为了学会我们应该如何避免重复写一个方法——泛型
,这种语言机制就是为了可以应付不同的类型,一起来学习吧
泛型类
——在类定义的后面加一个尖括号,里面写一个泛型的类型相应的代表的字母:
,在Java标准库中, 几乎所有的容器类都是泛型类public class LinearSearch<E>{...}
泛型方法
——在public static后面加一个尖括号,里面写一个泛型的类型相应的代表的字母// 表示这个方法将会用到一个类型,类型E具体是什么,用户在调用的时候再指定
//data数组,是E这个类型的数组
//target,要查找的元素,也是E这个类型
public static <E> int search(E[] data, E target){...}
泛型只能接受类对象
,而不能接受基本数据类型,图中的data数组是int类型,属于基本数据类型包装类
,基本数据类型和所对应的包装类之间可以进行互相的转换public class LinearSearchGeneric {
private LinearSearchGeneric(){}
public static <E> int search(E[] data, E target) {
for (int i = 0; i < data.length; i++) {
if (data[i] == target)
return i; //如果找到目标,返回对应的索引值
}
return -1; //如果没有找到目标,返回-1
}
public static void main(String[] args) {
//准备用于查找的数组
//int类型转化成对应的包装类Integer
Integer[] data = {24, 18, 12, 9, 16, 66, 32, 4};
int res = LinearSearchGeneric.search(data, 16);
System.out.println(res); //输出res
int res2 = LinearSearchGeneric.search(data,666); //查找目标666
System.out.println(res2);
}
}
自动转换的机制
,对于16而言,Java编译器知道这里应该是一个泛型类E target
,对于泛型类应该是一个类对象,java语言就会自动把这个16这个基本数据类型给转换成它所对应的包装类
- 对于老版本的Java的话,上面的main函数在调用search()的时候,应该写成
LinearSearch.
,在Java8中,search(data,16) 是可以省略的——我们不显示的告诉泛行方法的泛行的类型是什么
- 在Java语言中,有一个叫做
类型推断的机制
——会根据传来的这个data是integer类型的数组以及16对应的包装类是integer类型,Java编译器可以自动的推断出用户调用的这个search所对应的这个泛型应该就是Integer这个类型
==
orequals
data[i] == target
,由于我们的data[i]此时已经不是一个基本数据类型,而是一个类对象,且target也是一个类对象for(int i = 0; i < data.length; i ++)
if(data[i].equals(target))
return i;
扩展:
- 基于字符串进行处理的时候,对于字符串的判等使用了
==
可能会导致整个算法的逻辑错误- 在Java语言中,string字符串它是一个类,对于类对象之间的判断,一定要使用equals方法