黑马程序员—3、JAVA基础语法&数组
来源:互联网 发布:海康 知乎 编辑:程序博客网 时间:2024/04/26 14:27
黑马程序员—3、Java基础语法&数组
--------------------- android培训、java培训、期待与您交流! ----------------------
数组概述:
数组:其实就是定义一个可以存储多个数据的容器,也称为实体。实体的定义需要使用一个关键字来完成。就是new。要明确这个实体中存储的元素的类型,和元素的个数 .
1、数组的定义形式:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
元素类型[] 数组名 ={1,2,3,4,5,6,7};可以直接指定具体的数据
元素类型[] 数组名;
数组名 = new 元素类型[元素个数或数组长度];
2、数组的特点:
1)数组定义时,必须明确数组的长度(就是数组中可以存储的元素的个数。)因为数组长度是固定的。
2)数组定义时,必须明确数组中的元素的数据类型。
案例1:
int[] arr = new int[3];
arr[0] = 89;
System.out.println(arr[2]);
3、java内存区域的划分:1)寄存器。2)本地方法区。3)方法区。 4)栈内存。5)堆内存。
为什么划分这么区域?因为每一个内存区域对数据的处理方式不同。目前要讲的就是栈和堆。
4、栈内存的特点:存储都是局部变量 ( 函数参数,函数内定义的变量,语句中定义的变量)。变量一旦使用完(作用域结束),就会在栈内存中自动释放。堆:存储的是实体(数组和对象,只要是new的,都在堆中)
5、堆内存的特点:
1,堆内存中的实体都有首内存地址值.
2,堆内存中的变量都有默认初始化值.
3,对于没有任何引用变量指向的实体,会视为垃圾,会被垃圾回收机制所回收。
6、数组常见的问题:
ArrayIndexOutOfBoundsException:数组的角标越界异常
当访问到了数组中不存在的角标时,就会发生该异常。
NullPointerException 空指针异常。
当一个引用型变量没有任何实体指向时,还在使用实体中的内容。就会发生该异常。System.out.println(arr);// [I@c17164 @前面代表一个一维数组 @后面代表一个哈希值
1,数组是什么?
数组:数组就是具有同一类型的一些数的一个集合。
2,数组有什么特点?
数组的特点:必须明确数组的长度和数组的类型,以及数组带有角标,方便使用。
3,数组什么时候使用?
当在处理多个同类型的数据时候可以采用数组存储
4,java的内存(栈和堆)的特点?
栈:存储都是局部变量(函数参数,函数内定义的变量,局部代码块中定义的变量),栈内存的变量没有初始化值。变量一点使用完(作用域结束),随着函数的加载变量会在内存中开辟属于自己的空间。一旦函数运行结束,就会在栈内存中自动释放。先进后出,后进先出。
堆:存储的是实体(数组和对象,只要是new的都在堆中)。
new关键字一出现都会在堆内存中分配实体空间。
堆内存中的所有变量都会有默认初始化值。
5,画出一个数组的内存分布图。并用文字描述步骤。 内存分布图:
int[] arr = new int[3];
arr[1]=100;
内存加载说明:
当执行到 int[] arr 时。首先在栈内存开辟一个以数组名为名的空间,这个空间的目的是存放一个堆内存中数组的内存地址。此时这个空间中并没有存放任何值。
当执行到new int[3]时,会在堆内存中首先划分出一块数组内存区域,这个时候就有一个内存地址与之对应,这里假设0x0056。然后将这个区域分成3个小空间分别代表数组的三个存储空间,他们一旦分配就会自动产生索引角标,同时也会自动初始化值,此时由于数组是int的所有初始化值为0.并将这个堆内存中的数组首地址赋值给栈内存的arr空间。当赋值后,栈内存的arr数组名就能所引到堆内存中的数组存储区域。此时整个数组的定义个空间分配结束。当执行arr[1]=100时,就会将这个以100存放到数组角标为1的空间中,原来初始化的0被覆盖。需要注意的是,一旦arr不再指向堆内存的数组存储区域时,这个数组同时也没有其他引用变量所有引用,那么堆内存中的这个数组存储区域将变成垃圾,等待JVM的垃圾回收器把它收走。
数组的简单操作、排序、最值、折半查找、查表法、数组内存分布图
一、数组的简单操作:
数组在定义的时候必须明确数组的类型和长度,并明确了数组中元素的内容。
为了方便获取数组中的元素个数的方式,可以使用数组实体一个属性。length
使用方法为 数组名.length
数组最常见的操作就是数组:遍历。其实操作数组的最终核心思想:就是操作角标(索引)。
二、最值:
class ArrayTest {
public static void main(String[] args) {
int[] arr = {3,6,8,1,88,22};
int max = getMax(arr);
System.out.println("max="+max);
}
/*
定义一个功能完成获取数组中最大值的动作。
定义一个函数来体现。
1,确定结果:整数数组中的最大值,int。
2,确定未知:数组是未知的,参数列表中有一个参数,数组类型 int[]
具体怎么功能细节如何实现呢?
思路:
1,对数组中的元素进行比较,将比较后比较大的值进行记录,并参与下一次比较。
当数组中的元素都比较完成后,最大值就已经被记录下来了。
2,每次比较的较大的值不确定,定义一个变量进行记录,该变量如何初始化呢?
只要初始化为数组中的任意一个元素即可。
3,应该让数组中的元素自动和该变量记录的元素进行比较。
所以可以使用遍历,获取出数组中的每一个元素。
4,当遍历到的元素比较变量中的记录的元素大,用该变量记录住更大的元素。
5,遍历结束后,变量中存储的就是数组中的最大值。
*/
public static int getMax(int[] arr) {
//定义变量记录较大的值。
int max = arr[0];//初始化为数组中的任意一个元素。
for(int x=1; x<arr.length; x++){
if(arr[x]>max)
max = arr[x];
}
return max;
}
//继续获取数组最大值。
public static int getMax2(int[] arr) {
int maxIndex = 0;//初始化为数组中的一个角标。
for(int x=1; x<arr.length; x++){
if(arr[x]>arr[maxIndex])
maxIndex = x;
}
return arr[maxIndex];
}
}
数组的各种操作:
class ArraySort {
public static void main(String[] args) {
int[] arr=new int[]{3,5,7,8,9,5,3,1,3,4,67,7,8,12,8,98,9};
printArray(arr);
// int max=getMax(arr);
// System.out.println("max="+max);
// int min=getMin(arr);
// System.out.println("min="+min);
// selectSortMaxToMin(arr);
// printArray(arr);
// niZhuan(arr);
// printArray(arr);
// int index=halfSearch2(arr,98);
// System.out.println("index="+index);
bubbleSort(arr);
printArray(arr);
}
/*
getMax函数用于获取int数组的最大值,需要指明具体哪一个int数组
*/
public static int getMax( int[] arr )
{
int max=arr[0];
for( int i=0 ; i<arr.length;i++ )
{
if( arr[i]>max )
{
max=arr[i];
}
}
return max;
}
/*
getMin函数用于获取int数组的最小值,需要指明具体哪一个int数组
*/
public static int getMin( int[] arr )
{
int min=arr[0];
for( int i=0 ; i<arr.length;i++ )
{
if( arr[i]<min )
{
min=arr[i];
}
}
return min;
}
/*
selectSortMaxToMin函数用于int数组的从大到小排序,需要指明具体哪一个int数组
*/
public static void selectSortMaxToMin( int[] arr )
{
for( int i=0 ; i<arr.length-1;i++ )
{
for( int j=i+1;j<arr.length;j++ )
if( arr[i]<arr[j] )
{
swap(arr,i,j);
}
}
}
/*
selectSortMinToMax函数用于int数组的从小到大排序,需要指明具体哪一个int数组
*/
public static void selectSortMinToMax( int[] arr )
{
for( int i=0 ; i<arr.length-1;i++ )
{
for( int j=i+1;j<arr.length;j++ )
if( arr[i]>arr[j] )
{
swap(arr,i,j);
}
}
}
/*
printArray函数用于int数组的打印,需要指明具体哪一个int数组
*/
public static void printArray( int[] arr )
{
for( int i=0 ; i<arr.length;i++ )
{
if( i<arr.length-1 )
System.out.print(arr[i]+",");
else
System.out.println(arr[i]+"\n");
}
}
/*
halfSearch函数采用折半法(二分法)从int数组中查找一个指定的数在此数组中的角标位置,使用之前必须保证提供的数组已经是有序的数组,需要指明具体哪一个int数组
*/
public static int halfSearch( int[] arr , int key )
{
int min,max,mid,index;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while( min<=max )
{
if( key>arr[mid] )
min=mid+1;
else if( key<arr[mid] )
max=mid-1;
else return mid;
mid=(min+max)/2;
}
return -1;
}
public static int halfSearch2( int[] arr , int key )
{
int min,max,mid,index;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while( arr[mid]!=key )
{
if( key>arr[mid] )
min=mid+1;
else if( key<arr[mid] )
max=mid-1;
else return -1;
mid=(min+max)/2;
}
return mid;
}
/*
swap函数用于交换数组中的两个数值,必须明确具体着两个数的角标
*/
public static void swap( int[] arr , int i , int j )
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;;
}
/*
niZhuan函数用于把一个数组反转
*/
public static void niZhuan( int[] arr )
{
for( int i =0, j=arr.length-1 ; i<j ;i++,j-- )
{
swap(arr,i,j);
}
}
/*
bubbleSort函数功能是用冒泡发对数组进行排序
*/
public static void bubbleSort(int[] arr)
{
for ( int i=0 ; i<arr.length-1 ;i++ )
{
for ( int j=0 ; j<arr.length-i-1 ; j++ )
{
if( arr[j]>arr[j+1] )
{
swap(arr,j,j+1);
}
}
}
}
}
查表法完成进制转换:
class ArrayTest
{
public static void main(String[] args)
{
toBin(-6);
System.out.println(Integer.toBinaryString(-6));
toHex(26);
toOctal(48);
}
//十进制--二进制
public static void toBin(int num)
{
trans(num,1,1);
}
//十进制--八进制
public static void toOctal(int num)
{
trans(num,7,3);
}
//十进制--十六进制
public static void toHex(int num)
{
trans(num,15,4);
}
public static void trans(int num,int base,int offset)
{
if(num==0)
{
System.out.println(0);
return;
}
//定义一个十六进制的元素的表。
char[] arr = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//定义一个char类型元素的数组,用于存储每次获取到的十六进制值。
char[] chs = new char[32];
int pos = chs.length;
while(num!=0)
{
int temp = num & base;
chs[--pos] = arr[temp];
num = num >>> offset;
}
// System.out.println("pos="+pos);
//打印数组内容。
for(int x=pos; x<chs.length;x++)
{
System.out.print(chs[x]);
}
System.out.println();
}
}
二维数组:
常见的二维数组的定义形式:
1、 int[][] arr = new int[3][3];
2、 int[][] arr = new int[3][]; //定义一个二维数组,明确了二维数组的长度,但是二维中的每一个一位数组没有明确
arr[0]=new int[3];
arr[1]=new int[2];
arr[2]=new int[5];
3、 int[] arr[] = new int[3][3];
4、 int arr[][] = new int[3][3];
5、 int[][] arr = {{1,3,5,6},{6,3,2},{1,2}};
什么时候使用二维数组:当数组多了就可以采用二维数组来继续存储。
中括号随着类型定义对所有变量都起作用,如果中括号在变量后面只对当前的变量起作用。
class Array2Demo
{
public static void main(String[] args)
{
// int[] arr = new int[3];
// 数组中的数组:数组中的元素还是数组。
// int[][] arr = new int[2][3];
// System.out.println(arr[0][1]);//0
// System.out.println(arr[0]);// [I@c17164
// System.out.println(arr);// [[I@c17164
int[][] arr = new int[][];//定义一个二维数组,明确了二维数组的长度,
//但是二维中每一个一维数组并没有明确。
//对二位数组中的每一个一维数组进行初始化。
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];
System.out.println(arr);//[[I@c17164
System.out.println(arr[0]);//null
class Array2Demo2
{
public static void main(String[] args)
{
//int[][] arr = {{3,7,18,5},{3,6,4,8,9},{15,89}};
int[][] arr = {{4,6,2,8},{1,9,3,2},{6,8,4,8}};
// System.out.println(arr.length);//3
// System.out.println(arr[1].length);
//遍历二维数组中的所有元素。大圈套小圈
for(int x=0; x<arr.length; x++)
{
int sum = 0;
for (int y=0; y<arr[x].length ; y++)
{
//System.out.println(arr[x][y]);
sum += arr[x][y];
}
System.out.println("sum="+sum);
}
String[] arr1 = getMonth("夏季");
for(int x=0; x<arr1.length; x++)
{
System.out.println(arr1[x]+",");
}
}
public static String[] getMonth(String str)
{
String[] season = {"春季","夏季","秋季","冬季"};
int index = searchIndex(season,str);
tring[][] month = {{"三月","四月","五月"},{"六月","七月","八月"},{"九月","十月","十一月"},{"十二月","一月","二月"}};
return month[index];
}
public static int searchIndex(String[] arr,String key)
{
for(int x=0; x<arr.length; x++)
{
if(arr[x].equals(key))
return x;
}
return -1;
}
}
--------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima- 黑马程序员—3、JAVA基础语法&数组
- 黑马程序员-day04-Java基础语法(数组)
- Java基础语法(三)---数组 (黑马程序员)
- 黑马程序员--Java基础语法---数组
- 黑马程序员--Java基础语法之数组
- 黑马程序员-----java基础语法 函数数组
- 黑马程序员 JavaSE-04 Java基础语法3:方法、数组
- 黑马程序员——Java基础语法(三)---数组
- 黑马程序员——Java基础语法(三)---数组
- 黑马程序员——Java基础语法---函数与数组
- 黑马程序员——Java基础语法---数组
- 黑马程序员——Java基础语法 之函数,数组
- 黑马程序员——java基础语法(三)---数组
- 黑马程序员——Java基础语法(三)---数组
- 黑马程序员—java基础—java基础语法:数组,二维数组,方法重载
- 黑马程序员——Java语法基础
- 黑马程序员——Java语法基础
- 黑马程序员——java基础语法
- 黑马程序员--Winform(一)
- Oracle 字符集问题
- jquery+html5 4--躲避子弹游戏1
- linux内核下载链接
- Oracle字符集问题总结
- 黑马程序员—3、JAVA基础语法&数组
- ACCESS SQL 备忘
- 布隆过滤器 bloom filter
- 杜月笙语录
- 如何删除word的分节、分页?
- 不要做浮躁的嵌入式系统工程师
- QT DEMO编译错误问题解决:arthurwidgets.cpp:54:35: error: 和gluPerspective未定义问题.
- LanAd这个小站证明百度确实不喜欢tk域名
- 递归的应用