Java基础进阶:APi使用,Math,Arrarys,Objects工具类,自动拆装箱,字符串与基本数据类型互转,递归算法源码,冒泡排序源码实现,快排实现源码,附重难点,代码实现源码,课堂笔记,课后扩展及答案
要点摘要
Math:
类中么有构造方法,内部方法是静态的,可以直接类名.方式调用
常用:
Math.abs(int a):返回参数绝对值
Math.ceil(double a):返回大于或等于参数的最小double值,等于一个整数
Math.floor(double a):返回小于或等于参数的最大double值,等于一个整数
Math.round(float):按照四舍五入返回最接近参数的int
Math.max(int a,int b):返回两个中最大
Math.min(int a,int b):返回两个值中最小
Math.pow(double a,double b):返回a的b次幂
Math.random():返回double的正值[0.0,0.1]
System:
常用:
System.exit(int 数字):终止当前运行的java虚拟机,非零表示异常终止
System.currentTimeMillis(): 返回当前时间(以毫秒为单位)
Object类:
toString方法:
重写方式:
重写toString方法 Alt+Intsert选择toString
在类的空白区域,右键 -> Generate -> 选择toString
equals方法:
重写场景:不希望比地址值,想要结合属性比较时候重写该方法
alt + insert 选择equals() and hashCode(),IntelliJ Default,一路next,finish即可
在类的空白区域,右键 -> Generate -> 选择equals() and hashCode(),后面的同上。
object常用方法:
object.toString(对象):返回参数中的字符串表示形式
object.toString(对象,默认字符串):返回对象的字符串表示形式
object.isNull(对象):判断对象是否为空
object.nonNull(对象):判断对象是否不为空
BigDecimal:
作用
可以进行精确计算
方法:
构造方法:
BigDecimal(double类型)
BigDecimal(String类型)
常用方法:
对象名.add(另一个Bd对象):加法
对象名.subtract(另一个Bd对象):减法
对象名.multiply(另一个Bd对象):乘法
对象名.divide(另一个Bd对象,精确几位,舍入模式):除法
除不尽时候使用divide三参方法
包装类:
基本包装类型作用:
将基本数据类型封装成对象,好处在于可以在对象中定义更多的功能方法操作该数据
基本数据雷影对应的包装类
基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean
Interger类:
常用方法:
Interger.valueOf(int类型):返回表示指定的 int 值的 Integer 实例
Integer.valueOf(String 类型):返回一个保存指定值的 Integer 对象 String
自动装箱自动拆箱:
自动装箱:
把基本数据类型转换为对应的包装类型
自动拆箱:
把包装类型转换为对应的基本数据类型
int和String类型的转换:
int转String
方式一:直接数字后加空字符串
方式二:通过String类静态方法valueOf()
String转int
方式一:先将字符串转成Integer,在调用valueOf()方法
方式二:通过Interger.parseInt()进行转换
递归:
一定要有出口.否则内存溢出
次数不宜过多
数组的高级操作:
二分查找:
概述:
查找指定元素在数组中的位置时,以前的方式是通过遍历,逐个获取每个元素,看是否是要查找的元素,这种方式当数组元素较多时,查找的效率很低
二分查找也叫折半查找,每次可以去掉一半的查找范围,从而提高查找的效率
注意事项:
有一个前提条件,数组内的元素一定要按照大小顺序,如果没有大小顺序,不可以使用二分查找
冒泡排序:
概述:
一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序
如果有n个数据进行排序,总共需要比较n-1次
每一次比较完毕,下一次的比较就会少一个数据参与
快排:
冒泡排序算法中,一次循环结束,就相当于确定了当前的最大值,也能确定最大值在数组中应存入的位置
快速排序算法中,每一次递归时以第一个数为基准数,找到数组中所有比基准数小的.再找到所有比基准数大的.小的全部放左边,大的全部放右边,确定基准数的正确位置
从右开始找比基准数小的
从左开始找比基准数大的
交换两个值的位置
红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止
基准数归位
Arrays:
Arrays.toString(int[]a):返回数组的字符串表示形式
Arrays.sort(int[]a):按照数字顺序排列指定的数组
Arrays.BinarySearch(int[] a,int key):利用二分查找返回指定的元素索引
工具类设计:
构造方法用private修饰
成员方法用静态修饰
上课笔记
API入门
API概述
应用程序接口;(简单记就是关于java中已经写好的一些类的说明书或一本关于java编写的类的字典)
API作用
程序员通过查询api可以知道如何使用java中已经提前写好的类和方法;
API版本
推荐查询1.6的,这是官方汉化的版本,权威,准确,但是如果要查询的类是1.7及以后才出现的,只能查询更新的API了;
工具类API
Math
作用
能进行数学运算
使用步骤
在lang包下,无需导包,无需创建对象,直接使用即可
常用方法
1:round 四舍五入
2:ceil 向上取整
3:floor 向下取整
Arrays
作用
为数组而生;
可以将数组中的所有元素,以字符串的形式返回给我们;
可以对数组排序;(默认是升序排列)
使用步骤
1:导包;
2:直接使用类名.方法名(数组名);
常用方法
1:转字符串: Arrays.toString(数组对象);
2:排序: Arrays.sort(数组对象);
3:二分查找 binarySearch(数据类型[] a, 数据类型 key)
Objects
作用
帮我们处理对象转字符串及判断的相关操作
使用步骤
在lang包下,无需导包,无需创建对象,直接使用即可
常用方法
toString(Object o) 将对象o转成字符串
toString(Object o, String nullDefault) 如果第一个参数不是 null ,则返回第一个参数调用 toString的结果, 否则返回第二个参数
isNull(Object obj) obj是null返回true,否则返回false
nonNull(Object obj) obj不是null返回true,否则返回false
系统API
System
作用
提供了一些静态的成员变量和静态方法
使用步骤
在lang包下,无需导包,无需创建对象,直接使用即可
常用方法
1: exit(0) 正常停止虚拟机
2:currentTimeMillis() 获取当前时间毫秒值
Object
概念
所有类的父类
常用方法
1: toString() 可以让对象转成字符串形式(规定了对象转字符串的方式);建议子类重写
2: equals() 可以比较两个对象的成员变量是否一致(规定了对象比较的规则),建议子类重写
BigDecimal
作用
精确计算
使用步骤
1:导包;
2:创建对象
3:调用方法
构造方法
BigDecimal(String val)将 字符串表示形式的数据转换为 BigDecimal对象
常用方法
add(BigDecimal augend) 加
subtract(BigDecimal subtrahend) 减
multiply(BigDecimal multiplicand) 乘
divide(BigDecimal divisor, int scale, int roundingMode) 除,按照roundingMode给定的模式保留scale位小数;
常量
ROUND_FLOOR 向下取整舍入模式
ROUND_UP 向上取整舍入模式
ROUND_HALF_UP 四舍五入舍入模式
自动拆/装箱
概念
为了方便我们使用一些属性和方法,java针对8种基本数据类型分别提供了8个对应的包装类型;
对应关系
int-->Integer,char-->Character,其他6个都是首字母大写即可
装箱
从基本数据类型变成包装数据类型就是装箱
拆箱
从包装数据类型变成基本数据类型就是拆箱
自动装箱与自动拆箱
在JDK1.5之后,java可以自动完成基本数据类型与包装数据类型的相互转换,这就是自动拆箱与自动装箱;
字符串与基本数据类型的互转
字符串转基本数据类型
包装类.parseXxx(字符串)
注意:
除了char类型之外,其他7个包装类都有parseXxx开头的方法,可以将字符串转成相应的基本数据类型;
例如:Integer类中有parseInt;
Double类中有parseDouble;
......
基本数据类型转字符串
String.valueOf(基本数据类型);
算法
递归
概述
是一种方法内部调用方法本身的行为;
使用步骤
1:定义一个方法,在方法中写业务最基本的模型;
2:在方法体中,根据不同的情况(if语句)决定是开始递归还是结束递归;,
3:main方法调用自定义方法;
注意事项
1:递归层次不能太深;
2:递归必须有出口;
冒泡排序
概述
越大的元素会经由交换慢慢“浮”到数组的顶端,故名冒泡排序;
核心思路
使用循环嵌套的方式比较相邻的元素,只要左边大于右边就交换一下位置,直到所有元素都找到自己的准确位置为止;
参考代码
public class Demo {
public static void main(String[] args) {
//任意准备一个数组
int[] arr = {4,5,3,2,1};
//按照冒泡排序的原理,我们需要将数组中相邻的两个数字进行比较,并将相对较到的数字替换到右边
for(int i=0;i<arr.length-1;i++){
for (int j = 0; j < arr.length-i-1; j++) {
//从0索引开始分别比较相邻的两个元素,
int a = arr[j];
int b = arr[j+1];
//判断是否需要替换这两个元素的位置
if(a>b){
//需要交换位置
arr[j]=b;
arr[j+1]=a;
}
}
}
//查看排序后的数组
System.out.println(Arrays.toString(arr));
}}
快速排序
概述
快速排序是对冒泡排序的优化,可以减少元素的交换次数,相当于把数组分段排列的;
核心思路
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行,以此达到整个数据变成有序序列。
参考代码
public class MyQuiteSortDemo2 {
public static void main(String[] args) {
// 1,从右开始找比基准数小的
// 2,从左开始找比基准数大的
// 3,交换两个值的位置
// 4,红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止
// 5,基准数归位
int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
quiteSort(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
private static void quiteSort(int[] arr, int left, int right) {
if(right < left){
return;
}
int left0 = left;
int right0 = right;
//计算出基准数
int baseNumber = arr[left0];
while(left != right){
// 1,从右开始找比基准数小的
while(arr[right] >= baseNumber && right > left){
right--;
}
// 2,从左开始找比基准数大的
while(arr[left] <= baseNumber && right > left){
left++;
}
// 3,交换两个值的位置
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
//基准数归位
int temp = arr[left];
arr[left] = arr[left0];
arr[left0] = temp;
quiteSort(arr,left0,left-1);
quiteSort(arr,left +1,right0);
}
}
代码实现
1.API
1.1 API概述【理解】
什么是API
API (Application Programming Interface) :应用程序编程接口
java中的API
指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。
1.2 如何使用API帮助文档【应用】
打开帮助文档
找到索引选项卡中的输入框
在输入框中输入Random
看类在哪个包下
看类的描述
看构造方法
看成员方法
2.常用API
2.1 Math(应用)
1、Math类概述
Math 包含执行基本数字运算的方法
2、Math中方法的调用方式
Math类中无构造方法,但内部的方法都是静态的,则可以通过 类名.进行调用
3、Math类的常用方法
方法名 方法名 说明 public static int abs(int a) 返回参数的绝对值 public static double ceil(double a) 返回大于或等于参数的最小double值,等于一个整数 public static double floor(double a) 返回小于或等于参数的最大double值,等于一个整数 public static int round(float a) 按照四舍五入返回最接近参数的int public static int max(int a,int b) 返回两个int值中的较大值 public static int min(int a,int b) 返回两个int值中的较小值 public static double pow (double a,double b) 返回a的b次幂的值 public static double random() 返回值为double的正值,[0.0,1.0)
2.2 System(应用)
System类的常用方法
方法名 说明 public static void exit(int status) 终止当前运行的 Java 虚拟机,非零表示异常终止 public static long currentTimeMillis() 返回当前时间(以毫秒为单位) 示例代码
需求:在控制台输出1-10000,计算这段代码执行了多少毫秒
public class SystemDemo {
public static void main(String[] args) {
// 获取开始的时间节点
long start = System.currentTimeMillis();
for (int i = 1; i <= 10000; i++) {
System.out.println(i);
}
// 获取代码运行结束后的时间节点
long end = System.currentTimeMillis();
System.out.println("共耗时:" + (end - start) + "毫秒");
}
}
2.3 Object类的toString方法(应用)
Object类概述
Object 是类层次结构的根,每个类都可以将 Object 作为超类。所有类都直接或者间接的继承自该类,换句话说,该类所具备的方法,所有类都会有一份
查看方法源码的方式
选中方法,按下Ctrl + B
重写toString方法的方式
Alt + Insert 选择toString
在类的空白区域,右键 -> Generate -> 选择toString
toString方法的作用:
以良好的格式,更方便的展示对象中的属性值
示例代码:
class Student extends 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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class ObjectDemo {
public static void main(String[] args) {
Student s = new Student();
s.setName("林青霞");
s.setAge(30);
System.out.println(s);
System.out.println(s.toString());
}
}运行结果:
Student{name='林青霞', age=30}
Student{name='林青霞', age=30}
2.4 Object类的equals方法(应用)
equals方法的作用
用于对象之间的比较,返回true和false的结果
举例:s1.equals(s2); s1和s2是两个对象
重写equals方法的场景
不希望比较对象的地址值,想要结合对象属性进行比较的时候。
重写equals方法的方式
alt + insert 选择equals() and hashCode(),IntelliJ Default,一路next,finish即可
在类的空白区域,右键 -> Generate -> 选择equals() and hashCode(),后面的同上。
示例代码:
class Student {
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;
}
@Override
public boolean equals(Object o) {
//this -- s1
//o -- s2
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o; //student -- s2
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
}
public class ObjectDemo {
public static void main(String[] args) {
Student s1 = new Student();
s1.setName("林青霞");
s1.setAge(30);
Student s2 = new Student();
s2.setName("林青霞");
s2.setAge(30);
//需求:比较两个对象的内容是否相同
System.out.println(s1.equals(s2));
}
}
面试题
// 看程序,分析结果
String s = “abc”;
StringBuilder sb = new StringBuilder(“abc”);
s.equals(sb);
sb.equals(s);
public class InterviewTest {
public static void main(String[] args) {
String s1 = "abc";
StringBuilder sb = new StringBuilder("abc");
//1.此时调用的是String类中的equals方法.
//保证参数也是字符串,否则不会比较属性值而直接返回false
//System.out.println(s1.equals(sb)); // false
//StringBuilder类中是没有重写equals方法,用的就是Object类中的.
System.out.println(sb.equals(s1)); // false
}
}
2.5 Objects (应用)
常用方法
方法名 说明 public static String toString(对象) 返回参数中对象的字符串表示形式。 public static String toString(对象, 默认字符串) 返回对象的字符串表示形式。 public static Boolean isNull(对象) 判断对象是否为空 public static Boolean nonNull(对象) 判断对象是否不为空 示例代码
学生类
class Student {
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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}测试类
public class MyObjectsDemo {
public static void main(String[] args) {
// public static String toString(对象): 返回参数中对象的字符串表示形式。
// Student s = new Student("小罗同学",50);
// String result = Objects.toString(s);
// System.out.println(result);
// System.out.println(s);
// public static String toString(对象, 默认字符串): 返回对象的字符串表示形式。如果对象为空,那么返回第二个参数.
//Student s = new Student("小花同学",23);
// Student s = null;
// String result = Objects.toString(s, "随便写一个");
// System.out.println(result);
// public static Boolean isNull(对象): 判断对象是否为空
//Student s = null;
// Student s = new Student();
// boolean result = Objects.isNull(s);
// System.out.println(result);
// public static Boolean nonNull(对象): 判断对象是否不为空
//Student s = new Student();
Student s = null;
boolean result = Objects.nonNull(s);
System.out.println(result);
}
}
2.6 BigDecimal (应用)
作用
可以用来进行精确计算
构造方法
方法名 说明 BigDecimal(double val) 参数为double BigDecimal(String val) 参数为String 常用方法
方法名 说明 public BigDecimal add(另一个BigDecimal对象) 加法 public BigDecimal subtract (另一个BigDecimal对象) 减法 public BigDecimal multiply (另一个BigDecimal对象) 乘法 public BigDecimal divide (另一个BigDecimal对象) 除法 public BigDecimal divide (另一个BigDecimal对象,精确几位,舍入模式) 除法 总结
BigDecimal是用来进行精确计算的
创建BigDecimal的对象,构造方法使用参数类型为字符串的。
四则运算中的除法,如果除不尽请使用divide的三个参数的方法。
代码示例:
BigDecimal divide = bd1.divide(参与运算的对象,小数点后精确到多少位,舍入模式);
参数1 ,表示参与运算的BigDecimal 对象。
参数2 ,表示小数点后面精确到多少位
参数3 ,舍入模式
BigDecimal.ROUND_UP 进一法
BigDecimal.ROUND_FLOOR 去尾法
BigDecimal.ROUND_HALF_UP 四舍五入
3.包装类
3.1 基本类型包装类(记忆)
基本类型包装类的作用
将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据
常用的操作之一:用于基本数据类型与字符串之间的转换
基本类型对应的包装类
基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean
3.2 Integer类(应用)
Integer类概述
包装一个对象中的原始类型 int 的值
Integer类构造方法
方法名 说明 public Integer(int value) 根据 int 值创建 Integer 对象(过时) public Integer(String s) 根据 String 值创建 Integer 对象(过时) public static Integer valueOf(int i) 返回表示指定的 int 值的 Integer 实例 public static Integer valueOf(String s) 返回一个保存指定值的 Integer 对象 String 示例代码
public class IntegerDemo {
public static void main(String[] args) {
//public Integer(int value):根据 int 值创建 Integer 对象(过时)
Integer i1 = new Integer(100);
System.out.println(i1);
//public Integer(String s):根据 String 值创建 Integer 对象(过时)
Integer i2 = new Integer("100");
// Integer i2 = new Integer("abc"); //NumberFormatException
System.out.println(i2);
System.out.println("--------");
//public static Integer valueOf(int i):返回表示指定的 int 值的 Integer 实例
Integer i3 = Integer.valueOf(100);
System.out.println(i3);
//public static Integer valueOf(String s):返回一个保存指定值的Integer对象 String
Integer i4 = Integer.valueOf("100");
System.out.println(i4);
}
}
3.3 自动拆箱和自动装箱(理解)
自动装箱
把基本数据类型转换为对应的包装类类型
自动拆箱
把包装类类型转换为对应的基本数据类型
示例代码
Integer i = 100; // 自动装箱
i += 200; // i = i + 200; i + 200 自动拆箱;i = i + 200; 是自动装箱
3.4 int和String类型的相互转换(记忆)
int转换为String
转换方式
方式一:直接在数字后加一个空字符串
方式二:通过String类静态方法valueOf()
示例代码
public class IntegerDemo {
public static void main(String[] args) {
//int --- String
int number = 100;
//方式1
String s1 = number + "";
System.out.println(s1);
//方式2
//public static String valueOf(int i)
String s2 = String.valueOf(number);
System.out.println(s2);
System.out.println("--------");
}
}
String转换为int
转换方式
方式一:先将字符串数字转成Integer,再调用valueOf()方法
方式二:通过Integer静态方法parseInt()进行转换
示例代码
public class IntegerDemo {
public static void main(String[] args) {
//String --- int
String s = "100";
//方式1:String --- Integer --- int
Integer i = Integer.valueOf(s);
//public int intValue()
int x = i.intValue();
System.out.println(x);
//方式2
//public static int parseInt(String s)
int y = Integer.parseInt(s);
System.out.println(y);
}
}
3.5 字符串数据排序案例(应用)
案例需求
有一个字符串:“91 27 46 38 50”,请写程序实现最终输出结果是:27 38 46 50 91
代码实现
public class IntegerTest {
public static void main(String[] args) {
//定义一个字符串
String s = "91 27 46 38 50";
//把字符串中的数字数据存储到一个int类型的数组中
String[] strArray = s.split(" ");
// for(int i=0; i<strArray.length; i++) {
// System.out.println(strArray[i]);
// }
//定义一个int数组,把 String[] 数组中的每一个元素存储到 int 数组中
int[] arr = new int[strArray.length];
for(int i=0; i<arr.length; i++) {
arr[i] = Integer.parseInt(strArray[i]);
}
//对 int 数组进行排序
Arrays.sort(arr);
for(int i=0; i<arr.length; i++){
System.out.print(arr[i] + " ");
}
}
4.递归
4.1 递归【应用】
递归的介绍
以编程的角度来看,递归指的是方法定义中调用方法本身的现象
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
递归的基本使用
public class MyFactorialDemo2 {
public static void main(String[] args) {
int sum = getSum(100);
System.out.println(sum);
}
private static int getSum(int i) {
//1- 100之间的和
//100 + (1-99之间的和)
// 99 + (1- 98之间的和)
//....
//1
//方法的作用: 求 1- i 之间和
if(i == 1){
return 1;
}else{
return i + getSum(i -1);
}
}
}递归的注意事项
递归一定要有出口。否则内存溢出
递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出
4.2 递归求阶乘【应用】
案例需求
用递归求5的阶乘,并把结果在控制台输出
代码实现
public class DiGuiDemo01 {
public static void main(String[] args) {
//调用方法
int result = jc(5);
//输出结果
System.out.println("5的阶乘是:" + result);
}
//定义一个方法,用于递归求阶乘,参数为一个int类型的变量
public static int jc(int n) {
//在方法内部判断该变量的值是否是1
if(n == 1) {
//是:返回1
return 1;
} else {
//不是:返回n*(n-1)!
return n*jc(n-1);
}
}
}内存图
5.数组的高级操作
5.1 二分查找 (理解)
二分查找概述
查找指定元素在数组中的位置时,以前的方式是通过遍历,逐个获取每个元素,看是否是要查找的元素,这种方式当数组元素较多时,查找的效率很低
二分查找也叫折半查找,每次可以去掉一半的查找范围,从而提高查找的效率
需求
在数组{1,2,3,4,5,6,7,8,9,10}中,查找某个元素的位置
实现步骤
定义两个变量,表示要查找的范围。默认min = 0 ,max = 最大索引
循环查找,但是min <= max
计算出mid的值
判断mid位置的元素是否为要查找的元素,如果是直接返回对应索引
如果要查找的值在mid的左半边,那么min值不变,max = mid -1.继续下次循环查找
如果要查找的值在mid的右半边,那么max值不变,min = mid + 1.继续下次循环查找
当min > max 时,表示要查找的元素在数组中不存在,返回-1.
代码实现
public class MyBinarySearchDemo {
public static void main(String[] args) {
int [] arr = {1,2,3,4,5,6,7,8,9,10};
int number = 11;
//1,我现在要干嘛? --- 二分查找
//2.我干这件事情需要什么? --- 数组 元素
//3,我干完了,要不要把结果返回调用者 --- 把索引返回给调用者
int index = binarySearchForIndex(arr,number);
System.out.println(index);
}
private static int binarySearchForIndex(int[] arr, int number) {
//1,定义查找的范围
int min = 0;
int max = arr.length - 1;
//2.循环查找 min <= max
while(min <= max){
//3.计算出中间位置 mid
int mid = (min + max) >> 1;
//mid指向的元素 > number
if(arr[mid] > number){
//表示要查找的元素在左边.
max = mid -1;
}else if(arr[mid] < number){
//mid指向的元素 < number
//表示要查找的元素在右边.
min = mid + 1;
}else{
//mid指向的元素 == number
return mid;
}
}
//如果min大于了max就表示元素不存在,返回-1.
return -1;
}
}注意事项
有一个前提条件,数组内的元素一定要按照大小顺序排列,如果没有大小顺序,是不能使用二分查找法的
5.2 冒泡排序 (理解)
冒泡排序概述
一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序
如果有n个数据进行排序,总共需要比较n-1次
每一次比较完毕,下一次的比较就会少一个数据参与
代码实现
public class MyBubbleSortDemo2 {
public static void main(String[] args) {
int[] arr = {3, 5, 2, 1, 4};
//1 2 3 4 5
bubbleSort(arr);
} private static void bubbleSort(int[] arr) {
//外层循环控制的是次数 比数组的长度少一次.
for (int i = 0; i < arr.length -1; i++) {
//内存循环就是实际循环比较的
//-1 是为了让数组不要越界
//-i 每一轮结束之后,我们就会少比一个数字.
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;
}
}
} printArr(arr);
} private static void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
} }
5.3 快速排序 (理解)
快速排序概述
冒泡排序算法中,一次循环结束,就相当于确定了当前的最大值,也能确定最大值在数组中应存入的位置
快速排序算法中,每一次递归时以第一个数为基准数,找到数组中所有比基准数小的.再找到所有比基准数大的.小的全部放左边,大的全部放右边,确定基准数的正确位置
核心步骤
从右开始找比基准数小的
从左开始找比基准数大的
交换两个值的位置
红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止
基准数归位
代码实现
public class MyQuiteSortDemo2 {
public static void main(String[] args) {
// 1,从右开始找比基准数小的
// 2,从左开始找比基准数大的
// 3,交换两个值的位置
// 4,红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止
// 5,基准数归位
int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8}; quiteSort(arr,0,arr.length-1); for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
} private static void quiteSort(int[] arr, int left, int right) {
// 递归结束的条件
if(right < left){
return;
} int left0 = left;
int right0 = right; //计算出基准数
int baseNumber = arr[left0]; while(left != right){
// 1,从右开始找比基准数小的
while(arr[right] >= baseNumber && right > left){
right--;
}
// 2,从左开始找比基准数大的
while(arr[left] <= baseNumber && right > left){
left++;
}
// 3,交换两个值的位置
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
//基准数归位
int temp = arr[left];
arr[left] = arr[left0];
arr[left0] = temp; // 递归调用自己,将左半部分排好序
quiteSort(arr,left0,left-1);
// 递归调用自己,将右半部分排好序
quiteSort(arr,left +1,right0); }
}
5.4 Arrays (应用)
Arrays的常用方法
方法名 说明 public static String toString(int[] a) 返回指定数组的内容的字符串表示形式 public static void sort(int[] a) 按照数字顺序排列指定的数组 public static int binarySearch(int[] a, int key) 利用二分查找返回指定元素的索引 示例代码
public class MyArraysDemo {
public static void main(String[] args) {
// public static String toString(int[] a) 返回指定数组的内容的字符串表示形式
// int [] arr = {3,2,4,6,7};
// System.out.println(Arrays.toString(arr)); // public static void sort(int[] a) 按照数字顺序排列指定的数组
// int [] arr = {3,2,4,6,7};
// Arrays.sort(arr);
// System.out.println(Arrays.toString(arr)); // public static int binarySearch(int[] a, int key) 利用二分查找返回指定元素的索引
int [] arr = {1,2,3,4,5,6,7,8,9,10};
int index = Arrays.binarySearch(arr, 0);
System.out.println(index);
//1,数组必须有序
//2.如果要查找的元素存在,那么返回的是这个元素实际的索引
//3.如果要查找的元素不存在,那么返回的是 (-插入点-1)
//插入点:如果这个元素在数组中,他应该在哪个索引上.
}
}工具类设计思想
构造方法用 private 修饰
成员用 public static 修饰
课后作业
编程题【Math类】
请编程进行以下运算: 请计算3的5次幂 请计算3.2向上取整的结果 请计算3.8向下取整的结果 请计算5.6四舍五入取整的结果
参考答案:
class cs {
public static void main(String[] args) {
double pow = Math.pow(3, 5);
System.out.println(pow);//243.0
String s1="4.0";//向上
String s2="3.8";//向下
String s3="5.6";//四舍五入取整
BigDecimal bd1=new BigDecimal(s1);
double b1 = bd1.setScale(1, BigDecimal.ROUND_UP).doubleValue();
System.out.println(bd1);//4.0
BigDecimal bd2=new BigDecimal(s2);
double b2 = bd2.setScale(0, BigDecimal.ROUND_FLOOR).doubleValue();
System.out.println(b2);
BigDecimal bd3=new BigDecimal(s3);
int b3=bd3.setScale(0,BigDecimal.ROUND_HALF_UP).intValue();
System.out.println(b3);
}
}
运行结果:
编程题【System类】
请定义一个集合,并将1至1千万这1千万个数字添加到集合中,计算这个行为运行的时间,并打印。
参考答案:
class cs {
public static void main(String[] args) {
long qi = System.currentTimeMillis();
ArrayList list=new ArrayList();
for (int i = 0; i < 10000000; i++) {
list.add(i);
}
long end = System.currentTimeMillis();
System.out.println("向集合中添加一千万个数字需要时间"+(end-qi)+"毫秒");
}
}
运行结果:
(注意:每个人的电脑性能不一样,所以打印结果不一样也很正常!!!)
编程题【BigDecimal类】
求以下double数组的平均值(四舍五入保留两位小数):
double[] arr = {0.1,0.2,2.1,3.2,5.56,7.21};
参考答案:
class Demo {
public static void main(String[] args) {
double[] arr = {0.1,0.2,2.1,3.2,5.56,7.21};
double sum=0;
for (int i = 0; i < arr.length; i++) {
sum+=arr[i];
}
double avg=sum/arr.length;
BigDecimal b=new BigDecimal(avg);
double v = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(v);
}
}
运行结果:
问答题【包装类】
1 请写出八种基本类型和它们对应的包装类的名字
int->Integer
char->Character
double->Double
byte->Byte
short->Short
long->Long
float->Float
boolean->Boolean
2 请问什么是自动装箱和自动拆箱?
自动装箱:
把基本数据类型转换为对应的包装类型
自动拆箱:
吧包装类型转换为对应的基本数据类型
3:编程题【包装类】
在一行中通过键盘输入自己的年龄和身高(要带小数),年龄和身高中间使用逗号分隔,请利用今天的技术和字符串的切分方法,将键盘输入的数据转成整数和小数;
参考答案:
class Demo {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入身高年龄(以逗号分割):");
String s=sc.next();
String[] split = s.split(",");
double shengao = Double.parseDouble(split[0]);
System.out.println("身高为:"+shengao);
int age = Integer.parseInt(split[1]);
System.out.println("年龄为:"+age);
}
}
运行结果:
编程题【Arrays】
已知数组如下: int[] arr = {431,54,25,25,26,45,2,4,65,3,64,6,46,7,54}; 1:使用Arrays对数组元素进行排序并打印排序后的结果; 2:使用二分法查找元素:2,并打印查询结果; 3:使用二分法查找200,并打印查找结果;
参考答案:
class Demo {
public static void main(String[] args) {
int[] arr = {431, 54, 25, 25, 26, 45, 2, 4, 65, 3, 64, 6, 46, 7, 54};
Arrays.sort(arr);
int num = 200;
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
int i = Arrays.binarySearch(arr, num);
System.out.println("200在数组中的位置为:" + i);
}
}
运行结果:
编程题【递归】
请使用递归计算从1到100之间的所有数之和。
参考答案:
class Demo {
public static void main(String[] args) {
int sum=getSum(100);
System.out.println(sum);
}
private static int getSum(int i) {
if (i==1){
return 1;
}else {
return i+getSum(i-1);
}
}
}
运行结果:
Java基础进阶:APi使用,Math,Arrarys,Objects工具类,自动拆装箱,字符串与基本数据类型互转,递归算法源码,冒泡排序源码实现,快排实现源码,附重难点,代码实现源码,课堂笔记,课后扩展及答案的更多相关文章
- Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案
内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...
- Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案
多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...
- Java基础进阶:继承重点摘要,继承详解,方法重写注意事项,方法重载与重写的区别,抽象类,代码块, 附重难点,代码实现源码,课堂笔记,课后扩展及答案
继承重点摘要 *继承的特点: 子类在初始化之前,一定要先完成父类数据的初始化 子类在初始化之前,一定要先访问父类构造,完成父类数据的初始化 系统在每一个构造方法中默认隐藏了一句super(); 如果我 ...
- Java基础进阶:学生管理系统数组方式分包源码实现,教师管理系统集合和数组两种方式源码实现,图书馆管理系统源码实现,现附重难点,代码实现源码,课堂笔记,课后扩展及答案
1.案例驱动模式 1.1案例驱动模式概述 (理解) 通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题 1.2案例驱动模式的好处 (理解) 解决重复代码 ...
- 黑马程序员_Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项
------- android培训.java培训.期待与您交流! ---------- 首先来看一段代码: Integer x = new Integer(4); Integer y = 4; 在JD ...
- Java基础学习总结(49)——Excel导入导出工具类
在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...
- Java基础进阶
Java基础进阶J Object类 hashcode() toString() clone() getClass() notify() wait() equals() Random类 生成 随机数 U ...
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...
- Java基础进阶类名整理
类名综合 数学类: Math:数学运算 BigDecimal:用于精确计算数据 数组工具类: Arrays:数组工具类,用于对数组的操作 时间操作: JDK8以前: Date:表示一个时间,并面向对象 ...
随机推荐
- 【ubuntu】搭建mysql5.7
一.安装mysql (一) 安装mysql 注意别安装8,8配置太高了 $: sudo apt-get install mysql-server or $: sudo apt-get install ...
- leetcode137. 只出现一次的数字 II
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素.说明:你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗?示例 1:输入: [2,2 ...
- 开源认证和访问控制的利器keycloak使用简介
目录 简介 安装keycloak 创建admin用户 创建realm和普通用户 使用keycloak来保护你的应用程序 安装WildFly client adapter 注册WildFly应用程序 安 ...
- 解决-Chrome插件安装时程序包无效:"CRX_HEADER_INVALID"
最近安装新的谷歌插件出现 :程序包无效:"CRX_HEADER_INVALID" 原因如下: 在地址栏输入chrome://settings/help 如果,你的 Chrome 浏 ...
- jmeter多用户登录并发测试
在使用Jmeter进行性能测试时,我们通常会需要配置多个不同用户进行并发测试,这里简单介绍一下配置方法. 1.运行Jmeter.bat, 在打开的测试计划中右键添加一个线程组: 2.在线程组下添加录 ...
- mybatis-plus使用记录
如何and和or: QuoteSalaryEnum salaryMax = QuoteSalaryEnum.of(memberObjectInfo.getQuoteSalaryMax()); Quot ...
- ubuntu 安装scapy
官网下载最新安装包:https://scapy.net/ 下载之后进入相应文件夹解压: 然后进入相关文件夹启动setup.py: 成功:
- 关于 [栈溢出后jmp esp执行shellcode] 原理分析
原文地址:https://blog.csdn.net/lixiangminghate/article/details/53333710 正常情况下,函数栈分布图如下: 即,返回地址被改为一段缓存区的地 ...
- C++编程指南续
三. 命名规则 比较著名的命名规则当推Microsoft公司的"匈牙利"法,该命名规则的主要思想是"在变量和函数名中加入前缀以增进人们对程序的理解".例如所有的 ...
- LeetCode初级算法之字符串:7 整数反转
整数反转 题目地址:https://leetcode-cn.com/problems/reverse-integer/ 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 ...