java学习笔记: 基础知识: day04: 数组

====
day04
java学习笔记: 基础知识: day04: 数组

一、数组
1. 定义:数组是存储同一种数据类型的多个变量的容器。其中每一个变量叫做元素,元素的编号叫做索引。
举例说明:啤酒箱、酒瓶
2. 格式:
  (1)数据类型[] 数组名;//推荐用这个
  (2)数据类型 数组名[];
3. 解释说明
int[] arr;//定义了一个int类型的数组,数组名是arr。--推荐用这个
int arr[];//定义了一个int类型的变量,变量名是arr数组。
4.数组的初始化
  (1)数组的初始化,就是为数组开辟内存空间,并为数组中的每一个元素赋予初始值。
  (2)数组初始化的分类:动态初始化、静态初始化
  (3)动态初始化:只给出长度,由系统给出初始化值。
      格式:数据类型[] 数组名 = new 数据类型[数组长度];
      举例:int[] arr = new int[3];
左边:int:说明数组中的元素类型是int类型
         []:说明这是数组
         arr:这是数据的名称
右边:new:为数组分配内存空间
         int:说明数组中的元素是int类型
         []:说明这是数组
         3:数组长度,就是数组中的元素个数
      赋值:数组名[索引]=数据;
      获取元素的格式:数组名[索引]
  (4)静态初始化:给出初始值,由系统决定长度。
      格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
      简化格式:数据类型[] 数组名 = {元素1,元素2,...};
5.如果两个数组拿的是同一个堆内存的地址,那么任何一个数组对堆内存数据进行了修改,另一个访问到的也是修改过的。例子:夫妻-娃
int[] arr_1=new int[3];
int[] arr_2=arr_1;//把arr_1数组的地址赋值给arr_2数组,这样两个数组都指向了同一个堆内存空间。


6.数组操作的常见问题
  (1)ArrayIndexOutOfBoundsException数组索引越界异常,因为访问了不存在的索引。
  (2)NullPointerException空指针异常,因为null是指不再指向堆内存的数据,而程序还要访问它。
      空常量null是可以赋值给引用数据类型的,表示该引用不再指向堆内存的数据。
  (3)代码示例:
int[] arr = {1,2,3};
System.out.println(arr[3]);//java.lang.ArrayIndexOutOfBoundsException
arr = null;
System.out.println(arr[0]);//java.lang.NullPointerException

7.用数据的length属性获取数组元素个数,格式:数组名.length
例子:遍历数组 for(int i = 0; i < arr.length; i++){System.out.println(arr[i]);}

例子:获取数组最值
解题思路:
  1.找一个参照物,但是这个参照物只能是该数组中的元素,不能是外部的。
  2.拿数组中第一个元素作为参照物。max = arr[0]; min=arr[0];
  3.遍历数组,从第二个元素开始,依次与参照物比较,如果元素比max大,那么就留下来做参照物。if(max<arr[i]) max=arr[i]; if(min>arr[i]) min=arr[i];
  4.再比较下一个元素。最后输出结果。

例子:不死神兔
有一对兔子,从出生后第三个月起,每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子。假如兔子都不死,问第20个月,兔子对数是多少?
解题思路:
先找规律
规律  对数
第一个月  1
二  1
三  2
四  3
五  5
……
找出的规律为:从第三个月开始,每个月的兔子对数都是前两个月兔子对数相加之和,第一个月和第二个月的兔子对数都是1。
分析:
  1.由于数据比较多,所以我们定义数组实现。int[] arr=new int[20];
  2.给数据元素赋值。arr[0]=1;arr[1]=1;
  3.从第三个月开始,根据规律赋值。for(int i=2;i < length;i++)arr[i]=arr[i-1]+arr[i-2];

例子:评委打分
有6个评委,去掉一个最高分,去掉一个最低分(不考虑小数部分),分数为0-100的整数。
分析:
  1.定义一个长度为6的数组。
  2.评委打分的数据采用键盘录入实现。
  3.写代码获取数组的最大值、最小值。
  4.平均分=(总分-max-min)/(arr.length-2)。
  5.输出平均分。

笔者的话:如果可以把代码处理的基本过程分析清楚,那么基本上就拉好了代码的框架。平时工作学习中,应该遵循这样的思维方式,遇到问题、分析问题、写好处理的基本过程,持续锻炼自己的编程思维。

8.数组常用的方法
import java.util.Arrays;
Arrays.sort(arr);//可以对数组从小到大排序,只能对一维数组进行排序。
System.out.println(Arrays.toString(arr));//可以把数组元素拼接成一个好看的字符串,输出:[16, 13, 28, 56]

9.二维数组
  (1)数组是引用数据类型,所以里面可以再放数组,叫做二维数组。
  (2)定义:
int[][] arr;//推荐
int arr[][];
  (3)初始化
int[][] arr=new int[3][5];//3代表这个二维数组中有3个一维数组,每个一维数组里有5个元素
int[][] arr={{1,2,3,4,5},
                 {6,7,8,9,10},
                 {11,12,13,14,15}};
  (4)遍历二维数组
for(int i=0;i<arr.length;i++){//遍历的是二维数组里所有的一维数组
  for(int j=0;j<arr[i].length;j++){//遍历的是一维数组里的每一个元素
    System.out.print(arr[i][j]+" ");
  }
  System.out.println();
}

10.数组的缺点:数组的长度是固定的。以后工作中用集合。

11. java内存这块儿的知识太多了,在这里就简单地说一下。以后打算单独做一份笔记,todo
(1)堆Stack
堆存储的是new出来的对象和数组。
A.每一个对象都有地址值。
B.每一个对象的数据都有默认值。
数据类型    默认值
byte, short, int, long    0
float, double    0.0
char    '\u0000'念优零
boolean    false
引用类型    null
C.数据使用完毕后,会在垃圾回收器空闲的时候被回收。当内存满了,垃圾回收器就会启动,清理内存。

(2)栈heap
在栈内存中保存的是堆内存空间的访问地址,或者说栈中的变量指向堆内存中的变量。
栈存储的是局部变量。
局部变量是定义在方法中的变量。
使用完毕后,立即被回收。

(3)堆和栈的联系
A.当在堆中产生了一个数组或者对象时,可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。
B.引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。
C.而数组和对象本身在堆中分配,即使程序运行到使用new产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。

(4)方法区
方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

====

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值