javaEE基础深入理解篇,java 的基本数据类型、if 分支循环、运算符、while 循环、方法、数组【第一篇】


【重新将从基础到框架的技术全部写一遍笔记】

学习目标

将JavaEE 全部的基础知识全部掌握,并且在集合,锁,线程,反射的时候要求认真学习并记忆。

学习内容

本篇的内容将 java 的数据类型、if 分支循环、运算符、while 循环、方法、数组这些知识全部的总结一遍,至于非常简单通俗的内容并不会去写,只会写一些升华的知识点帮助我们能更好的去了解基础知识。

学习产出

数据类型、if 分支循环、运算符、while 循环、方法、数组

一、数据类型

整数类型

数据类型占用内存空间字节数数据范围
byte1-128 ~ 127
short2-32768 ~ 32767
int4-2^31 ~ 2^31 -1
long8-2^63 ~ 2^63 -1

浮点类型

数据类型占用内存空间字节数数据范围
double8(64bit)10^308
float410^38

注意点:

  1. 浮点类型需要注意的是在写 float 的时候,需要在数据后面写大写的F(写小写的 f 也可以,但是不符合规范,代码最好是符合规范),因为 java 会将浮点类型的数默认当为 double 型。
  2. 在将 double 类型转为 float 时可能会出现精度丢失的问题。
  3. 在将两个浮点类型的数进行加减操作时不会返回心中想的那个数,因为出现了精度丢失,后期会用BigDecimal这个包装类来解决问题。

字符型

数据类型占用内存空间字节数数据范围
char2可以存储中文

布尔类型

数据类型占用内存空间字节数数据范围
boolean1. 占用一个字节
2. 占用四个字节
3. boolean类型数组 每一个布尔类型占用一个 bit 位
true false

AJCG 阿里巴巴Java代码开发规约

  1. 字符使用范围是 字母 A~Z,a~z,数字 0~9,还有唯一可以使用的 _ (下划线)
    那么可能在定义类名的时候,加一些其他的符号可能不会报错能够成功创建,但是不符合规范,这个规范是对Java开发做了一个统一的标准。
  2. 变量要求用字母开头,不能用数字开头
  3. 标识符要求严格的大小写
  4. 见名知意,不能用拼音的拼写。如studentName(学生名字)studentMathScore(学生数学成绩)等
  5. 标识符命名规则

1、小驼峰,变量名,方法,
2、大驼峰,类名,接口名
3、下划线命名法 所有单词全部大写 如 MAX_VALUE(最大值)

  1. 不能使用保留字或者关键字

二、分支结构

需要注意的地方:

  1. 在代码里面,需要有一些小的空格,帮助代码看起来很整洁规范,比如在 if 后面或者一些的 () 后面都会有一些的小空格,这让代码看齐很规整,方便阅读,idea也有自动对齐代码的快捷键 Ctrl + Alt + L
  2. 在一大堆自增自减运算符的题目中,不要怕,挨个的写出来答案,不管加减乘除和括号,下面有介绍

2.1 if分支

if (判断语句,返回值是boolean类型) {
    执行语句
}
if (判断语句,返回值是boolean类型) {
    执行语句;
}else {
    执行语句;
}
if (判断语句1,返回值是boolean类型) {
    执行语句1;
}else if (判断语句2,返回值是boolean类型){
    执行语句2;
}else if (判断语句3,返回值是boolean类型){
    执行语句3;
}else {
    执行语句4;
}

在 if 分支中,最多有一个分支会执行

2.2 循环分支

while (判断语句,返回值是boolean类型) {
    循环语句,知道判断语句返回false则退出;
}
for (初始值;判断语句;值改变) {
    循环语句;
}

do while循环是先执行一次执行语句再进行判断

do {
  执行语句
} while (判断语句,返回值是boolean类型);

2.3 运算符

算数运算符

+  -  *  /  %  =  +=  -=  *=  /=  %=

关系运算符(返回值是boolean类型)


>  <  >=  <=  !=  ==

逻辑运算符

&  &&  |  ||  !

& 和 && 、| 和 || 区别。
两个符号的话,判断一个如果能得出结果则后面的判断全部舍弃
在&&中如果判断第一个为假,则跳出判断,后面的不进行判断,返回假
在 || 中如果判断第一个为真,则跳出判断,后面的不进行判断,返回真

自增自减

++   --
int a = 10;
int b = 5;
int c = 3;
ret = a++ * ++b - (c-- + b++)
a++  ⇒  10
++b  ⇒  6
c--  ⇒  3
b++  ⇒  6
最后的结果为  10 * 6 - (3 + 6)

拆掉所有的算术运算符,包括小括号,小括号优先级有且只在自增自减结果提供之后参与。

三、方法

权限修饰符 是否静态 返回值类型 方法名(形式参数列表) { 方法体 }

3.1 方法的分类

无参无返回值
无参有返回值
有参无返回值
有参有返回值  ☆

3.2 方法的demo例题

方法的学习最好是写一些封装的方法,然后带有返回值,带有参数的那些。
以下的小作业可以进行学习:

//封装一个方法,返回两个浮点数里的较小那个
public static double test_01(double number1, double number1){
	
}
//封装一个方法,来判断一个字符是否是大写字母
public static boolean isMyUpper(char c) {
	return num1 < num2 ? num1 : num2;
}
//封装一个方法,来判断一个字符是否是数字字符
//如果是,返回true,否则返回false!
public static boolean isMyNumber(char c) {
    return c >= 'A' && c <= 'Z';
}
//封装一个方法,来判断一个字符是否是英文字母
//如果是,返回true,否则返回false! 
public static boolean isMyEnglish(char c) {
    return c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z';
}
//封装一个方法,传入一个字符,如果是大写那么转化小写然后返回,否则保持不变返回
/*可能会有一些人会将里面的字符串替换成对应的ASICC对应的int类型
的数字,可行,但是不好,因为本身就是字符型来进行判断的
里面写int类型会不那么的好
*/
public static char toMyLower(char c) {
    if (c >= 'A' && c <= 'Z') {
        c += ('a' - 'A');
    }
//封装一个方法,传入一个字符,如果是大写那么转化小写然后返回,否则保持不变返回
/*很多人会直接认为应该将大写的字符型+32,这样最好不要写,因为这
32默认是int类型的,char类型和int类型相加无法,需要进行
强转的操作,但是最好不要对基本数据类型进行强转。比较好的解法就是
以下的解法
*/
public static char toMyLower(char c) {
    if (c >= 'A' && c <= 'Z') {
        c += ('a' - 'A');
    }

用户输入一个年份,判断这个年份是不是一个闰年。
核心条件:
1. 可以被 4 整除,但是不可以被 100 整除
2. 或者可以被 400 整除

1 - 3 + 5 - 7 + 9 - 11 … - 99 + 101 的结果
多种方法都可以计算

  1. 判断正负号来加减
  2. 正数的和减去负数的和
  3. 101 + (-2 * 25) = 51

四、数组

4.1 数组的基本信息

数组的引用数据类型
基本的格式为

数据类型[] 数组名 = new 数据类型[数组长度]
数据类型:
1、数据类型可以的基本数据类型,也可以引用数据类型
2、但是在一个数组中,里面的数据必须是相同的数据类型
数组名:
是引用类型,在栈中,指向堆中数组的首地址
new:
1、申请空间,根据后面的容量大小进行申请
2、对旧空间进行内容擦除
数组长度:
数组下标是int类型的数据,所以长度是在int类型以内的。
具体的值为 Integer.MAX_VALUE-8

数组地址转移分析图例
地址转移的例图

4.2 数组demo例题

 1、指定数组找出数组中最大值下标位置
 int[] arr = {1, 3, 5, 7, 9, 21, 4, 6, 8, 10};
    找出数值中最大值下标位置:
	maxIndex = 5;
 2 、指定数组找出数组中最小值下标位置
 int[] arr = {1, 3, 5, 7, 9, 21, 4, 6, 8, 10};
    找出数值中最小值下标位置:
	minIndex = 0;
 3 、指定数组中最大值元素个数
 int[] arr = {0, 21, 5, 21, 9, 21, 4, 6, 21, 10};
    最大值个数
	maxValueCount = 5;
 4、 指定数组中最大值元素所有对应下标位置,要求存储到另一个数组中
  int[] arr = {21, 21, 5, 21, 9, 21, 4, 6, 21, 10};
  其他数组:
  int[] indexArray = {0, 1, 3, 5, 8};
 5、 找出指定元素在指定数值中第一次出现的下标位置
 6 、找出指定元素在指定数值中最后一次出现的下标位置
 7、 从数组中指定下标开始,到指定下标结束,获取数据存储到新数组中
 8、 复制指定数组数据内容到新数组
 9、 指定数组内容逆序
 10 、在数组指定下标位置添加元素
目标数组:	
	int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
	注意:
		1. 0 无效元素,仅占位使用
		2. 插入数据下标的位置必须在合法范围以内
		例如:
			添加指定元素 20 到下标为 5 的位置
			{1, 3, 5, 7, 9, 20, 11, 13, 15, 17};
 11 、删除数组中指定下标元素内容
目标数组:
	int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
	注意:
		1. 0 是无效元素,仅占位使用
		2. 删除之后,要求数组元素向前移动
		3. 删除数据下标的位置必须在合法范围以内
			ArrayIndexOutOfBoundsException 
		例如:
			删除指定下标 5 的元素
            {1, 3, 5, 7, 9, 13, 15, 17, 19, 0}
package zpd;

import org.omg.PortableInterceptor.INACTIVE;

import java.util.Arrays;

/**
 * @Description
 * @Author zpd
 * @Date 2023/2/22
 */
public class demo10 {
    public static void main(String[] args) {
        /**
         * 前4题验证
         */
/*        int[] arr0 = {1, 3, 5, 7, 9, 21, 4, 6, 8, 10};
        int[] arr = {21, 21, 5, 21, 9, 21, 4, 6, 21, 10};
        int i2 = test_01(arr0);
        int i1 = test_02(arr0);
        int i = test_03(arr);
        int[] ints = test_04(arr);
        System.out.println(i2);
        System.out.println(i1);
        System.out.println(i);
        System.out.println(Arrays.toString(ints));*/
        /**
         * 第五题验证
         */
/*        int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
        int index = test_05(arr, 11);
        System.out.println(index);*/
        /**
         * 第六题验证
         */
/*        int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
        int[] toArr = test_06(arr, 1, 4);
        System.out.println(Arrays.toString(toArr));*/
        /**
         * 第七题验证
         */
/*        int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
        int[] toArr = test_07(arr);
        System.out.println(Arrays.toString(toArr));*/
        /**
         * 第八题验证
         */
        /*int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
        int[] toArr = test_08(arr);
        System.out.println(Arrays.toString(toArr));*/
        /**
         * 第九题验证
         */
/*        int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
        int[] arr1 = test09(arr, 20, 5);
        System.out.println(Arrays.toString(arr1));*/
        /**
         * 第十题验证
         */
        /*int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
        int[] ints = test_10(arr, 5);
        System.out.println(Arrays.toString(ints));*/
        Integer[] integers  = new Integer[5];
        
    }

    //TODO 1

    /**
     * 指定数组找出数组中最大值下标位置
     *
     * @return 最大值下标
     */
    public static int test_01(int[] arr) {
        int maxIndex = 0;
        for (int i = 1; i < arr.length; i++) {
            if (arr[maxIndex] < arr[i]) {
                maxIndex = i;
            }
        }
        return maxIndex;
    }

    //TODO 2

    /**
     * 指定数组找出数组中最小值下标位置
     *
     * @return 最小值下标
     */
    public static int test_02(int[] arr) {
        int minIndex = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[minIndex] > arr[i]) {
                minIndex = i;
            }
        }
        return minIndex;
    }
    //TODO 3

    /**
     * 指定数组中最大值元素个数
     *
     * @return 最大值元素个数
     */
    public static int test_03(int[] arr) {
        int num = 1;
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (max < arr[i]){
                max = arr[i];
                num = 1;
            }else {
                num++;
            }
        }
        return num;

    }

    //TODO 4

    /**
     * 指定数值中最大值元素所有对应下标位置,要求存储到另一个数组中
     *
     * @return
     */
    public static int[] test_04(int[] arr1) {
        //得到最大数的个数,用来创建数组
        int maxNum = test_03(arr1);
        //得到最大的数的下标值
        int maxIndex = test_01(arr1);
        int index = 0;
        int[] arr2 = new int[maxNum];
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[maxIndex] == arr1[i]) {
                arr2[index] = i;
                index += 1;
            }
        }
        return arr2;
    }
    //TODO 5

    /**
     * 找出指定元素在指定数值中第一次出现的下标位置
     *
     * @param arr 需要查询的数组
     * @param num 查询的数据
     * @return 返回数据对应的下标
     */
    public static int test_05(int[] arr, int num) {
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            if (num == arr[i]) {
                index = i;
            }
        }
        return index;
    }
    //TODO 6

    /**
     * 从数组中指定下标开始,到指定下标结束,获取数据存储到新数组中
     *
     * @param arr        需要截取的数组
     * @param startIndex 截取的开始下标
     * @param endIndex   截取的结束下标
     * @return 返回新数组
     */
    public static int[] test_06(int[] arr, int startIndex, int endIndex) {
        if (startIndex >= arr.length || startIndex < 0 || endIndex >= arr.length || endIndex < 0) {
            throw new ArrayIndexOutOfBoundsException();
        }
        //截取数组的长度
        int[] toArray = new int[endIndex - startIndex + 1];
        int index = 0;
        for (int i = startIndex; i <= endIndex; i++) {
            toArray[index] = arr[i];
            index += 1;
        }
        return toArray;
    }

    //TODO 7
    public static int[] test_07(int[] arr) {
        int[] toArray = new int[arr.length];
        toArray = arr;
        return toArray;
    }

    //TODO 8

    /**
     * 指定数组内容逆序
     *
     * @param arr 需要逆序的数组
     * @return 返回逆序完成后的数组
     */
    public static int[] test_08(int[] arr) {
        //创建新的数组来接收逆序的数组
        int[] toArray = new int[arr.length];
        //逆序数组的下标从最后开始接收
        int index = arr.length - 1;
        for (int i = 0; i < arr.length; i++) {
            toArray[index] = arr[i];
            index -= 1;
        }
        return toArray;
    }

    //TODO 9

    /**
     * 在数组指定下标位置添加元素
     *
     * @param arr    目标数组
     * @param number 添加的元素
     * @param index  对应的下标
     * @return 返回添加后的元素
     */
    public static int[] test09(int[] arr, int number, int index) {
        if (index >= arr.length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        //5 10-5
        for (int i = arr.length - 1; i > index; i--) {
            arr[i] = arr[i - 1];
        }
        arr[index] = number;
        return arr;
    }
    //TODO 10

    /**
     * 删除数组中指定下标元素内容
     *
     * @param arr   需要删除的数组
     * @param index 删除是下标元素
     * @return 删除后返回的数组
     */
    public static int[] test_10(int[] arr, int index) {
        if (index >= arr.length) {
            throw new ArrayIndexOutOfBoundsException();
        }
        //直接让对应下标的数据被覆盖,然后将最后一个数据赋值为0
        for (int i = index; i < arr.length - 1; i++) {
            arr[i] = arr[i + 1];
        }
        arr[arr.length - 1] = 0;
        return arr;
    }
}

这里面的代码都是自己写的,并且封装成了静态方法块,也在某几个方法中进行了调用别的方法。
里面的方法可以进行优化,将两个for循环优化为一个for循环,优化了代码的效率。

4.3 排序算法

学到数组一定要做的两个简单的算法,选择排序算法和冒泡排序算法。

选择排序算法

//选择排序算
//直接写成了静态方法
public static void selectSort(int[] arr){
    //外层的for循环是用来决定交换的次数
    for (int i = 0; i < arr.length; i++) {
        //index值默认为0,第一次和下标为0的元素交换
        // 第二次和下标为1的元素交换、、、正好符合i的值
        int index = i;
        //初始值为i+1,则是默认为index对应的下标是极值
        // 不用自己和自己比较,减少了一次判断
        for (int j = i + 1; j < arr.length; j++) {
            //如果index对应下标的数组值小于j下标对应的数组值
            // 则将较大数据的数组值赋值为index
            if (arr[index] < arr[j]){
                index = j;
            }
        }
        //如果index下标不等于原来的i值,说明下标发生了改变
        // 则需要将index下标对应的值和i下标对应的值进行交换
        if (index != i){
            int temp = arr[index];
            arr[index] = arr[i];
            arr[i] = temp;
        }
    }
    System.out.println(Arrays.toString(arr));
}

冒泡排序算法

 public static void bubbleSort(int[] arr) {
     //外层循环代表循环的次数
     for (int i = 0; i < arr.length; i++) {
         //可能交换判断的次数
         for (int j = 0; j < arr.length - i - 1; 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));
 }

4.4 优化

目录4.2当中有些方法还存在优化的空间,可以尝试优化一下,后期会进行优化和详细讲解的文章
优化篇链接(待定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值