JavaSE06笔记

    技术2022-07-10  109

    06笔记

    知识点1:数组中的常见算法

    1. 数组元素的赋值

    比如:杨辉三角、回形数、随机生成彩票

    2. 求数值型数组中元素的最大值、最小值、平均数、总和等

    package com.atguigu.homework; /** * 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,和值, * 平均值,并输出出来。 * 要求:所有随机数都是两位数。 * <p> * 提示:如何获取指定范围的随机数[10,99] * (int)(Math.random() * 90 + 10) * * @author shkstart * @create 2020-06-30 9:00 */ public class Exer02 { public static void main(String[] args) { //1. 创建数组,并按照要求给数组元素赋值 int[] arr = new int[10]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) (Math.random() * 90) + 10; } System.out.print("获得的随机数为:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); //2. 计算数组中的特征值 int sum = 0; int max = 0; int mix = 100; double ave; for (int i = 0; i < arr.length; i++) { sum += arr[i];//计算总和 } for (int i = 0; i < arr.length; i++) { if (arr[i] > max) //判断最大值 max = arr[i]; } for (int i = 0; i < arr.length; i++) { if (arr[i] < mix) //判断最小值 mix = arr[i]; } ave = (double)sum / arr.length; System.out.println("最大值" + max); System.out.println("最小值" + mix); System.out.println("所有数的和" + sum); System.out.println("平均值" + ave); } }

    3.数组的复制、反转、查找(线性查找、二分法查找)

    public class ArrayTest { public static void main(String[] args) { int[] array1 = new int[]{2, 3, 5, 7, 11, 13, 17, 19}; //数组的复制 int[] array2 = new int[array1.length]; for (int i = 0; i < array1.length; i++) { array2[i] = array1[i]; } //数组的反转 //方式一: // for(int i = 0;i < array1.length / 2;i++){ // i array1.length - 1 - i // int temp = array1[i]; // array1[i] = array1[array1.length - 1 - i]; // array1[array1.length - 1 - i] = temp; // } //方式二: for(int x = 0,y = array1.length - 1;x < y;x++,y--){ int temp = array1[x]; array1[x] = array1[y]; array1[y] = temp; } //数组的遍历 for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + " "); } //线性查找 int[] array3 = new int[]{2, 3, 5, 7, -11, 13, 0, 17, 19,0}; int value = 0;//查找的目标数据 boolean flag = true;//定义一个是否找到了指定数据的标识 for(int i = 10;i < array3.length;i++){ if(value == array3[i]){ System.out.println("在索引为" + i + "的位置上找到了指定的元素"); flag = false; break; } } if(flag){ System.out.println("未找到指定的元素"); } //二分法查找:要求此数组必须是有序的。 int[] arr3 = new int[]{-99,-54,-2,0,2,33,43,256,999}; boolean isFlag = true; int number = 256; number = 25; int head = 0;//首索引位置 int end = arr3.length - 1;//尾索引位置 while(head <= end){ int middle = (head + end) / 2; if(arr3[middle] == number){ System.out.println("找到指定的元素,索引为:" + middle); isFlag = false; break; }else if(arr3[middle] > number){ end = middle - 1; }else{//arr3[middle] < number head = middle + 1; } } if(isFlag){ System.out.println("未找打指定的元素"); } } }

    4.数组元素的排序算法

    十大排序算法 选择排序 直接选择排序、堆排序 交换排序 冒泡排序、快速排序 插入排序 直接插入排序、折半插入排序、Shell排序 归并排序 桶式排序 基数排序

    会手写冒泡排序 public class BubbleSortTest { public static void main(String[] args) { int[] arr = new int[]{34,76,-8,0,56,-45,6,21}; for(int i = 0;i < arr.length - 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; } } } for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } } 掌握快排的实现原理

    知识点2:Arrays工具类的使用

    java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。

    package com.atguigu.java; import java.util.Arrays; /** * * Arrays工具类的使用测试 * @author shkstart * @create 2020-06-30 11:14 */ public class ArraysTest { public static void main(String[] args) { int[] arr1 = new int[]{1,2,3,4,5}; int[] arr2 = new int[]{1,2,3,4,5}; // == : 比较两个数组的地址值是否相同。即:比较两个引用是否指向堆空间中的同一个数组 System.out.println(arr1 == arr2);//false //equals():比较两个数组的内容是否相等。 System.out.println(Arrays.equals(arr1,arr2));//true //toString():输出数组的元素信息 System.out.println(Arrays.toString(arr1)); //fill():将指定的值填充到数组中的所有位置上 Arrays.fill(arr1,10); System.out.println(Arrays.toString(arr1)); int[] arr3 = new int[]{34,76,-8,0,56,-45,6,21}; System.out.println(Arrays.toString(arr3)); //sort():排序 // Arrays.sort(arr3); System.out.println(Arrays.toString(arr3)); //binarySearch():对排序后的数组进行二分法检索指定的值。 //如果找到了,返回找到的元素所对应索引位置。 //如果没找到,返回负数。 int index = Arrays.binarySearch(arr3, 76); if(index >= 0){ System.out.println("找到了指定元素。位置为:" + index); }else{ System.out.println("没找到指定元素"); } } }

    知识点3:数组中的常见异常

    package com.atguigu.java; /** * 数组中的常见异常: * 1. ArrayIndexOutOfBoundsException:数组角标越界异常 * 2. NullPointerException:空指针异常 * * * @author shkstart * @create 2020-06-30 11:26 */ public class ArrayExceptionTest { public static void main(String[] args) { //1. ArrayIndexOutOfBoundsException:数组角标越界异常 int[] arr = new int[10];//角标范围:0,1,2,。。。,9 // System.out.println(arr[10]);//报错 // System.out.println(arr[-1]);//报错 //2. NullPointerException:空指针异常 //情况一: String[][] arr2 = new String[5][]; // System.out.println(arr2[0][0]); //情况二: int[] arr3 = new int[10]; // arr3 = null; System.out.println(arr3[0]); //情况三:通过对象调用内部的方法时,如果此对象是null,则空指针异常 String[] arr4 = new String[10]; System.out.println(arr4[0].toString()); } }

    知识点4:面向对象的理解

    1. 面向过程 vs 面向对象

    二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。

    2. 类与对象的理解

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

    3. 学习的三条主线

    面向对象编程的学习三条主线: * 1. 类及类中的成员:属性、方法、构造器;内部类、代码块 * 2. 面向对象的三个特征:封装、继承、多态、(抽象) * 3. 其它关键字的使用:this\super\import\package\static\final\abstract\interface\....

    说明:

    类的内部成员: * 属性 = 成员变量 = field * 方法 = 成员方法 = (成员)函数 = method

    知识点5:类及对象的创建过程

    * 1. 设计类,就是设计类的内部成员。。 * * 2. 设计类、创建对象、调用功能的步骤: * 第1步:创建类(实际上,就是创建类的成员:属性、方法) * 第2步:创建类的对象 (或 创建类的实例、类的实例化) * 第3步:通过"对象.属性"或"对象.方法"的方式,调用对象的内部结构 代码说明 public class PhoneTest { //测试类 public static void main(String[] args) { //数据类型 变量名 = 变量值 Scanner scan = new Scanner(System.in); // int number = scan.nextInt(); //创建Phone类的对象 Phone iphone = new Phone(); //通过"对象.属性"或"对象.方法"的方式,调用对象的内部结构 iphone.name = "苹果手机"; iphone.price = 8999; System.out.println("name:" + iphone.name + ", price:" + iphone.price); iphone.call(); iphone.sendMessage("有内鬼,停止交易!"); String info = iphone.takePhoto(); System.out.println(info); //################## Phone iphone1 = new Phone(); iphone1.name = "华为P40 pro"; iphone1.price = 4999; System.out.println("name:" + iphone1.name + ", price:" + iphone1.price); System.out.println("name:" + iphone.name + ", price:" + iphone.price); //################## Phone iphone2 = iphone; iphone2.price = 6999; System.out.println("name:" + iphone.name + ", price:" + iphone.price); //############## iphone.sendMessage("你好!很高兴认识你"); } } class Phone{ //1. 设计属性 String name;//手机名称 int price;//价格 //2. 设计方法 public void call(){ System.out.println("手机可以拨打电话"); } public void sendMessage(String message){ System.out.println("发送信息:" + message); } public String takePhoto(){ //System.out.println("拍照"); return "拍照成功"; } }

    内存解析:

    如果创建了类的多个对象,则每个对象拥有一套类的属性。当我们修改其中一个对象的属性时,不影响其它对象 * 此属性的值。 * * 如果将对象引用p1赋给新的变量p2,则p1和p2就共同指向了堆空间中唯一的一个对象实体。当我们通过其中一个引用 * 修改对象的属性的话,则会导致另外引用对同一个属性的值的调用。

    知识点6:成员变量vs局部变量

    测试类中属性的定义 * * 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 */ 代码演示 public class PersonTest { public static void main(String[] args) { Person p1 = new Person(); System.out.println(p1.name +"," + p1.age + "," + p1.gender); p1.sleep(); p1.eat("湖南臭豆腐"); Person p2 = new Person(); System.out.println(p2.age); } } class Person{ //声明成员变量(属性) String name; int age = 1; boolean gender;//性别 public void sleep(){ int hour = 6; //局部变量 System.out.println("人每天应该至少保证" + hour + "小时的睡眠"); } public void eat(String food){//food:局部变量 System.out.println("我喜欢吃:" + food); } }
    Processed: 0.022, SQL: 9