【JavaLearn】 # (1) JavaSE查漏补缺

1. Java跨平台原理

概述说明
Java最大的优点就是跨平台(一次编译,到处运行),主要是指字节码文件可以在任何(具有Java虚拟机的)计算机或者电子设备上运行。
Java的执行过程:
运行原理
1. Java程序的运行要经过:编辑、编译、解释并执行
2. Java源代码经过编译后生成字节码文件(.class),字节码文件与平台无关,只面向虚拟机
3. 字节码文件需要通过Java虚拟机(JVM)再解释成 相应平台的机器码 并运行。Java虚拟机是可运行Java字节码文件的虚拟计算机。Java虚拟机中的解释器负责将字节码文件解释成特定的机器码进行运行。Java虚拟机本身并不跨平台,但它们提供了相同的接口。
Java具有一次编译,到处运行的特定特点。是说编译后的.class文件可以跨平台运行。
扩展
C语言也可以实现跨平台:多次编译,多次运行。C语言的性能高于Java

2. &和&&的区别和联系

概述说明
& 和 && 都是双目运算符,无论使用哪个运算符,对最终的运算结果都没有影响。两个操作数都为 true ,结果才为true
1. & 称为逻辑与运算符, && 称为短路与运算符
对于 & :无论任何情况,两边的操作数都会参与运算
对于 && : 当左边的操作数为 false时,右边的操作数将不参与运算,最终结果为 false
2. & 还可以用作位运算符,当 & 两边操作数不是 boolean 类型,而是整数类型时,& 将用于按位与操作符的操作。 5 & 6 结果为 4
推荐平时多使用 && ,因为它的效率高。
扩展
1. | 和 || 的区别和联系类似。
2. 8 << 1 结果为 16,每左移一位,相当与乘以2,使用位运算,速度快。
3. 面试题:使用最快的方式计算 2 * 8 ==》 2 << 3

3. switch 条件变量的取值类型

概述说明
switch 是 Java 中的多重分支语句,只能进行等值运算,不能进行区间判断。
条件变量的取值范围是4种可以:
1. 整数类型中的 byte、short、int
2. 字符类型的 char
3. JDK 1.5 之后增加了 enum 枚举类型
4. JDK 1.7 之后增加了 String 类型
4种不可以:long、Boolean、float、double不能使用
扩展
switch 中用到了 break 关键字,用来跳出switch语句。
还使用了 default 关键字,该关键字还可以使用在接口中,用来表示在 JDK8 之后接口中定义的非抽象但是可以被实现类重写的方法

4. 数组相关

4.1 定义数组

数据类型[] 数组名 = new 数据类型[容量];
  1. 数据类型:确定数据类型之后,整个数组中保存的数据类型***无法修改***
  2. 数组名:是一个【引用数据类型】
  3. new:申请【XX】内存空间,并且***清空整个内存空间中所有二进制位***,所有的二进制位都是0

4.2 数组内存分析

中存放数据,中存放数组名 (也是一个【引用数据类型】的变量)

在这里插入图片描述

当前数组的属性length是要占用一定的数组空间的,属于数组中的内容,这就是为什么数组中占用的空间要比存储数据计算空间略大一些

4.3 数组查找操作

定义一个长度为 10 的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组中是否包含这个单词,包含就打印出 “yes”,不包含就打印 ”no“

// 定义一个长度为 10 的一维字符串数组
String[] arr = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};

// 从命令行输入一个单词
Scanner sc = new Scanner(System.in);
String str = sc.next();

// 判断数组中是否包含这个单词
int index = -1;
for (int i = 0; i < arr.length; i++) {
    if (arr[i].equals(str)) {
        index = i;
        break;
    }
}

// 不包含输出 NO,包含输出 YES
if (index == -1) {
    System.out.println("no");
} else {
    System.out.println("yes");
}

4.4 获取数组最大值和最小值操作

利用 Java 的 Math 类的 random() 方法,编写函数得到 0 到 n 之间的随机数,n 是参数,并找出产生 50 个这样的随机数中最大的、最小的数,并统计其中 >= 60 的有多少个(使用数组过于繁琐,此处直接进行了比较)

// 利用 Java 的 Math 类的 random() 方法,编写函数得到 0 到 n 之间的随机数,n 是参数
public static void getNums(int n) {
    double random = 0.0;
    double min = n + 1;
    double max = 0.0;
    int count = 0;
    for (int i = 0; i < 50; i++) {
        random = Math.random() * n;
        
        // 找出产生 50 个这样的随机数中最大的、最小的数
        if (random > max) {
            max = random;
        }
        if (random < min) {
            min = random;
        }
        
        // 统计其中 >= 60 的有多少个?
        if (random >= 60) {
            count++;
        }
    }
    System.out.println(max);
    System.out.println(min);
    System.out.println(count);
}

4.5 找出数组中指定元素的最后一次出现的下标位置

public int lastIndexOf(int[] arr, int num) {
    // 假设找不到对应的数据
    int index = -1;
    for (int i = arr.length - 1; i >= 0; i--) {   // 最后一次,从后往前找
        // 找到对应元素,保存index,终止循环
        if (num == arr[i]) {
            index = i;
            break;
        }
    }
    return index;
}

4.6 找出指定元素在指定数组中所有下标位置

public int allIndexOf(int[] arr, int[] indexArr, int num) {
    // 参数合法性判断
    if (arr.length > indexArr.length || num > arr.length || num < 0) {
        System.out.println("Input Parameter is Invalid!");
        return -1;
    }
    /*
    * 定义一个变量,
    * 1. 计数器,记录找到的元素个数
    * 2. 尾插法当中下一次存放元素的位置
    */
    int count = 0;
    for (int i = 0; i < arr.length; i++) {
        if (num == arr[i]) {          // 找到了对应的元素,需要保存下标i
            // 保存到indexArr数组中
            // 需要使用尾插法!保存下一次存放数据的位置
            indexArr[count] = i;
            count += 1;
        }
    }
    return count;
}

4.7 在指定位置插入指定元素

public static boolean add(int[] arr, int index, int insert) {
    // 参数合法性判断
    if (index < 0 || index > arr.length - 1) {
        System.out.println("Input Parameter is Invalid!");
        return false;
    }
    for (int i = arr.length - 1; i > index; i--) {
    	arr[i] = arr[i - 1];
    }
    arr[index] = insert;
    return true;
}

4.8 删除数组中的指定下标的元素

public boolean remove(int[] arr, int index) {
    // 参数合法性判断
    if (index < 0 || index > arr.length - 1) {
        System.out.println("Input Parameter is Invalid");
        return false;
    }
    for (int i = index; i < arr.length - 1; i++) {
    	arr[i] = arr[i + 1];
    }
    // 最后一位数据赋值为0,占位
    arr[arr.length - 1] = 0;
    return true;
}

4.9 选择排序

public static void selectSort(int[] arr)
{
    // 外层循环控制核心算法的循环次数
    for (int i = 0; i < arr.length - 1; i++) {
        // 从index位置开始找寻极值
        int index = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[index] > arr[j]) {
                index = j;
            }
        }
        if (index != i) {
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
    }
}

5. JDK安装路径

  1. bin : binary 二进制目录,都是二进制可以执行文件(java.exe)
  2. db : JDK自带的小型数据库
  3. include : 系统接口目录!!!
  4. jre : Java运行环境 Java Runtime Environment
  5. lib : 资源库目录,存在一些.jar文件 Jar包
  6. src.zip : 源文件代码


6. 配置环境变量

  1. JAVA_HOME : jdk安装目录
  2. CLASS_PATH : .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
  3. PATH : ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

7. 八大基本类型

  1. 整型 : byte(1)、 short(2)、 int(4)、 long(8)
  2. 浮点型 : float(4)、 double(8)
  3. 布尔类型 : boolean(1)
  4. 字符型 : char(2)

注意

  1. 声明float类型时,后面加 F
  2. 声明long类型时,后面加 L
  3. 字符串类型(String),“ ”内所有内容都是字符串本身,并且是一个常量,不可以修改,StringBuffer是可变的

引用数据类型

  1. 字符串
  2. 数组
  3. 对象

String 相关面试题

main(String[] args) {
    String str1 = "老干妈";
    str1 += ",蛋炒饭";
    str1 += ",酱牛肉";
    str1 += ",宫保鸡丁";
    str1 += ",大盘鸡";
    str1 += ",麻辣香锅";
    System.out.println("请问这里有几个字符串");
}

12个字符串

  • 使用双引号包含的字符串都是字符串常量!!! 常量的概念中要求不可以修改。

    双引号包含的字符串都是存在于内存的【数据区】

  • 在字符串常量操作时,使用原本的两个字符串拼接之后完成的一个新的字符串常量。

这里导致的字符串冗余问题,后期会使用StringBuffer,StringBuilder来解决问题


8. 方法

8.1 方法定义

修饰符 返回值类型 方法名(参数类型 参数名){
    ...
    方法体
    ...
    return 返回值;
}

三要素

  1. 返回值
  2. 方法名
  3. 形式参数列表(可变参数,JDK5之后)

8.2 可变参数

(数据类型... 参数名) {}

一个方法中只能指定一个可变参数,它必须是方法的最后一个参数

public class VarargsDemo {
    public static void main(String args[]) {
        // 调用可变参数的方法
        printMax(34, 3, 3, 2, 56.5);
        printMax(new double[]{1, 2, 3});
    }
 
    public static void printMax(double... numbers) {     【可变参数】
        if (numbers.length == 0) {
            System.out.println("No argument passed");
            return;
        }
 
        double result = numbers[0];
 
        for (int i = 1; i <  numbers.length; i++){
            if (numbers[i] >  result) {
                result = numbers[i];
            }
        }
        System.out.println("The max value is " + result);
    }
}

8.3 方法封装

需求分析:干什么、 方法名是什么、 参数列表有什么、 返回值类型是什么

注释完成每一步需要做的事情

  • 功能单一化!!! 考虑后期的复用性,可移植性,模块化…
  • 减少代码中return的使用,提高代码阅读性
  • 找出特定的情况优化代码,提高效率

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LRcoding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值