Java 数组
什么是数组?
程序=算法+数据结构
前面所学习的if ,if-else switch 循环 解决的都是流程问题,即算法问题。
所谓的数据结构,简单说就是把数据按照特定的某种接二狗来保存,设计一个合理的数据结构是解决问题的前提。
数组就是最基本的一种数据结构。
数组的官方定义
相同数据类型的元素组成的集合
元素按线形顺序 所谓线形顺序是指除第一个元素外,每一个元素都有唯一一个前驱元素,除最后一个元素外,每一个元素都有唯一一个后驱元素(一个跟一个)。可以通过元素所在位置的顺序号(下标)做标识来访问每一个元素
(从下标从0开始,最大的元素个数为-1)
定义基本类型数组
声明一个数组的语法:
数据类型 [ ] 数组名=new 数据类型[大小]
int [ ] arr//声明了一个数组,但是没有指定长度,(没有创建数组的实例,没有实例化)
int [ ] arr=new int[10];//创建了长度为10的数组 中括号种不指定数值会报错(创建的数组的实例并且指定了长度为10)
ps:实例和声明的区别在于虚拟机是否为当前变量分配了空间
此时的数组并没有初始化(给数组元素赋值),但是有默认值,不同的数据类型对应不同的默认值
int[]:指定数组类型,表示数组中的每一个元素都是int类型
arr:数组类型变量名 (引用)
[10];数组的长度 即数组中元素的个数
定义基本类型数组的要点
1,要有确切的数据类型
2,要有整体的数组名称
3,不能缺少的[ ]
4,执行new语句才能使得数组分配到指定大小的内存空间
int[ ] arr 与int arr[ ] 两种写法均可
声明数组是不规定数组长度,new关键字分配空间时需要指定分配的空间大小
数组的初始化
基本类型数组创建之后,其元素的初始值,byte short char int long 为0
float和double则为0.0 boolean为false
可以在数组声明的同时对数组的元素进行初始化
例如:int【】arr={10,12,23,30,21}
ps:
1.元素的个数即为数组的长度,
2.此种写法只能用于声明时的初始化,不能用于赋值,如下面代码就会出现编译错误
int[] arr=new int[10];
arr= {,2,3,2,1}
//错误
int[] arr= {1,2,3,2,1};//正确
可以通过下面的方式给已经声明的数组类型变量进行初始化
int[] s;
s=new int[] {1,2,3,4,5};//先声明后初始化
数组的访问
获取数组的长度,
调用数组的lenght属性就可以获取数组的长度
//创建并初始化数组
int[] s=new int[] {1,2,3,4,5};
int a=s.length;
System.out.println(a);//5
通过下标访问数组中的元素
数组中的元素通过下标的方式进行访问
ps:下标从零开始,最大到length-1
遍历数组元素
遍历数组元素,通常选择for循环语句,循环变量作为访问数组的下标,即可访问数组中的没一个元素
int[] s=new int[] {1,2,3,4,5};
int r=s[2];
//交换数组下标为2和3的两个相邻元素的值
s[2]=s[3];
s[3]=r;
//System.out.println(s);//[I@1efbd816 散列码 数组不能直接输出
//输出当前数组在内存中的散列码(hashcode值)
for (int i = 0; i < s.length; i++) {
System.out.println(s[i]+" ");
}
遍历数组元素,逆序输出
//逆序输出
for (int i =s.length-1 ; i >= 0; i--) {
System.out.println(s[i]+" ");
}
数组的复制
System.arraycopy()方法
public static void arraycopy
System.arraycopy(src, srcPos, dest, destPos, length);
src:原数组
srcPos:原数组中的起始位置
dast:目标数组
destPos: 目标数组中的起始位置
length :要复制的数组元素的数量
数组的扩容
数组的长度在创建后是不可改变的
java中没有提供任何方法用于改变一个已经定义和的数组的长度
int[] arr=new int[10];
arr=new int[11];//这并非是在原数组的基础上进行长度的改变
//这其实是创建一个新的数组
//其实是在内存中开辟出了一个新的空间
//并把新的空间的引用(内存地址)赋值给了arr
所谓的克隆是指创建一个更大的新数组并将原有数组的让人复制到其中
String是不能改变的 但是StringBuffer是可以改变的
Arrays.copyof()简便实现数组的扩展
int[] a= {10,20,30,40,50};
System.out.println(a.hashCode());
//扩容 创建了一个比原数组更长,并且包含原数组的所有内
a=Arrays.copyOf(a, a.length+1);
System.out.println(a.hashCode());
//hashCode返回当前数组在内存的地址值(返回时处理后的十进制)。
数组冒泡排序算法
冒泡排序的原则
比较相邻的元素,如果违反最后的顺序准则,则交换
实现
可以简化理解为
第一次找到所有元素中最大的元素并放在最后一个位置中,不再变动
第二次找到剩余元素中最大的值放置在倒数第二个位置上
以此类推
int arr[]=new int[10];
Random ran=new Random();
for(int i = 0;i<arr.lenght;i++){
arr[i]=ran.nextInt(100);
}
System.out.println(Arrars.toSting(arr));
//随机了一个1-100之间的10位数组 并且输出这个数组