day04 【Object 类、常用 API】
今日内容介绍
java
Object类
日期类
日期格式化
日历类
System
Arrays
正则表达式
第一章 Object 类
1.1 Object 类的特点【重点】
java
1.java.lang.Object类的介绍:
是整个类的体系结构中的最顶层父类,是所有类的最终父类,它里面定义的方法,其它类都有.
类Object是类层次结构的根类。每个类都使用Object作为超类。所有对象(包括数组)都实现这个类的方法。
2.常用方法:
(1)public String toString(): 返回调用方法的对象的字符串表示形式
(2)public boolean equals(Object obj): 比较调用方法的对象和方法参数对象是否相等
true: 说明相等
false: 说明不相等
1.2 Object 类的 toString 方法【重点】
java
/*
toString方法的注意:
1.Object类的toString方法默认返回对象的地址值,类的全名称 + @ + 16进制的int数字
内部源代码分析:
public String toString() {
return getClass().getName() + "@"
+ Integer.toHexString(hashCode());
}
getClass().getName(): 获取类的全名称
Integer.toHexString(hashCode()): 把对象的哈希值转换成16进制的int数字
2.自定义类,如果没有覆盖重写Object类的toString方法,默认调用Object类的toString方法,返回对象地址值
3.自定义类,返回对象的地址值没有意义,需要返回的是对象的内容,所以自定义类需要覆盖重写Object类的toString方法
目的: 返回对象的内容,而不是地址值
快捷键: alt + insert --> toString --> 选择成员变量 --> ok
注意:
打印引用类型变量,默认调用toString方法
*/
java
package com.itheima.object01;
// 我们不写继承 Object 也会默认继承Object类
public class Student extends Object{
//Student对象可以调用Object中定义功能!
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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 "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
java
package com.itheima.object01;
public class Demo {
public static void main(String[] args) {
//Object是父类 --默认有很多功能
Object obj = new Object();
// 自己调用自己的方法
/*
public String toString()返回该对象的字符串表示
*/
System.out.println("obj.toString():"+obj.toString());
// java.lang.Object@1b6d3586
//查看源码发现
// return getClass().getName() + "@" + Integer.toHexString(hashCode());
// 获取包名+类名 @ 地址值
// Student是子类
Student stu = new Student();
System.out.println("stu.toString():"+stu.toString());
// 如果没有重写父类的方法 是不是也是 包名+类名@地址
// stu.toString():com.itheima.object01.Student@4554617c
// 重写之后 stu.toString():Student{name='null', age=0}
// 有个学生对象 你想看什么 想看里面内容
// 能不能把这个方法重写了 ,调用之后 展示里面的属性值
Student stu2 = new Student("张同学",38);
System.out.println("调用stu2.toString方法展示里面的内容:"+stu2.toString());
System.out.println(stu2);// 打印引用类型变量,默认调用toString方法
}
}
String 是 Object 子类,sout("sss") 得到结果 sss 而不不是 地址值 说明重写了。
1.3 Object 类的 equals 方法【重点】
java
/*
equals方法的注意:
1.Object类的equals方法默认比较对象的地址值,然而只要new对象的地址值就是不相同的
内部源代码分析:
public boolean equals(Object obj) {
return (this == obj);
}
this代表: 调用方法的对象
obj代表: 调用方法时传递的参数对象
==: 在比较两个对象的内存地址值是否相同
2.自定义类,如果没有覆盖重写Object类的equals方法,默认调用Object类的equals方法,比较对象的地址值
3.自定义类,比较对象的地址值没有意义,需要比较的是对象的内容,
所以自定义类需要覆盖重写Object类的equals方法
目的: 比较对象的内容,而不是地址值
快捷键: alt + insert --> equals && hashCode() --> 选择成员变量 --> ok
4.==的使用:
(1)基本类型变量: 比较的是具体的数据值
(2)引用类型变量: 比较的是对象的内存地址值是否相同
*/
java
public class Demo04Equals {
public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
//Object类equals方法内部使用==比较对象的地址值,所以使用equals和==的结果是相同的
//两个对象都是new出来的,只要new对象的内存地址值就不相同
System.out.println(obj1.equals(obj2));//false
System.out.println(obj1 == obj2);//false
}
}
1.4 Object 类的 equals 方法重写【重点】
java
public class Student extends Object {
private String name;
private int age;
/*
覆盖重写toString方法
目的: 返回对象的内容,而不再返回地址值
*/
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
/*
覆盖重写equals方法
目的: 比较对象的内容,而不再比较对象的地址值
认为: 姓名相同 同时 年龄也相同,这两个对象就是相同的
*/
@Override
public boolean equals(Object o) {
//this == o: 调用方法的对象和参数对象是同一个对象,直接返回true
//如果自己和自己比,内容必然相同,不用比了直接返回true
if (this == o) return true;
/*
o == null: 如果参数对象是null,直接返回false
||: 或者
getClass() != o.getClass(): 反射讲,调用方法的对象和参数对象不是同一个类的对象,直接返回false getClass()查看对象是基于哪个类产生的意思
*/
//if (o == null || getClass() != o.getClass()) return false;
//和下面的写法是等价的
if (o == null || !(o instanceof Student)) return false;
//向下转型: 把参数对象,强转成Student对象
Student student = (Student) o;
/*
age == student.age: 判断两个对象的年龄是否相同
&&: 并且
Objects.equals(name, student.name): 调用工具类Objects静态方法equals
比较引用类型两个字符串是否相同
*/
return age == student.age &&
Objects.equals(name, student.name);
}
//空参/满参,set/get方法 自己生成
}
java
public class Demo05Equals {
public static void main(String[] args) {
Student stu1 = new Student("张三", 18);
Student stu2 = new Student("李四", 38);
Student stu3 = new Student("张三", 18);
/*
Student类没有覆盖重写Object类的equals方法
结果: false,false,false
Student类覆盖重写Object类的equals方法
结果: false,true,false
*/
System.out.println(stu1.equals(stu2));
System.out.println(stu1.equals(stu3));
System.out.println(stu2.equals(stu3));
}
}
第二章 Date 类【重点】
2.1 Date 类的介绍和基本使用
java
/*
1.java.util.Date类介绍:类 Date 表示特定的瞬间,精确到毫秒。
2.注意:
(1)时间原点: 1970年1月1日 0时0分0秒 认为是0毫秒
(2)时间标准: 采用格林威治时间标准
(3)北京时间与标准时间相差8小时
3.构造方法:
(1)public Date(): 把当前时间毫秒值(运行程序的此时此刻)封装成Date对象
(2)public Date(long date): 把构造方法参数指定的毫秒值封装成Date对象
4.常用常用方法:
(1)public long getTime(): 返回调用方法的Date对象对应的毫秒值
(2)public void setTime(long time): 把方法参数指定的毫秒值设置给调用方法的Date对象
*/
java
package com.itheima.date02;
import java.util.Date;
public class DateDemo {
/*
Date 表示日期时间 精确到毫秒值
Date() 获取当前时间 (把当前时间毫秒值转换为一个对象)
当前时间毫秒值 :就是计算当前时间-1970-1-1-0-0-0 之后 转换为毫秒的值。
Date(long time) :把传递的时间毫秒值转换成一个对象
方法 getTime() 获取date对象的时间毫秒值
setTime(时间毫秒值)//重新设置一个时间点 用毫秒值
*/
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
// 当前时间对象有了能不能变成毫秒值
long time = date.getTime();
System.out.println(time);
// Date(long time) :把传递的时间毫秒值转换成一个对象
Date date1 = new Date(60*1000);
System.out.println(date1);
date1.setTime(60*1000*60);
System.out.println("设置时间之后"+date1);
}
}
第三章 DateFormat 类【重点】
3.1 DateFormat 类的介绍
java
/*
java.text.DateFormat类:
1.作用:
用来完成Date对象和String对象之间的相互转换的
2.常用功能
(1)格式化(就是把Date对象转换成String对象)
public String format(Date date): 把方法参数Date对象转换成String对象并返回
参数:
Date date: 日期对象
返回值:
String: 返回的是String对象
(2)解析(就是把String对象转换成Date对象)
public Date parse(String source): 把方法参数String对象转换成Date对象并返回
参数:
String source: String对象
返回值:
Date: 返回的是日期对象
3.使用
java.text.DateFormat是一个抽象类,不能直接new对象
常用子类:java.text.SimpleDateFormat类
构造方法:
public SimpleDateFormat(String pattern)
参数:
String pattern: String类型的日期格式
显示格式 需要设置的日期格式
2020年09月23日 10点43分20秒123毫秒 yyyy年MM月dd日 HH点mm分ss秒SSS毫秒
2020-09-23 10:43:20:123 yyyy-MM-dd HH:mm:ss:SSS
*/
3.2 日期格式化为字符串【重点】
java
/*
把Date对象格式化成String对象的实现步骤
1.创建String类型的日期格式对象patter,需要指定具体的格式
2.创建日期格式化SimpleDateFormat类的对象sdf,构造方法参数传递日期格式对象patter
3.创建当前毫秒值对应的日期Date对象date
4.使用日期格式化SimpleDateFormat类的对象sdf调用format方法,传递日期对象date,
获取指定格式的String对象
5.打印String对象
*/
java
public class Demo04DateFormat {
public static void main(String[] args) {
//1.创建String类型的日期格式对象patter,需要指定具体的格式
String patter = "yyyy年MM月dd日 HH点mm分ss秒SSS毫秒";
//2.创建日期格式化SimpleDateFormat类的对象sdf,构造方法参数传递日期格式对象patter
SimpleDateFormat sdf = new SimpleDateFormat(patter);
//3.创建当前毫秒值对应的日期Date对象date
Date date = new Date();
//4.使用日期格式化SimpleDateFormat类的对象sdf调用format方法,传递日期对象date,
//获取指定格式的String对象
String strDate = sdf.format(date);
//5.打印String对象
System.out.println(strDate);
}
}
3.3 字符串转换成日期【重点】
java
/*
把String对象解析成Date对象的实现步骤
1.创建String类型的日期格式对象patter,需要指定具体的格式
2.创建日期格式化SimpleDateFormat类的对象sdf,构造方法参数传递日期格式对象patter
3.创建String对象strDate,保存指定格式的日期时间
4.使用日期格式化SimpleDateFormat类的对象sdf调用parse方法,传递String的日期对象strDate,
获取Date对象
5.打印Date对象
*/
java
public class Demo05DateFormat {
public static void main(String[] args) throws ParseException {
//1.创建String类型的日期格式对象patter,需要指定具体的格式
String patter = "yyyy年MM月dd日 HH点mm分ss秒SSS毫秒";
//2.创建日期格式化SimpleDateFormat类的对象sdf,构造方法参数传递日期格式对象patter
SimpleDateFormat sdf = new SimpleDateFormat(patter);
//3.创建String对象strDate,保存指定格式的日期时间
String strDate = "2020年09月23日 10点54分22秒442毫秒";
//String strDate = "2020-09-23 10:54:22:442";//错误: 和上面的日期格式不匹配,报出解析异常
//4.使用日期格式化SimpleDateFormat类的对象sdf调用parse方法,传递String的日期对象strDate,
//获取Date对象
Date date = sdf.parse(strDate);
//5.打印Date对象
System.out.println(date);
}
}
第四章 Calendar 日历类【重点】
4.1 Calendar 类的介绍
java
/*
java.util.Calendar类: 日历类,内部提供了大量的与日期时间相关的信息,想要什么就那什么,非常方便
java.util.Calendar类是一个抽象类,不能直接创建对象
不常用子类: java.util.GregorianCalendar类 用起来太麻烦
解决方案:
在java.util.Calendar类的内部提供静态方法获取其子类对象
public static Calendar getInstance(): 获取抽象类Calendar类的子类对象
返回值类型:
java.util.Calendar类: 是抽象类,说明方法内部必然会返回该抽象类的子类对象
*/
public class Demo03Calendar {
public static void main(String[] args) {
//获取Calendar类的子类对象
Calendar cal = Calendar.getInstance();
System.out.println(cal);
}
}
4.2 Calendar 类的常用方法
java
/*
Calendar类的常用方法
public int get(int field) :返回给定日历字段的值。
参数:
int field: 代表的是要获取的是哪个字段
返回值:
int: 代表的是获取到的字段对应的值
public void set(int field, int value) :将给定的日历字段设置为给定值。
参数:
int field: 代表的是要给哪个字段设置值
int value: 代表的是设置的值是什么
public abstract void add(int field, int amount) :
根据日历的规则,为给定的日历字段添加或减去指定的时间量。
给指定字段增加指定的值
参数:
int field: 代表的是要给哪个字段增加值
int amount: 代表的是增加的值是多少
正数表示增加,负数表示减少
public Date getTime() :把调用方法的Calendar对象转换成Date对象并返回
public void setTime(Date date): 把调用方法传递的参数Date对象设置给调用方法的Calendar对象
Calendar类当中的常量
Calendar.YEAR 代表年 1
Calendar.MONTH 代表月 2
Calendar.DAY_OF_MONTH 代表日 5
*/
java
package com.itheima.calendar;
import java.util.Calendar;
public class Demo {
public static void main(String[] args) {
//创建一个日历类对象 只能通过静态方法
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
// calendar日历类 作用 可以获取任意时间元素
/*
获取方法
int get(int filed)
返回值 就是时间元素的值
参数代表 你来进行选择
*/
//获取年
int year = calendar.get(Calendar.YEAR);
// int year = calendar.get(1);上面的写法比单纯的写 1 要见名之意
System.out.println(year+"年");
//获取月
int month = calendar.get(Calendar.MONTH);
System.out.println((month+1)+"月");
// 获取日 月中日
int date = calendar.get(Calendar.DATE);
System.out.println(date+"日");
//单独设置某一个时间元素 set(需要设置的日期元素,值)
calendar.set(Calendar.YEAR,2011);
System.out.println("我把日历中的年改成了 2011 其他没有改");
System.out.println(calendar.get(Calendar.YEAR)+"年"+(calendar.get(Calendar.MONTH)+1)+"月"+calendar.get(Calendar.DATE)+"日");
//现在已经是 2011年12月30日
// 进行某个时间元素的偏移 往前 还是往后
calendar.add(Calendar.YEAR,10);
System.out.println(calendar.get(Calendar.YEAR)+"年"+(calendar.get(Calendar.MONTH)+1)+"月"+calendar.get(Calendar.DATE)+"日");
}
}
4.3 Calendar 类案例
java
package com.itheima.calendar;
import java.util.Calendar;
import java.util.Scanner;
public class Test {
/*
键盘录入年份
我们告知 该2月多少天
3 1 往前移动一天 2月末 29 月中日 29 28 月中日28
实现步骤
1:创建键盘录入对象 Scanner
2:友情提示 录入一个年份 sc.nextInt()
3: 创建一个日历对象 设置年份是 录入的 设置月 3-1 = 2 (0,1,2) 设置日 1 日
4: 让日历对象 add向前偏移 一天
5: 查看月中日 是多少 2月就是多少天
*/
public static void main(String[] args) {
// 1:创建键盘录入对象 Scanner
Scanner scanner = new Scanner(System.in);
// 2:友情提示 录入一个年份 sc.nextInt()
System.out.println("你录入一个整数年份,我帮您查一下该年2月是多少天 ");
int year = scanner.nextInt();
//3:创建一个日历对象 设置年份是 录入的 设置月 3-1 = 2 (0,1,2) 设置日 1 日
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,2);//设置3月
calendar.set(Calendar.DATE,1);
//它是 3月1日
//4: 3月1日的前一天是 2月的最后一天
calendar.add(Calendar.DATE,-1);
//5:查看月中日 是多少 2月就是多少天
System.out.println("该"+year+"年的2月是:"+calendar.get(Calendar.DATE)+"天");
}
}
第五章 System 类的使用【了解】
5.1 System 类的介绍
java
/*
java.lang.System类: 用来完成相关系统操作的工具类
工具类的特点:
1.所有的成员都是static修饰的,直接用类名调用即可,不需要对象
2.把构造方法private修饰
常用方法:
public static void exit(int status): 终止当前正在运行的 Java 虚拟机。
参数:
int status: 0表示正常终止JVM,非0表示异常终止JVM
*/
java
package com.itheima.system05;
public class Demo {
public static void main(String[] args) {
/*
JVM退出命令
*/
for (int i = 0; i <100 ; i++) {
System.out.println(i);
if(i==50){
// break;//结束了所在的循环
// return;//结束该方法
System.exit(0);//JVM虚拟机结束了
}
}
System.out.println("main方法结束了");
}
}
5.2 System 类的练习_获取程序执行的时间
java
/*
System类的静态方法
public static long currentTimeMillis(): 获取当前时间的毫秒值
等价于: new Date().getTime()
需求:在控制台输出1-10000,计算这段代码执行了多少毫秒!
实现步骤:
1.获取开始时间对应的毫秒值
2.执行功能代码
3.获取结束时间对应的毫秒值
4.计算总耗时并输出
*/
java
package com.itheima.system05;
public class Demo2 {
public static void main(String[] args) {
//System可以获取当前时间的毫秒值
// 当前时间和1970 1月1日 0:0:0 之间的差值 转换成了 毫秒
//获取当前时间毫秒值
long start = System.currentTimeMillis();
for (int i = 0; i <10000000 ; i++) {
System.out.println("你追我.....追追追");
}
long end = System.currentTimeMillis();
System.out.println("这个程序用时:"+(end-start)+"毫秒");
}
}
5.3 System 类的练习_数组拷贝
java
package com.itheima.system05;
import java.util.Arrays;
public class Demo3 {
public static void main(String[] args) {
//数组的copy方法
//源数组
int[] srcArr = {10,20,30,40,50,60};
//目标数组
int[] destArr = {100,200,300,400,500,600,70,80,90};
System.out.println("源数组数据:"+Arrays.toString(srcArr));//打印数组中的数据内容
System.out.println("目标数组数据:"+Arrays.toString(destArr));//打印数组中的数据内容
//实现 srcArr数组中部分数据 copy到 目标数组的指定位置
//源数组 从 30这个元素位置2开始 复制到 目标数组 3位置 复制三个元素
/*
static void arrayCopy(Object src,int srcPos,Object dest,int destPos,int length)
src 源数组 srcPos 源数组的起始位值
dest 目标数组 destPos 目标数组的起始位值 length 复制几个
*/
System.arraycopy(srcArr,2,destArr,3,3);
System.out.println("源数组数据:"+Arrays.toString(srcArr));//打印数组中的数据内容
System.out.println("目标数组数据:"+Arrays.toString(destArr));//打印数组中的数据内容
}
}
5.4 System 类的 gc 方法
java
/*
java.lang.System类: 用来完成相关系统操作的工具类
常用方法:
public static void gc(): 运行垃圾回收器。
运行垃圾回收器,JVM将从堆内存中清理对象,
清理对象的同时会调用对象的finalize()方法,建议自定义类覆盖重写finalize()方法
JVM的垃圾回收器是通过另一个线程开启的
*/
public class Demo05System {
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
new Student();
}
System.gc();//建议运行垃圾回收器
System.out.println("main...end...");
}
}
public class Student {
@Override
protected void finalize() throws Throwable {
System.out.println("对象被回收了...");
}
}
第六章 冒泡排序
两个元素交换,该如何实现位置互换
java
package com.itheima.paixu;
import java.util.Arrays;
public class Demo01 {
/*
两个元素交换位置 需要用到第三方的变量
*/
public static void main(String[] args) {
int[] arr = {2,3};
//要求你 让 arr[1] arr[0] 换位置
int temp = arr[0];
arr[0] =arr[1];
arr[1]=temp;
System.out.println(Arrays.toString(arr));
}
}
6.1 冒泡排序原理
java
/*
冒泡排序
1.原理:
每次都是从第一个元素开始向后两两进行比较,
只要后面的元素小于前面的元素,就交换这两个元素(从小到大)
2.总结:
1.有5个数需要排4趟,有n个数需要n-1趟
2.每趟排序的次数都比前面一趟少1次
3.规律:
第一趟 第二趟 第三趟 第四趟
[0] VS [1] [0] VS [1] [0] VS [1] [0] VS [1]
[1] VS [2] [1] VS [2] [1] VS [2]
[2] VS [3] [2] VS [3]
[3] VS [4]
*/
6.2 冒泡排序代码实现
java
package com.itheima.paixu;
import java.util.Arrays;
public class BubbleSortDemo {
public static void main(String[] args) {
//定义一个数组
int[] arr = {7,50,4,6,3,12,30,1};
// 对数组中的元素进行排序 数组中的元素是按照升序排列
//最终效果 arr={3,4,5,6,7}
//由无序变有序 需要动点脑筋了 方式方法有很多种。
System.out.println("排序前的:"+Arrays.toString(arr));
// 冒泡排序--算法
// 外层循环 决定 趟数 4趟
// 写4 就写死了长度 4 数组长度-1
for (int i = 0; i <arr.length-1 ; i++) {
// i=0的时候 是第一趟 第一趟要比较几次 4次
// i = 1 的时候 是第二趟 第二趟比较 3次
// i 2 第三趟 比较2次
// i 3 第四趟 比较1次
for(int j=0; j<arr.length-1-i; j++){
// 元素两两比较 大的往后放
if(arr[j]>arr[j+1]){// 前面元素大于后面的 就要交换
//位置交换
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println("排好序的数组为:"+ Arrays.toString(arr));
}
}
第七章 数组的二分查找法
7.1 数组元素的普通查找法
java
/*
要求:
在int数组中查找某个元素第一次出现的索引,如果没有该元素,返回-1
10,20,30,50,80
定义方法在int数组中获取一个元素第一次出现的索引值,如果没有返回-1
三要素:
1.方法名称: getIndex
2.参数列表:
int[] array: 要查找元素的int数组
int value: 要在数组中查找的元素
3.返回值类型: int
实现步骤:
1.使用for循环遍历方法参数数组array
1.1 如果当前元素值 等于 要查找的元素value
1.2 直接返回当前元素的索引
2.for循环结束,说明没有找找该元素,直接返回-1
*/
java
package com.itheima.binarysearch;
public class Demo {
/*
10,20,30,50,80
定义方法在int数组中获取一个元素第一次出现的索引值,如果没有返回-1
*/
public static void main(String[] args) {
int[] arr = {10,20,30,50,80};
System.out.println("找到30在数组中的索引:"+getIndex(arr,30));
System.out.println("找到300在数组中的索引:"+getIndex(arr,300));
System.out.println("找到50在数组中的索引:"+getIndex(arr,50));
}
/*
定义一个方法
用来寻找 某个数组中 某个元素 返回该元素在数组中的索引
方法 三要素
一个必须
方法名 getIndex
两个确定
确定 参数 int[] array int value
确定 返回值类型 int
如果找到元素 返回元素的索引
找不到返回-1
*/
public static int getIndex(int[] array,int value){
//代码怎么写?
for (int i = 0; i < array.length; i++) {
if(array[i]==value){
//说明有该元素 返回i
return i;
}
}
//找不到 就返回-1
return -1;
}
}
7.2 二分查找原理
java
/*
前提:
1.数组必须要保证是有序的
2.数组元素不能重复
原理:
取数组中间的元素和被查找的元素进行比较,如果被查找元素大于数组中间元素,
就舍去数组元素左的一半,对另一半继续进行查找。
*/
7.3 二分查找代码实现
java
package com.itheima.binarysearch;
public class BinaryDemo {
/*
二分查找使用有要求
1:数组元素有序
2:没有重复元素
*/
public static void main(String[] args) {
int[] arr = {10,20,30,50,80};
System.out.println("找到30在数组中的索引:"+binarySearch(arr,30));
System.out.println("找到300在数组中的索引:"+binarySearch(arr,300));
System.out.println("找到50在数组中的索引:"+binarySearch(arr,50));
}
/*
二分查找方式 查找指定元素在数组中的索引
如果有就返回索引 如果没有返回-1
value是被查找元素
*/
public static int binarySearch(int[] array,int value){
// 1:定义两个变量 表示查找范围
int start = 0;
int end = array.length-1;
// 2:循环查找
while(start<=end){
// 在可查找范围内
// 3:找出中间位置元素 计算出中间元素索引
int mid = (end+start)/2;
//怎么找中间元素
// array[mid]
// 中间元素和被查找元素 value 进行比较
if(array[mid]>value){//中间元素大于被查找的元素
// 右边不要 end移动左边 mid 左边
end = mid-1;
}else if(array[mid]<value){//中间元素小于被查找的元素
// 左边不要 start移动右边 mid的右边
start = mid+1;
}else{//等于 说明找到了
return mid;
}
}
//循环做完都没找到就真找不到了
return -1;
//
}
}
第八章 Arrays 工具类的使用
8.1 工具类 Arrays 的用法
java
/*
java.util.Arrays类: 此类是用来操作数组的工具类
工具类的特点:
1.所有的成员都是static修饰的,直接用类名调用即可,不需要对象
2.把构造方法private修饰
常用方法:
public static void sort(int[] a) 对指定的int数组进行升序排列
public static int binarySearch(int[] a,int key):
对数组进行二分查找法,找不到元素返回(-插入点)-1
public static String toString(int[] a) 将数组转成字符串
*/
public class Demo06Arrays {
public static void main(String[] args) {
//定义数组
int[] array = {10,9,3,6,5,1,2};
System.out.println("排序前: "+Arrays.toString(array));
//调用方法按照从小到大的顺序排序
MyArrays.sort(array);
System.out.println("排序后: "+Arrays.toString(array));
System.out.println("二分超找1: "+Arrays.binarySearch(array,1));//0
System.out.println("二分超找6: "+Arrays.binarySearch(array,6));//4
System.out.println("二分超找10: "+Arrays.binarySearch(array,10));//6
}
}