1、数组的定义
2、内存结构
3、数组的特性
4、数组的遍历
5、数组的排序
6、数组的copy
7、移除数组中的一个元素
8、二维数组
1、数组的定义
什么是数组: 同一类型数据的集合,数组,其实就是一个容器中存放了许多个同类元素,这些元素
可以从0开始标号,方便使用各种查询和操作
定义
元素类型 [] 数组名 =new 元素类型[元素个数]
// int [] a =new int [5] //定义了一个可以存放5个整数的数组
? a 是什么类型? 引用类型中的数组类型
元素类型 [] 数组名= 元素类型[] {元素一,元素二,元素三....}
int [] x=new int [100]
int [] x={3,5,7} //这种操作,必须在声明的时候直按赋值,不能照下面这样写:
int [] x ;
x={5,6,7}
或
int [] x=new int [3];
x={3,4};
int [5] x={4,5,6}; //不行
int x [5] ={4,5,6}; //不行
int [] x=new int [3]{1,3,5} //不行
int [] x=new int [100];
int sum=0;
for(int i=0;i<100;i++)
{
System.out.println(x[i]); //全是零
}
2、内存结构
java程序运行的时候,要在内存中分配空间,为了提高运算效率,java对内存空间进行了不同区域的划分,
每一片区域,都有特定的处理数据方式和内存管理方式
--- 栈内存
用于存储局部变量,当数据用完,占用的空间就释放
当函数运行的时候,这个函数会在内存中申请一块空间,以后这个函数中声明的变量,都会分配到这块空间中的内存
函数执行以后,函数分配到的空间就会被回收,里面了变量也会消失
--- 堆内存
数组和对象,通过new创建出来的实体都放在堆内存中
每一个实体,都有一个单一的内存地址
实体中(new 出来的东西) 中的变量都有默认的初始化值
当实体不再被引用的时候,会在不确定的时间,被垃圾回收器回收
--- 方法区
--- 本地方区
--- 寄存器
3、数组的特性
== 例一
int [] x=new int []{1,3,5};
int [] y=x;
y[0]=100;
y[1]=300;
for(int i=0;i<y.length;i++){
System.out.println (y[i]); 100 300 5
}
for(int i=0;i<x.length;i++){
System.out.println( x[i]) ; //1 00 300 5
//可以看到,对数组y的操作,影响到了x,因为它们指向的都是同一实体
}
== 例二 脚标越界异常
public static void main(String [] array)
{
float [] x = {3,4,4.5f, 8,9,2,4.44f};
for(int i=0;i<=x.length;i++){ //注意这里写的是 <=
System.out.println(x[i]); //java.lang.ArrayIndexOutOfBoundsException
}
}
== 例三 空指针异常
float [] x = {3,4,4.5f, 8,9,2,4.44f};
x=null; //java.lang.NullPointerException
试图访问值为null的变量的属性,或方法的时候,将发生此异常
4、数组的遍历
直接打印数组
float [] x = {3,4,4.5f, 8,9,2,4.44f};
System.out.println(x); //[F@e6f7d2
int [] y = {5,3,2};
System.out.println(y); //[I@19836ed
直接打印数组或某个对象的时候,它会自动调用这个数组或对象的toString()方法,输出的内容是这个方法的返回值
例一 把数组中的所有元素求合
float [] x = {3,4,4.5f, 8,9,2,4.44f};
float sum=0;
for(int i=0;i<x.length;i++){
sum+=x[i];
}
System.out.println(sum);
例二 把数组中的元素拼成字符串返回
public static void main(String [] array)
{
int [] x={1,4,6,9};
String result= test( x );
System.out.println(result);
}
public static String test(int [] x)
{
String result="";
for(int i=0;i<x.length;i++)
{
if(i!=x.length-1){
result+=x[i]+",";
}
else{
result+=x[i];
}
}
return result;
}
例三,写一个函数取数组中的最大元素
public static void main(String [] array)
{
int [] x={-1,-14,-6,-9,-2,6};
int max=getMax(x);
System.out.println(max);
}
static int getMax(int [] array)
{
int max=array[0];
for(int i=0;i<array.length;i++)
{
if(array[i]>max)
{
max=array[i];
}
}
return max;
}
5、数组的排序
冒泡排序
public static void main(String [] args){
int [] a =new int []{9,7,24,6,51,3,3,1,2,18,0};
paixu(a);
for(int i=0;i<a.length;i++)
{
System.out.println(a[i]);
}
}
static void paixu(int [] a)
{
for(int i=0;i<a.length-1;i++) //共要进行length-次比较
{
for(int j=0;j<a.length-i-1;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
使用jdk提供的类进行排序
注意,要导包 import java.util.Arrays;
int [] a =new int []{9,7,24,6,51,3,3,1,2,18,0};
Arrays.sort(a);
for(int i=0;i<a.length;i++)
{
System.out.println(a[i]+"\t");
}
6、数组的copy
//方式一
//java.util.Arrays
//声明: static int[] copyOf(int[] original, int newLength)
int [] a =new int []{9,7,24,6,51,3,3,1,2,18,0};
int [] b=Arrays.copyOf(a,a.length);
b[0]=9999; //这个操作,不会影响到 a
for(int i=0;i<b.length;i++){
System.out.println(b[i]);
}
System.out.println("-------------");
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
//方式二 System.arraycopy()
//声明 static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
int [] a =new int []{9,7,24,6,51,3,3,1,2,18,0};
int [] b=new int [a.length];
System.arraycopy(a,0,b,0,a.length)
7、移除数组中的一个元素
数组的长度确定了就不能再变了
要求写一个函数,接收一个数组,和一个整数,
这个函数能从数组中将输入的这个整数移除,返回移除后的数组
public static void main(String[] args) {
int[] x = { 3, 4, 6, 2, 6, 6, 7, 9 };
int[] result = test(x, 4);
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
}
public static int[] test(int[] x, int num) {
int count = 0;
for (int i = 0; i < x.length; i++) {
if (num == x[i]) {
count++;
}
}
int[] result = new int[x.length - count];
int index = 0;
for (int i = 0; i < x.length; i++) {
if (x[i] != num) // 如果 不是要被去掉的数
{
result[index++] = x[i];
}
}
return result;
}
8、二维数组
什么是二维数组 在java中,就是数组的数组
int [] xx [] //可以
int [] [] xx =new int[3][] // 可以, xx是一个二维数组,它的元素,是三个一维数组,但是,每 个数组的长度不确定
for(int i=0;i<xx.length;i++){
System.out.println(xx[i]); //null ,打印三次
}
int [] [] xx=new int [] [] //不合法
int [] [] kk=new int[3][50]; //合法 kk中有3个一维数组,每个数组有50个元素
kk[0][0] =9999 //给第一个元素赋值
kk[2][49] =8888 //给最后一个元素赋值
二维数组的遍历
for (int i = 0; i < kk.length; i++) {
for (int j = 0; j <kk[i].length; j++) {
System.out.print(kk[i][j]+"\t") ;
}
System.out.println();
}
二维数组的求合 ...
int[][] zz={{1,4,5},{1,4,5},{3,4}};
int sum=0;
for(int i=0;i<zz.length;i++){
for(int j=0;j<zz[i].length;j++)
{
sum+=zz[i][j];
}
}
System.out.println(sum);