数组是同一种类型数据的集合,可以理解为数组就是一个容器。数组是引用数据类型。
好处
可以自动为数组中的元素从0开始添加编号,方便操作这些操作。
格式1
元素类型[] 数组名称=new 元素类型[数组长度]
如: int [] arr=new int[5]; 定义一个长度为5的int类型的数组。数组内值默认为0.
格式2
元素类型[]数组名称=new 元素类型[]{元素,元素.......};
如:int[] arr=new int[]{1,2,3,4,5};定义了一个长度为5int类型的数组,并且已为数组赋值。
二维数组
格式1
元素类型[][] 数组名称=new int[一维数组元素个数][二维数组元素个数]
如: int[][] arr=new int[3][4];//创建一个名为arr的二维数组,有3个一维数组,在这三个一维数组中,每个数组包含4个元素。并且初始值全部为0.
格式2
元素类型[][] 数组名称=new int{{元素,元素},{元素,元素,元素}}//里层花括号的个数代表一维数组的个数,花括号中的元素代表着相应数组里面的元素个数和值。
如:int[][] arr=new int{{1,2,4},{4,5,9}};
以前从不注重java的工作原理,但学习了毕老师的视频以后,觉得还是懂点为好。在学习的过程中,我了解到了java的内存结构,首先学到的是栈内存(栈区)与堆内存(堆区)。
栈内存
用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存
用于存储数组和对象,通过new建立的实例都存放在堆内存中
1.每一个实体都有对应的内存地址值(16进制)
2.实体中的变量都有默认初始化值。
3.实体在不被使用的时候,会在不确定的时间,被垃圾回收机制回收。
javac编译的时候,检查的是语法错误。而java,才开始分配内存,这个时候出的错误就是分配内存的问题了。
堆的特点:
1、内存地址值
2、默认初始化
3、垃圾回收机制
栈的特点:
1、自动释放
数组的定义方式:
1、Type[]=new Type[数组元素]
2、Type[]=new Type[]{数组的值1,数组的值2,数组的值3}
数组的初始化:
当创建一个数组时,每个元素被初始化。
比如:String names[]={"asdf","fda","sdfa"};
/*选择排序
*/
class A{
public static void arrayTest(int[] x){
for(int i=0;i<x.length-1;i++)
for(int j=i+1;j<x.length;j++){
if(x[i]>x[j]) { int t=x[i]; x[i]=x[j];x[j]=t;}
}
}
int[] b={12,32,41,34,54,65,567,34,345,345,2,12,74};
for(int i=0;i<b.length;i++)
System.out.print(b[i]+",");
System.out.println();
B fuck=new B();
fuck.bubbleSort(b);
for(int i=0;i<b.length;i++)
System.out.print(b[i]+",");
}
}
class B{
public void bubbleSort(int[] x){
for(int i=0;i<x.length-1;i++)
for(int j=0;j<x.length-i-1;j++){/*-i是因为每次比较都要少一个元素,外嵌的i增加1,这里就要
少一个元素。-1是因为下面的if语句,x[j+1]会发生越界。这里的“x.length-i-j"可以和”j=0“一起结合改,
只要是别越界。都OK*/
if(x[j]>x[j+1]){
int temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
/*Exception in thread "main"java.lang.ArrayIndexOutOfBoundsException:10
at A.arrayTest(FTD1.java:5)
at A.main(FTD1.java:13)
这个错误 “数组越界”,上面的classB如果不-1,就出现这个错误了
*/
}
}
}
查表法:将所有的元素零食存储起来,建立对应的关系。
1、插入数组元素,并且要让数组的顺序不被打乱——数组的折半查找!~
2、10进制转成2,16进制,查表法!
10进制转16进制,
public static void a(int num)
{
for(int x=0;x<8;x++)
{
int temp=num&15;
if(temp>9)
System.out.println((char)(temp-10+'A'));
else
System.out.println(temp);
num=num>>>4;
}
}
10转2
public static void a(int num){
while(num>0){
System.out.pirntln(num%2);// 短除法
num=num/2; // 当除到0的时候over
}
}
折半查找(前提是数组已经排序好了)
毕老师4天,数组07。
public static int getA(int[] arr,int keyi){
int min=0;max=arr.length-1,mid;// min,max 为数组的最小,最大角标,mid为中间值
while(min<=max){
mid=(max+min)/2;
if(key<arr[mid])
max=mid-1; //至于 为什么,得自己好好的想想了
else if(key<arr[mid])
min=mid+1;
else return mid;
}
return -1; // -1表示没有结果,该数组没有你要查找的数
}
注: 折半法可以用来在一个有序的数组中,插入一个元素~~~~~~~~~~~~~~~~~~~~~~~~~~,如下例
public static int getA(int[] arr,int keyi){
int min=0;max=arr.length-1,mid;// min,max 为数组的最小,最大角标,mid为中间值
while(min<=max){
mid=(max+min)/2;
if(key<arr[mid])
max=mid-1; //至于 为什么,得自己好好的想想了
else if(key<arr[mid])
min=mid+1;
else return mid;
}
return min;//由于min是向右移的,所以当min max移到重叠后,按照上面程序,还要在移一次,所以min一定是较大的数标,所以也就是插入数组的元素了!
如果是无顺序数组
那么就一个void带参数(数组)的方法,然后是for循环,条件是num==key;符合条件return,不符合继续循环,全部找完,没有就跳出for,return-1 O了~