说明:
(1)本篇博客的主要目的是【通过线性查找法,打开算法的大门】;
(2)其中的【程序实现 和 后续的程序改善】,似乎有点跑题,但可以有效的【提升编程能力】;
目录
一:“线性查找法”引入案例;
二:“线性查找法”初始实现;
三:“线性查找法”初始实现:完善一:【查找方法设为static】;【构造方法设为private】;
1.将search方法设为静态;
2.将LinearSearch类的构造函数设置为private;
四:“线性查找法”初始实现:完善二:使用泛型,使方法具有通用性;
五:“线性查找法”初始实现:完善三:使用equals()代替==;
一:“线性查找法”引入案例;
比如在一个线性数据结构(数组)[24,18,12,9,16,66,32,4]中,想从这个数据中查找16这个元素;那么,可以设置一个索引i,从0开始挨个比对;
比如在一个线性数据结构(数组)[24,18,12,9,16,66,32,4]中,想从这个数据中查找16这个元素;那么,可以设置一个索引i,从0开始挨个比对;
二:“线性查找法”初始实现;
创建一个Java工程:LinearSearch;然后为了演示,创建LinearSearch演示类;
LinearSearch类:
public class LinearSearch {
public int search(int[] data, int target) {
for (int i = 0; i < data.length; i++) {
if (data[i] == target) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] data = {24, 18, 12, 9, 16, 66, 32, 4};
LinearSearch linearSearch = new LinearSearch();
int res = linearSearch.search(data, 16);
System.out.println(res);
}
}
说明:
(1)这个代码太简单了,很容易看懂,就不解释了;
(2)只是,上面的代码还有很多不完美的地方,需要修改完善;
创建一个Java工程:LinearSearch;然后为了演示,创建LinearSearch演示类;
LinearSearch类:
public class LinearSearch {
public int search(int[] data, int target) {
for (int i = 0; i < data.length; i++) {
if (data[i] == target) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] data = {24, 18, 12, 9, 16, 66, 32, 4};
LinearSearch linearSearch = new LinearSearch();
int res = linearSearch.search(data, 16);
System.out.println(res);
}
}
说明:
(1)这个代码太简单了,很容易看懂,就不解释了;
(2)只是,上面的代码还有很多不完美的地方,需要修改完善;
三:“线性查找法”初始实现:完善一:【查找方法设为static】;【构造方法设为private】;
这儿的主要目的是:把LinearSearch类,变得更像一个【工具类】;
1.将search方法设为静态;
LinearSearch;
public class LinearSearch { public static int search(int[] data, int target) { for (int i = 0; i < data.length; i++) { if (data[i] == target) { return i; } } return -1; } public static void main(String[] args) { int[] data = {24, 18, 12, 9, 16, 66, 32, 4}; // LinearSearch linearSearch = new LinearSearch(); // int res = linearSearch.search(data, 16); int res = LinearSearch.search(data, 16); System.out.println(res); } }说明:
(0)我们知道Java官方提供的Math类,使用Math类的方法时候,都可以直接如Math.abs(-4)所示,用Math类调用;
(1)将search()这个功能方法,设置为静态的;那么我们在调用search()方法的时候,直接调用就行了,不用再实例化LinearSearch类对象了;
目前这个LinearSearch类,可以完成特定的功能,那么可以认为是自己编写的工具类;而对于工具类,我们一般是不希望实例化这个类的,而是直接通过类名去调用内部的方法;
那么,如何设置,以达到【无法实例化LinearSearch类对象】呐?:可以将类的构造函数设为private;
2.将LinearSearch类的构造函数设置为private;
public class LinearSearch { private LinearSearch() { } public static int search(int[] data, int target) { for (int i = 0; i < data.length; i++) { if (data[i] == target) { return i; } } return -1; } public static void main(String[] args) { int[] data = {24, 18, 12, 9, 16, 66, 32, 4}; // LinearSearch linearSearch = new LinearSearch(); // int res = linearSearch.search(data, 16); int res = LinearSearch.search(data, 16); System.out.println(res); } }说明:
(1)这儿也是仿照Java官方提供的jar,如Math类的构造函数就设为了private;
(2)很容易理解,一旦构造函数设为私有,那么在LinearSearch类外,实例化LinearSearch类对象,就会报错;
问题:
即,我们要继续改造,使其具有通用性,我们也能避免书写重复的代码;这也就是接下来【四:“线性查找法”初始实现:完善二:使用泛型;】中的内容;
四:“线性查找法”初始实现:完善二:使用泛型,使方法具有通用性;
【为了使一个类,或,一个方法,能够应付多种不同的数据类型】,Java提供的泛型机制,可以解决这个问题。(在很多语言中都有类似的机制)
在java中,使用泛型的方式,常见的有两种:
(1)定义一个泛型类:
……………………………………………………
但是,这儿我们使用的不是LinearSearch类的类对象,而是仅仅是使用类中的search()方法;所以,这儿我们不需要把这个LinearSearch类定义为泛型类;
……………………………………………………
(2)定义一个泛型方法:
LinearSearch类:
import java.util.ArrayList;
public class LinearSearch{
private LinearSearch() {
}
public static int search(E[] data, E target) {
for (int i = 0; i < data.length; i++) {
if (data[i] == target) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
Integer[] data = {24, 18, 12, 9, 16, 66, 32, 4};
// LinearSearch linearSearch = new LinearSearch();
// int res = linearSearch.search(data, 16);
int res = LinearSearch.search(data, 16);
System.out.println(res);
}
}
说明:
(1)使用泛型时,不能使用基本数据类型;
(2)方法说明;
(3)Java8增加了类型推断:我们在调用泛型方法的时候,可以不明确指明泛型的类型;
【为了使一个类,或,一个方法,能够应付多种不同的数据类型】,Java提供的泛型机制,可以解决这个问题。(在很多语言中都有类似的机制)
在java中,使用泛型的方式,常见的有两种:
(1)定义一个泛型类:
……………………………………………………
但是,这儿我们使用的不是LinearSearch类的类对象,而是仅仅是使用类中的search()方法;所以,这儿我们不需要把这个LinearSearch类定义为泛型类;
……………………………………………………
(2)定义一个泛型方法:
LinearSearch类:
import java.util.ArrayList;
public class LinearSearch{
private LinearSearch() {
}
public static int search(E[] data, E target) {
for (int i = 0; i < data.length; i++) {
if (data[i] == target) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
Integer[] data = {24, 18, 12, 9, 16, 66, 32, 4};
// LinearSearch linearSearch = new LinearSearch();
// int res = linearSearch.search(data, 16);
int res = LinearSearch.search(data, 16);
System.out.println(res);
}
}
说明:
(1)使用泛型时,不能使用基本数据类型;
(2)方法说明;
(3)Java8增加了类型推断:我们在调用泛型方法的时候,可以不明确指明泛型的类型;
五:“线性查找法”初始实现:完善三:使用equals()代替==;
equals()方法和==分析:
(1)==:判断引用是否相等;
(2)所有类的父类Object类的equals()方法,其中的内容也是==:即最顶级的equals()方法也是比较引用是否相同;
(3)Java中的不可变类(Immutable Class),如String、基本类型的包装类、BigInteger和BigDecimal等,都重写了(从Object类继承过来的)equals()方法:重写后的equals()方法,其作用是比较值是否相等了;
(4)假如我们自定义了一个类,比如Student类:
● 如果我们不在Student类中重写equals()方法的话,那么【student1==student2】和【student1.equals(student2)】是一样的,都是比较student1和student2是否引相等;
● 所以,对于一些自定义的类,我们一般也重写equals()方法;(以达到【student1.equals(student2)】是比较student1和student2是否值相等的目的;;;;自然,可以在equals()方法中定义自己的、符合当前业务需求的逻辑)
LinearSearch类:
import java.util.ArrayList;
public class LinearSearch{
private LinearSearch() {
}
public static int search(E[] data, E target) {
for (int i = 0; i < data.length; i++) {
if (data[i].equals(target)) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
Integer[] data = {24, 18, 12, 9, 16, 66, 32, 4};
// LinearSearch linearSearch = new LinearSearch();
// int res = linearSearch.search(data, 16);
int res = LinearSearch.search(data, 16);
System.out.println(res);
}
}
说明:
(1)使用equals()方法,而不是==;
equals()方法和==分析:
(1)==:判断引用是否相等;
(2)所有类的父类Object类的equals()方法,其中的内容也是==:即最顶级的equals()方法也是比较引用是否相同;
(3)Java中的不可变类(Immutable Class),如String、基本类型的包装类、BigInteger和BigDecimal等,都重写了(从Object类继承过来的)equals()方法:重写后的equals()方法,其作用是比较值是否相等了;
(4)假如我们自定义了一个类,比如Student类:
● 如果我们不在Student类中重写equals()方法的话,那么【student1==student2】和【student1.equals(student2)】是一样的,都是比较student1和student2是否引相等;
● 所以,对于一些自定义的类,我们一般也重写equals()方法;(以达到【student1.equals(student2)】是比较student1和student2是否值相等的目的;;;;自然,可以在equals()方法中定义自己的、符合当前业务需求的逻辑)
LinearSearch类:
import java.util.ArrayList;
public class LinearSearch{
private LinearSearch() {
}
public static int search(E[] data, E target) {
for (int i = 0; i < data.length; i++) {
if (data[i].equals(target)) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
Integer[] data = {24, 18, 12, 9, 16, 66, 32, 4};
// LinearSearch linearSearch = new LinearSearch();
// int res = linearSearch.search(data, 16);
int res = LinearSearch.search(data, 16);
System.out.println(res);
}
}
说明:
(1)使用equals()方法,而不是==;



