回顾昨天
两个变量交换数据
- 使用一个中间变量进行转换
可以使用两个数相加相或乘然后再减去或除于对应数值就得到了另一个数,但这种方式没有任何好处。正常是不用的。
int a=2;int b=4;a=a+b-a;
使用异或^运算得到结果,但是也很少使用。
int a=2;int b=4;int c=a^b;b=b^c;a=a^c;
画形状,一定要找规律,画金字塔,画数字金字塔都要在纸上把数字关系都列出来
/*
* #
* ##
* ###
* ####
* #####
*
* row col
* 1 1
* 2 2
* 3 3
* 4 4
* 5 5
* */
数组
概念,存放数据类型的容器。数组不是基本类型是引用数据类型,要new。
它只是容器,如果不往里面放东西,那就不能用
特点
- 只能存储同一种数据类型
- 数组在创建过后都会有默认值(初始值),用户定义也好系统定义也好,用户定义的就是静态创建。系统的就是动态,一般的默认值:整形->0、布尔型->false、浮点型是0.0、字符型->
\u0000
控制台中使用一个空格表示。 - 长度固定,创建就要固定长度,一旦固定就不能扩容了,
不能改变指的是编译运行的时候不能改变,编码的时侯可以改变 数组在创建后,都会根据类型赋予初始值
创建
- 静态创建
创建的时候同时给元素赋值。一开始在创建的时候就已经在堆中进行初始化了默认值。相当于用户自定义了这个数组的默认值。它肯定会在堆空开辟空间的来存放的。- 格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3……}; - 变形:
数据类型[] 数组名 = {元素1,元素2,元素3……};//因为它肯定会在堆中创建空间所以可以省写new。他是上一种方式的变形,是他的简写,所以理论上是new了
int[] arr1 = new int[]{1,5,2,4};//原始 int[] arr2 = {1,5,2,4};//变形
- 格式:
- 动态创建
创建的时候不给里面的内容而是只给长度。使用new来创建的时候因为是静态的没有赋值,所以他会在栈中开辟对应长度的空间,但是里面是有默认值的,基本类型默认值属于系统初始化一般是一个类型的最小值0一类的。引用类型默认值是null;格式:
数据类型[] 数组名 = new 数据类型[长度];int[] arr1 = new int[10];
- 注:
- 编码完成时这个数组的长度就固定下来了,在编译运行期间不能再对数组的长度进行改动,即不能对数组的元素进行增删;
- 不能同时静态和动态的特性同时混合使用的,即不可以在限定长度的同时给里面赋值。
- 中括号位置可以写在数据类型之后也可以写在数组名之后,但是都是推荐写在前面,因为这样可以区分数组和变量。
在所有创建对象的过程中只要使用到了new这个关键字创建就会在堆中创建一个内容空间。然后会把这个对象掉地址(16进制的地址)给对象变量(即对象)。所以,直接打印数组名打印的是数组在堆内存中的地址。
数组中元素的获取
- 格式:数组名[下标]
- 下标:索引,角标,范围是:0~数组长度-1
- 数组长度:数组.length //注意不加括号,这不是字符串方法
最后一个元素:数组.length-1
获取方式(数组的遍历):
- 借助Arrays工具类的toString(),将数组以字符串的形式输出
循环遍历
int[] arr = {x,x,x,x,...}; for(int i = 0; i <= arr.length - 1 ;i++){ arr[i]; }
数组中元素的赋值
- 数组名[下标]=值;
- 注:
- 没有赋值的动态创建会根据创建的类型确定默认值,int->0
- 同一种类型的数组只能赋值同一种类型的值
存在的问题
- ArraryIndexOutofBoundsException,数组下标越界。解决办法,好好写,别瞎搞。下标写入范围内。
- NullPointerException,空指针异常,使用了null赋值给对象null不会开辟空间,对象中没有使用new来开辟空间所以没有返回指针地址给对象变量,没有给他开辟内从空间。所以引用数据类型在定义的时候都不要忘了在使用前进行实例化开辟空间。不然就不要使用。
数组排序
冒泡排序
最外层只有一个作用就是控制它循环几次,内层控制它是挨个和旁边的比了再交换,还是拿外层的一个数挨个还里面的数比较。
拿着当前的这个元素和相邻的作比较,这样挨个相邻的比较int[] arr = {3,5,3,65,3,2}; int temp;//定义一个临时变量 for (int i = 0; i < arr.length - 1; i++) {//冒泡趟数 for (int j = 0; j < arr.length - i - 1; j++) { //如果顺序不对,则交换两个元素 if (arr[j + 1] < arr[j]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } System.out.println(Arrays.toString(arr));
选择排序
拿着当前的这个元素和后面的元素作比较int[] arr = {2, 7, 2, 74, 2, 98765, 12, 3}; for (int i = 0; i < arr.length; i++) { //最小数的索引 int minIndex = i; for (int j = i; j < arr.length; j++) { //找到最小数,并记录最小数的索引 if (arr[j] < arr[minIndex]) { minIndex = j; } } //交换符合条件的数 int tmp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = tmp; } System.out.println(Arrays.toString(arr));
Arrays.sort(arr);这个数组工具,没有返回值,而是在原始数组上进行排序,会破环数据。
练习:想保留几位小数就保留几位小数
- 依靠乘然后省略小数,最后除去,保存为double类型
- 利用数组的来回转换
二维数组
- 概念:存储数组元素的数组
- 创建
- 数据类型[][] 数组名 = new 数据类型[小数组的个数][每一个小数组的长度];
new了大数组地址空间,有地址可以存放小数组。也new了小数组,小数组系统默认值是0 - 数据类型[][] 数组名 = new 数据类型[小数组的个数][];
new了大数组有地址可以存放小数组,没有new小数组没有地址,小数组是null没有空间
这种创建方式的二维数组中的小数组,需要单独进行创建。 - 数据类型[][] 数组名 = {
{元素1,元素2,...},
{元素1,...},
{元素1,元素2,元素3,...},
...
};
new了大数组有空间有地址,也new了小数组有地址。并且,默认值用户自定义了
- 数据类型[][] 数组名 = new 数据类型[小数组的个数][每一个小数组的长度];
- 遍历
for(int i = 0;i <= arr.length - 1;i++){ for(int j = 0;j<=arr[i].length - 1;j++){ System.out.print(arr[i][j]+"\t"); } System.out.println(); }
一维数组名是地址(带一个[
),二维数组名是地址(带两个[[
),二维数组的小数组名还是地址。所以正确调用数组值,要用下标。
二维数组的小数组必须使用new关键字进行创建,总之数组就是引用类型,就是要用new进行创建。开辟空间,大数组要new,小数组也要new。