一维数组
- 定义 引用类型定义都用new
int[] a=new int[10]; - 初始化
静态初始化 int[] a={1,2,3,4,5};
动态初始化 int[] a= new int[5]; - 长度属性 length
- 遍历方法 for(String name : s)//name为变量名
- 内存结构 栈中只储存基本数据类型和引用名;堆中储存引用类型
二维数组
- 不常用,一般用作游戏地图坐标。
- java本质上没有二维数组,所谓的二维数组就是一个元素类型为数组的一维数组。
- 初始化:
int[] [] a = new int[3] [];
int[] [] a = new int[3] [5];
int[] [] a = {{1},{2,3,},{4,5,6}}; - 遍历
public class lianxi {
public static void main(String[] args) {
//二维数组的初始化1
/*int[][] a=new int[3][5];
a[0][0]=1;
a[1][1]=1;
a[2][2]=1;*/
//二维数组的初始化2
int[][] a= new int[3][];
a[0]=new int[] {1,2,3};
a[1]=new int[] {4,5,6,7,8};
a[2]=new int[] {9,0,1,2};
//二维数组的初始化3
//int[][] a={{1,2,3},{4,5,6,7,8},{9,0,1,2}}
//二维数组的遍历1
/*for(int i=0;i<a.length;i++) {
for(int j=0;j<a[i].length;j++) {
System.out.print(a[i][j]+"\t");
}
System.out.println();
}*/
//二维数组的遍历2 foreach
for(int[] a1:a) {
for(int a2:a1) {
System.out.print(a2+"\t");
}
System.out.println();
}
}
}
最后要说一点,数组的大小定义了就无法改变,写插入和删除算法时候想了好久,最后还是写不出来。只能定义时候就把要加入元素的位数预留出来。
虽然表面上不可以改变,但学习了面向对象之后,我自己写了一个数组增删改查的类,嘿嘿。
//我这个取名叫做啰里八嗦的数组操作类
public class MyArray {
//数组
int[] array;
//当前数组中元素的个数
int size;
public MyArray(int[] array) {
this.array = array;
this.size=array.length;
}
//在数组最后添加一个value
public void add(int value) {
int[] b=new int[size+1];
for(int j=0;j<size;j++) {
b[j]=array[j];
}
b[size]=value;
array=b;
size++;
}
//根据index删除一个元素
void remove(int index) {
for(int i=index;i<size-1;i++) {
array[i]=array[i+1];
}
array[size-1]=0;
size--;
}
//在数组position处添加一个value
void add(int position,int value) {
int[] c=new int[size+1];
for(int i=0;i<size;i++) {
c[i]=array[i];
}
for(int i=size;i>position;i--) {
c[i]=c[i-1];
}
c[position]=value;
array=c;
size++;
}
//把position处的值改成value
void set(int position,int value) {
array[position]=value;
}
//根据索引获取值
int getValue(int index) {
return array[index];
}
//获取数组长度
int getSize() {
return size;
}
}
自己写的肯定是最香的,后来看了别人写的,主要从两点优化:
1.把数组扩长功能单独拿出来写一个方法,我自己确实重复写了两次,这里考虑不足。扩容的大小要好好选择,太长浪费空间,太短没有效果,别人选择的是原长度的1.5倍+1。
2.要有各种判断的语句。比如索引值要大于0且小于数组长度之类的。
于是就有了下面的修改版。
//重大调整
public class MyArray2 {
int[] array=new int[10];
int size=0;
public void add(int a) {
extendSpace();
array[size++]=a;
}
//扩容
private void extendSpace() {
if(size==array.length) {
int[] arraytwo=new int[size*3/2+1];
for(int i=0;i<array.length;i++) {
arraytwo[i]=array[i];
array=arraytwo;
}
}
}
public boolean remove(int index) {
if(index>0 && index<size) {
for(int i=index;i<size;i++) {
array[i]=array[i+1];
}
size--;
}
return false;
}
public int getSize() {
return this.size;
}
public int get(int index) {
if(index>0 && index<size) {
return array[index];
}else {
return Integer.MAX_VALUE;
}
}
public void set(int index,int value) {
if(index>=0 && index<size) {
array[index]=value;
}
}
public void add(int index,int a) {
extendSpace();
for(int i=size-1;i>=index;i--) {
array[i+1]=array[i];
}
this.set(index, a);
size++;
}
}
记录一下与数组有关的常用API
System.arraycopy() 数组复制
Arrays.toString() 数组输出
Arrays.sort() 数组排序
还有一个和字符串有关的
字符串类本身储存的就是字符数组
字符串.equals();判断二者是否相等