大数据—Java数组及面向对象
1 package com.atguigu.homework; 2 3 /** 4 * 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,和值, 5 * 平均值,并输出出来。 6 * 要求:所有随机数都是两位数。 7 * <p> 8 * 提示:如何获取指定范围的随机数[10,99] 9 * (int)(Math.random() * 90 + 10) 10 * 11 * @author shkstart 12 * @create 2020-06-30 9:00 13 */ 14 public class Exer02 { 15 public static void main(String[] args) { 16 //1. 创建数组,并按照要求给数组元素赋值 17 int[] arr = new int[10]; 18 19 for (int i = 0; i < arr.length; i++) { 20 arr[i] = (int) (Math.random() * 90) + 10; 21 22 } 23 System.out.print("获得的随机数为:"); 24 for (int i = 0; i < arr.length; i++) { 25 System.out.print(arr[i] + " "); 26 } 27 System.out.println(); 28 29 //2. 计算数组中的特征值 30 int sum = 0; 31 int max = 0; 32 int mix = 100; 33 double ave; 34 for (int i = 0; i < arr.length; i++) { 35 sum += arr[i];//计算总和 36 } 37 38 for (int i = 0; i < arr.length; i++) { 39 if (arr[i] > max) //判断最大值 40 max = arr[i]; 41 } 42 43 for (int i = 0; i < arr.length; i++) { 44 if (arr[i] < mix) //判断最小值 45 mix = arr[i]; 46 } 47 48 ave = (double)sum / arr.length; 49 50 System.out.println("最大值" + max); 51 System.out.println("最小值" + mix); 52 System.out.println("所有数的和" + sum); 53 System.out.println("平均值" + ave); 54 55 } 56 }
1 public class ArrayTest { 2 public static void main(String[] args) { 3 int[] array1 = new int[]{2, 3, 5, 7, 11, 13, 17, 19}; 4 //数组的复制 5 int[] array2 = new int[array1.length]; 6 for (int i = 0; i < array1.length; i++) { 7 array2[i] = array1[i]; 8 } 9 10 //数组的反转 11 //方式一: 12 // for(int i = 0;i < array1.length / 2;i++){ // i array1.length - 1 - i 13 // int temp = array1[i]; 14 // array1[i] = array1[array1.length - 1 - i]; 15 // array1[array1.length - 1 - i] = temp; 16 // } 17 //方式二: 18 for(int x = 0,y = array1.length - 1;x < y;x++,y--){ 19 int temp = array1[x]; 20 array1[x] = array1[y]; 21 array1[y] = temp; 22 } 23 24 //数组的遍历 25 for (int i = 0; i < array1.length; i++) { 26 System.out.print(array1[i] + " "); 27 } 28 29 //线性查找 30 int[] array3 = new int[]{2, 3, 5, 7, -11, 13, 0, 17, 19,0}; 31 int value = 0;//查找的目标数据 32 boolean flag = true;//定义一个是否找到了指定数据的标识 33 for(int i = 10;i < array3.length;i++){ 34 if(value == array3[i]){ 35 System.out.println("在索引为" + i + "的位置上找到了指定的元素"); 36 flag = false; 37 break; 38 } 39 } 40 if(flag){ 41 System.out.println("未找到指定的元素"); 42 } 43 44 //二分法查找:要求此数组必须是有序的。 45 int[] arr3 = new int[]{-99,-54,-2,0,2,33,43,256,999}; 46 boolean isFlag = true; 47 int number = 256; 48 number = 25; 49 int head = 0;//首索引位置 50 int end = arr3.length - 1;//尾索引位置 51 while(head <= end){ 52 int middle = (head + end) / 2; 53 if(arr3[middle] == number){ 54 System.out.println("找到指定的元素,索引为:" + middle); 55 isFlag = false; 56 break; 57 }else if(arr3[middle] > number){ 58 end = middle - 1; 59 }else{//arr3[middle] < number 60 head = middle + 1; 61 } 62 } 63 64 if(isFlag){ 65 System.out.println("未找打指定的元素"); 66 } 67 68 } 69 }
选择排序
直接选择排序、堆排序
交换排序
冒泡排序、快速排序
插入排序
直接插入排序、折半插入排序、Shell排序
归并排序
桶式排序
基数排序

会手写冒泡排序
1 public class BubbleSortTest { 2 public static void main(String[] args) { 3 4 int[] arr = new int[]{34,76,-8,0,56,-45,6,21}; 5 6 for(int i = 0;i < arr.length - 1;i++){ 7 8 for(int j = 0;j < arr.length - 1 - i;j++){ 9 if(arr[j] > arr[j + 1]){ 10 int temp = arr[j]; 11 arr[j] = arr[j + 1]; 12 arr[j + 1] = temp; 13 } 14 } 15 16 } 17 18 for (int i = 0; i < arr.length; i++) { 19 System.out.print(arr[i] + " "); 20 21 } 22 } 23 }
掌握快排的实现原理

1 package com.atguigu.java; 2 3 import java.util.Arrays; 4 5 /** 6 * 7 * Arrays工具类的使用测试 8 * @author shkstart 9 * @create 2020-06-30 11:14 10 */ 11 public class ArraysTest { 12 public static void main(String[] args) { 13 14 int[] arr1 = new int[]{1,2,3,4,5}; 15 int[] arr2 = new int[]{1,2,3,4,5}; 16 // == : 比较两个数组的地址值是否相同。即:比较两个引用是否指向堆空间中的同一个数组 17 System.out.println(arr1 == arr2);//false 18 //equals():比较两个数组的内容是否相等。 19 System.out.println(Arrays.equals(arr1,arr2));//true 20 21 //toString():输出数组的元素信息 22 System.out.println(Arrays.toString(arr1)); 23 24 //fill():将指定的值填充到数组中的所有位置上 25 Arrays.fill(arr1,10); 26 System.out.println(Arrays.toString(arr1)); 27 28 int[] arr3 = new int[]{34,76,-8,0,56,-45,6,21}; 29 System.out.println(Arrays.toString(arr3)); 30 //sort():排序 31 // Arrays.sort(arr3); 32 System.out.println(Arrays.toString(arr3)); 33 //binarySearch():对排序后的数组进行二分法检索指定的值。 34 //如果找到了,返回找到的元素所对应索引位置。 35 //如果没找到,返回负数。 36 int index = Arrays.binarySearch(arr3, 76); 37 if(index >= 0){ 38 System.out.println("找到了指定元素。位置为:" + index); 39 }else{ 40 System.out.println("没找到指定元素"); 41 } 42 } 43 }
1 package com.atguigu.java; 2 3 /** 4 * 数组中的常见异常: 5 * 1. ArrayIndexOutOfBoundsException:数组角标越界异常 6 * 2. NullPointerException:空指针异常 7 * 8 * 9 * @author shkstart 10 * @create 2020-06-30 11:26 11 */ 12 public class ArrayExceptionTest { 13 14 public static void main(String[] args) { 15 //1. ArrayIndexOutOfBoundsException:数组角标越界异常 16 int[] arr = new int[10];//角标范围:0,1,2,。。。,9 17 // System.out.println(arr[10]);//报错 18 19 // System.out.println(arr[-1]);//报错 20 21 //2. NullPointerException:空指针异常 22 //情况一: 23 String[][] arr2 = new String[5][]; 24 // System.out.println(arr2[0][0]); 25 26 //情况二: 27 int[] arr3 = new int[10]; 28 // arr3 = null; 29 System.out.println(arr3[0]); 30 31 //情况三:通过对象调用内部的方法时,如果此对象是null,则空指针异常 32 String[] arr4 = new String[10]; 33 System.out.println(arr4[0].toString()); 34 35 } 36 }
1. 面向过程 vs 面向对象
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。

面向对象中的两大核心概念
* 1. 类(class):对一类事物的描述,是抽象的、概念上的定义。
* 2. 对象(object\instance):由类派生(new)出的一个个的实体。

面向对象编程的学习三条主线:
* 1. 类及类中的成员:属性、方法、构造器;内部类、代码块
* 2. 面向对象的三个特征:封装、继承、多态、(抽象)
* 3. 其它关键字的使用:this\super\import\package\static\final\abstract\interface\....
说明:
类的内部成员:
* 属性 = 成员变量 = field
* 方法 = 成员方法 = (成员)函数 = method
* 1. 设计类,就是设计类的内部成员。。
*
* 2. 设计类、创建对象、调用功能的步骤:
* 第1步:创建类(实际上,就是创建类的成员:属性、方法)
* 第2步:创建类的对象 (或 创建类的实例、类的实例化)
* 第3步:通过"对象.属性"或"对象.方法"的方式,调用对象的内部结构
代码说明
1 public class PhoneTest { //测试类 2 public static void main(String[] args) { 3 //数据类型 变量名 = 变量值 4 Scanner scan = new Scanner(System.in); 5 // int number = scan.nextInt(); 6 7 //创建Phone类的对象 8 Phone iphone = new Phone(); 9 10 //通过"对象.属性"或"对象.方法"的方式,调用对象的内部结构 11 iphone.name = "苹果手机"; 12 iphone.price = 8999; 13 14 System.out.println("name:" + iphone.name + ", price:" + iphone.price); 15 16 iphone.call(); 17 iphone.sendMessage("有内鬼,停止交易!"); 18 String info = iphone.takePhoto(); 19 System.out.println(info); 20 21 //################## 22 Phone iphone1 = new Phone(); 23 iphone1.name = "华为P40 pro"; 24 iphone1.price = 4999; 25 System.out.println("name:" + iphone1.name + ", price:" + iphone1.price); 26 System.out.println("name:" + iphone.name + ", price:" + iphone.price); 27 28 //################## 29 Phone iphone2 = iphone; 30 iphone2.price = 6999; 31 32 System.out.println("name:" + iphone.name + ", price:" + iphone.price); 33 34 //############## 35 iphone.sendMessage("你好!很高兴认识你"); 36 } 37 } 38 39 40 class Phone{ 41 //1. 设计属性 42 String name;//手机名称 43 int price;//价格 44 45 //2. 设计方法 46 public void call(){ 47 System.out.println("手机可以拨打电话"); 48 } 49 public void sendMessage(String message){ 50 System.out.println("发送信息:" + message); 51 } 52 53 public String takePhoto(){ 54 //System.out.println("拍照"); 55 return "拍照成功"; 56 } 57 }
内存解析:

如果创建了类的多个对象,则每个对象拥有一套类的属性。当我们修改其中一个对象的属性时,不影响其它对象
* 此属性的值。
*
* 如果将对象引用p1赋给新的变量p2,则p1和p2就共同指向了堆空间中唯一的一个对象实体。当我们通过其中一个引用
* 修改对象的属性的话,则会导致另外引用对同一个属性的值的调用。
测试类中属性的定义
*
* 1. 回顾:变量的分类
* ① 按照数据类型来分: 基本数据类型(8种) vs 引用数据类型(类、数组、接口)
*
* ② 按照类中声明的位置: 成员变量(或属性) vs 局部变量
* 说明:成员变量:在类中直接定义的变量
* 局部变量:在方法内、构造器内、代码块内等定义的变量
*
* 2. 成员变量(或属性) vs 局部变量
* 相同点:
* 1. 变量声明的格式相同:数据类型 变量名 = 变量值
* 2. 凡是变量,都需要先声明,后使用
* 3. 都有其作用域。超出作用域,不可调用
*
* 不同点:
* 1. 声明位置的不同。
* > 成员变量:在类中直接定义的变量
* > 局部变量:在方法内、构造器内、代码块内等定义的变量
* 2. 是否可以使用权限修饰符进行修饰。
* > 权限修饰符有:private \ 缺省 \ protected \ public
* > 成员变量可以使用权限修饰符进行修饰 ;
* 局部变量不可以使用权限修饰符进行修饰
* > 暂时,我们在定义成员变量时,大家都使用缺省即可。(讲封装性时再说)
* 3. 是否有默认初始化值的情况
* > 成员变量都有默认初始化值
* ① 如果成员变量是整型(byte\short\int\long),则默认值为:0
* ② 如果成员变量是浮点型(float \ double),则默认值为:0.0
* ③ 如果成员变量是boolean型,则默认值为:false
* ④ 如果成员变量是char型,则默认值为:0 或 '\u0000'
* ⑤ 如果成员变量是引用数据类型,则默认值为:null
*
* > 局部变量都没有默认初始化值。则意味着在调用局部变量之前,一定要显式的赋值。
*
* 4. 在内存中存储的位置不同
* >成员变量存储在堆空间中
* >局部变量存储在栈空间中
*
* @author shkstart
* @create 2020-06-30 16:19
*/
代码演示:
1 public class PersonTest { 2 public static void main(String[] args) { 3 Person p1 = new Person(); 4 5 System.out.println(p1.name +"," + p1.age + "," + p1.gender); 6 7 p1.sleep(); 8 p1.eat("湖南臭豆腐"); 9 10 Person p2 = new Person(); 11 System.out.println(p2.age); 12 } 13 } 14 15 class Person{ 16 //声明成员变量(属性) 17 String name; 18 int age = 1; 19 boolean gender;//性别 20 21 public void sleep(){ 22 int hour = 6; //局部变量 23 System.out.println("人每天应该至少保证" + hour + "小时的睡眠"); 24 } 25 26 public void eat(String food){//food:局部变量 27 System.out.println("我喜欢吃:" + food); 28 } 29 30 }

浙公网安备 33010602011771号