Java提供了数组这种数据结构,主要可以将大量的数据存储起来
定义:数组是用来存储相兼容数据类型的定长的容器
a.数组中只能存放相兼容类型的数据,不能存放多种类型的数据
b.数组中既可以存储基本数据类型,也可以存储引用数据类型
c.数组是定长的,一旦一个数组被初始化,那么这个数组的长度就不能再发生改变
d.数组相当于是一个容器
e.数组中存储的数据被称为元素
可以自动的给存储到数组中的数据进行编号,从0开始,方便操作数据
这些编号就被称为下标,角标,或者索引
编号和数据之间存在着一一对应的关系,通过编号,就可以直接找到相对应的数据
注意:数组属于引用数据类型,本身仍然是一种数据类型,所以可以定义数组变量
数据类型 变量名称 = 初始值;
方式一:数据类型[] 数组名称;
方式二:数据类型 数组名称[];
推荐使用方式一,c#已经不支持方式二定义数组
int x = 10;
int[] a;
int a[];
说明:int是一种基本数据类型,int[]是数组类型,在这里,int表示数组中存储的元素的数据类型
所谓初始化,Java中的数据必须先进行初始化,然后才能使用,为数组中的元素分配内存空间,并为每个元素赋初始值
初始化时由程序员指定每个元素的初始值,由系统计算数组的长度
语法:数组元素类型[] 数组名称 = new 数组元素类型[]{元素1,元素2.。。。。};
例如:int[] arr = new int[]{10,20,30,40};
可简写为int[] arr = {10,20,30,40};
说明:任何一个变量都需要由自己确定的数据类型,这里的arr表示是数组变量名称,int表示数组中元素的类型,int[]表示数组类型
初始化时由程序员指定数组的长度,由系统分配初始值
语法:数组元素类型[] 数组名称 = new 数组元素类型[元素的个数或者数组的长度];
初始值的分配规则:
整型 0
浮点型 0.0
字符型 \u0000 【空格,方框】
布尔类型 false
引用数据类型 null
注意:
a.在初始化数组时,不要静态初始化和动态初始化同时使用,【不要在进行数组初始化时,既指定数组的长度,而且给每个元素赋初始值】
b.既然数组也是一种数据类型,所以在定义数组的时候,也可以先声明,然后再初始化
举例:
int x;
x = 10;
int[] socres;
socres = new int[10];
通过下标【索引】
语法:数组名称[下标]
在Java中,所有的数组都提供了一个length属性,通过这个属性可以访问数组的长度或者元素的个数
语法:数组名称.length
遍历:依次访问数组中的每一个元素【通过不同的下标获取各自对应的值】
1>简单for循环【while循环】
2>增强for循环【foreach循环】
JDK1.5之后新增的
优点:用于遍历数组和集合,无需下标,就可以直接获取数组或者集合中的元素
语法:
for(数组元素类型 变量名 :数组或者集合名称) {
//循环体
}
数组是一种引用数据类型,数组引用变量其实就是一个引用,数组元素和引用在内存中是分开存放
数组引用变量可以指向任何有效的内存空间,只有当该引用指向有效的空间之后,才可以通过这个引用操作数组中的的元素,当引用赋值为null,表示该引用指向了一个无效的空间
数组的引用变量存储于栈空间中,被new出来的实际的数组存储于堆空间中
总结:对于引用数据类型,当两个引用变量指向同一块内存空间时,当修改一个变量的值时,另外一个也跟着变化
a.寄存器,最快的一块存储区,由编译器根据需求进行分配,我们在程序中无法控制
b.栈:存放基本数据类型的变量以及引用数据类型的引用
特点:先进后出,后进先出,被执行完成之后,该函数或者语句中的变量将被销毁,所占用的空间将会被释放
c.堆:存放所有使用new关键字创建出来的实体
特点;执行完之后不会立即被释放,当使用完成之后,会被标记上垃圾的标记,等待系统的垃圾回收机制回收它
d.方法区:
静态域:存放静态变量【static】
常量池:存放字符串常量和基本数据类型的常量
int[] arr = {235,54};
String str = "hello world";
排序思路:比较两个相邻的下标对应的元素,如果符合条件就交换位置【最值出现在最右边】
排序思路:固定一个下标,然后使用这个下标对应的元素和其余的元素进行比较,如果符合条件就交换位置【最值出现在最左边】
将要查找的数据和数组中的元素进行一一的比对,如果相等,说明查找到了
前提条件:数组必须是有序的
查找思路:通过折半来缩小查找范围【以升序为例,将待查找的数据与中间下标对应的元素进行比较,如果中间下标对应的元素大于待查找的元素的话,说明待查找的元素在前半部分】