黑马程序员——Java基础语法三

时间:2021-11-10 21:27:50
----------- android 培训 java培训 、java学习型技术博客、期待与您交流!------------

 

一、概念

        数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。

   特点:

1.能够装多个元素.

2.元素类型必须是同一类型,可以基本数据类型(四类八种),也可以使引用数据类型(,

 

二、一维数组

数组初始化概述:

Java中的数组必须先初始化,然后才能使用。

所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

数组的初始化方式

 

动态初始化:指定数组的长度,系统数组赋默认值 

 

格式

数据类型[] 数组名 = new 数据类型[长度];

举例:

int[] arr = new int[3];

解释:

int[]:定义了一个装int类型数据的数组

arr : 数组名

new : 本质在内存中开辟了一片空间.

int[3]: 表示数组的长度,也就是装元素的个数

使用数组中元素 

格式:数组名[索引值];

举例:arr[0],表示的数组中第一个元素

索引:在数组中的元素的编号,0开始,直到数组的长度-1 

演示用例:

public static void main(String[] args){

//数组动态初始化

int[] arr = new int[3];

System.out.println(arr); //[I@175078b    

System.out.println(arr[0]); //0

System.out.println(arr[1]); //0

System.out.println(arr[2]); //0 

 

System.out.println("------------");

arr[0]=3;

arr[1]=6;

arr[2]=9;

System.out.println(arr[0]); //

System.out.println(arr[1]); //

System.out.println(arr[2]); //

}

其中:new是用来在堆内存中产生一个容器实体。

数组也被称为引用数据类型。在内存中的分配如下图:

 

 黑马程序员——Java基础语法三

数组内存图

 

数组的静态初始化:指定元素的值,系统会分配长度

 

格式:

数据类型[] 数组名= new 数据类型[]{元素1,元素2...};

int[] arr = new int[]{1,2,3};

简化格式:

数据类型[] 数组名 = {元素1,元素2...};

int[] arr = {1,2,3};//静态初始化数组

//静态初始化数组

// int[] arr = new int[]{1,2,3};

int[] arr = {1,2,3};

 

System.out.println(arr);

System.out.println(arr[0]);

System.out.println(arr[1]);

System.out.println(arr[2]);

 

 

注:1、System.out.println(arr);得到的结果是一个哈希值,也叫地址值。

        2、数组在堆内存开辟空间后,就有默认的初始化值。如:int默认0;boolean默认false。

内存小知识:

        Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

        栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。

        堆内存:1、数组和对象,通过new建立的实例都存放在堆内存中。

                      2、每一个实体都有内存地址值。

                      3、实体中的变量都有默认初始化值。

                      4、实体不在被使用,会在不确定的时间内被垃圾回收器回收。

 

三、数组操作常见问题

    1、数组脚标越界异常(ArrayIndexOutOfBoundsException)。例:

             int[] arr = new int[2];

              System.out.println(arr[3]);

            访问到了数组中的不存在的脚标时发生。

    2、空指针异常(NullPointerException)。例:

            int[]arr = null;

             System.out.println(arr[0]);

             arr引用没有指向实体,却在操作实体中的元素时。

 

四、二维数组

        其实二维数组其实就是一个元素为一维数组的数组。

格式1

数据类型[][] 变量名 = new 数据类型[m][n];

m表示这个二维数组有多少个一维数组

n表示每一个一维数组的元素个数

举例:

int[][] arr = new int[3][2];

定义了一个二维数组arr

这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]

每个一维数组有2个元素,可以通过arr[m][n]来获取

表示获取第m+1个一维数组的第n+1个元素

格式2

数据类型[][] 变量名 = new 数据类型[m][];

m表示这个二维数组有多少个一维数组

这一次没有直接给出一维数组的元素个数,可以动态的给出。

 注:此种格式中每个一维数组都是默认初始化值null。

格式3

数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};

简化版格式:

数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};

注:一种特殊定义写法:int[]x,y[]; x是一维数组,y是二维数组。

二维数组在内存中的分配情况示例:

 

 黑马程序员——Java基础语法三

五、数组常见操作

遍历数组,在控制台输出数组中的元素 

 

 

数组长度属性 length 

格式 数组名.length ,表示的就是数组长度,元素的个数.

两个明确:

返回值类型: void类型

参数列表:

类型:int[] 

个数:1 

public static  void printArray(int[] arr){

for (int x=0; x<arr.length; x++){

System.out.println(arr[x]);

}

 

数组获取最值(获取数组中的最大值)

两个明确:

返回值类型: int

参数列表:

类型:int[] 

个数:1

public static void main(String[] args){

//定义数组

int[] arr = {11,22,88,107,33,44,55};

int max = getMax(arr);

System.out.println("数组中的最大值为:"+ max);

}

public static int getMax(int[] arr){

int max = arr[0]; //定义变量,可以使用第一个元素作为初始值;

for (int x = 1; x< arr.length ; x++){ //遍历数组

if (max < arr[x]){                      //比较

max = arr[x]; //max 赋值

}

}

return max;

}

数组查表法(根据指定索引,查找对应星期)

两个明确:

返回值类型:String 

列表

类型:int,String[](指的就是表

个数:2 

public static void main(String[] args){

String[]  week = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};

String w = getWeek(0,week);

System.out.println("您要查找的星期为:" + w);

}

public static String getWeek(int a, String[] arr){

if (a >0 && a <8){ //处理a,判断

return arr[a-1];

}

 return "您输入的数据不合理!";  

}

数组元素查找(查找指定元素第一次在数组中出现的索引)

1.遍历数组 

2.比较 指定元素 跟 数组元素 比较

如果相等,返回该元素索引, return 

如果不等,不管 ,继续遍历 

3.返回索引

import java.util.Scanner;

class ArrayDemo{

public static void main(String[] args){

//定义数组

int[] arr = {11,22,33,44,55,11};

int num = getNum();                 //调用录入方法,接收数据

int index = getIndex(arr,num);   //调用获取方法,并将获取的值赋给定义的变

System.out.println("指定元素的索引为:"+ index);

}

public static int getIndex(int[] arr,int num){ //定义获取索引方法

int index = -1;

   for (int i = 0;i<arr.length ;i++ ){

   if (num==arr[i]){

   index = i;

   break;

   }

   }

return index;

}

public static int getNum(){ //定义键盘录入方法

Scanner sc = new Scanner(System.in);

int num = sc.nextInt();

return num;

}

}

数组元素反转(就是把元素对调)

public static void main(String[] args){

int[] arr = {11,22,33,44,55,11}; //定义数组

sop(arr); //调用输出方法

reverse(arr); //调用反转方法

}

public static void reverse(int[] arr){                           //定义反转方法

int max = arr.length-1; //定义尾指针

int min = 0; //定义头指针

int temp; //定义变量

while (max > min){ //判断,头指针小于于尾指针说明尚未反转完

temp = arr[min] ;

arr[min] = arr [max];

arr[max] = temp; //交换元素,第三方变量法

min++;

max--;

}

sop(arr);

}

public static void sop(int[] arr){ //定义输出方法,遍历数组

for (int i = 0;i < arr.length ;i++ ){

System.out.print(arr[i]+"\t");

}

System.out.println();

}

}

 数组排序:        

选择排序: 

1、先用0角标上的元素依次与其他元素进行比较,将较小值元素存放到0角标。 

2、然后再拿1角标上的元素依次进行比较,以此类推。 

 

class SortDemo{

public static void main(String[] args){

int[] arr = {1,3,4,2,9,8,5,7,6}; //定义数组

sop(arr); //排序前打印

selectSort(arr); //调用排序方法

sop(arr); //排序后打印

}

public static void selectSort(int[] arr){

int temp = 0; //定义一个第三方变量,初始值为0

for (int i = 0;i < arr.length-1 ;i++ ){ //遍历数组,因为到最后,末尾一定最大,所以长度-1

for (int j =i+1 ;j<arr.length ;j++ ){//比较大小

if (arr[i]>arr[j]){ //判断是否满足条件

temp = arr[i];

arr[i] = arr[j];

arr[j] = temp; //采用第三方变量交换数据

}

}

      }

}

public static void sop(int[] arr){ //输出方法

for (int i = 0;i<arr.length ;i++ ){

System.out.print(arr[i]+"\t");

}

System.out.println();

   }

}

冒泡排序:

    1、先从头角标相邻两个元素之间进行比较,将较大值存放在后一个元素中,

然后再与后一个元素的进行比较,直至最大值存放到最后一个元素中。 

    2、再重复1操作,每次计较次数减一,一圈比完后存放的较大元素不再参与比较。 

class SortDemo{

public static void main(String[] args){

int[] arr = {1,3,4,2,9,8,5,7,6}; //定义数组

sop(arr); //排序前打印

bubbleSort(arr); //调用排序方法

sop(arr); //排序后打印

}

public static void bubbleSort(int[] arr){

int temp = 0;

for (int i = 0;i < arr.length-1 ;i++ ){

for (int j =0 ;j<arr.length-i-1 ;j++ ){  //-x让每一次比较的元素减少

if (arr[j]>arr[j+1]){

temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp; //第三方变量,元素呼唤

}

}

}

}

public static void sop(int[] arr){ //输出方法

for (int i = 0;i<arr.length ;i++ ){

System.out.print(arr[i]+"\t");

}

System.out.println();

}

}

折半查找

import java.util.Scanner;

class SearchDemo{

public static void main(String[] args){

int[] arr = {1,2,3,4,5,6,7,8,9}; //定义数组

System.out.println("请输入您要查询的数据:");

int num = getNum();

int res = HalfSearch(arr,num); //调用排序方法

System.out.println(res);

}

public static int HalfSearch(int[] arr,int num){

int min = 0;

int max = arr.length-1;

int mid ;

while(min<max){

            mid=(max+min)/2;//折半操作  

            if(num>arr[mid])  

                min=mid+1;  

            else if(num<arr[mid])  

                max=mid-1;  

            else  

                return mid;  

        }  

        return min;

}

public static int getNum(){ //键盘录入方法

Scanner sc = new Scanner(System.in);

int num = sc.nextInt();

return num;

}

进制转换

char[] arr = new char[8];

int pos = arr.length;

while (num!=0){

Int temp = num &15;

arr[--pos] = chs[temp];

num = num>>>4;

}

for (int x = pos;x<arr.length ;x++ ){

System.out.print(arr[x]+",");

}

思考:

   public static void main(String[] args){

int a = 10;

int b = 20;

System.out.println("a:"+a+",b:"+b);  // a:10 , b:20

change(a,b);

System.out.println("a:"+a+",b:"+b);  // ????  a:10, b:20

 

int[] arr = {1,2,3,4,5};

change(arr);

System.out.println(arr[1]);  // ????  4 ,  2  

    }

 public static void change(int a,int b){

        System.out.println("a:"+a+",b:"+b); // a:10, b:20 

        a = b;  // a20

        b = a + b;  //b 40

        System.out.println("a:"+a+",b:"+b); // a:20,b:40

    }

 

    public static void change(int[] arr){

        for(int x=0; x<arr.length; x++){

 

            if(arr[x]%2==0){  // 说明元素为偶数扩大两倍

                arr[x]*=2;

            }

        }

}

传递基本数据类型时,形参的改变对实际参数无影响

传递引用数据类型时,形参的改变对实际参数无影响

 

-----------android培训java培训、java学习型技术博客、期待与您交流!------------