JAVA第七课

跟日记本一起学JAVA!相信你可以的,加油~

本课闯关内容:1.照猫画虎(0/6)                                                                                              

                         2.基础知识(0/4...)


———————————————————————————————————————————

基础知识1:

数组   

  1. 概念: 可以通同时存储多个 相同类型的数据,并且可以对其中的多个数据统一操作。
  2. 使用数组的流程:
    (1)声明:指定数组的存储数据类型,同时指定数组名

      (建议写法)语法:              数据类型[]  数组名;    // int[]  a;           

                                                     // int  []a;   int  a[];


(2)分配空间(我起一个数组名是Ann,    Ann[5],我给Ann了5个长度(给了5个位置)):

                                    指定数组的 长度               数组名 = new 数据类型[长度];
(3)使用数组:【基础重点】

      数组中存储的数组被称为数组元素。
      对数组的操作分为:存元素 和 取元素
   
  对数组的存取元素通过数组名 和下标进行操作(也叫元素的访问):

存元素:(在那个位置放东西)    
                                                        数组名[下标] = 值;              

取元素(找那个位置的东西,也就是元素,就是调用时下标输入的数字,代表的是在数组的哪一个位置,就像数学的数列a1,a2...只不过数列的下标开头是1,而数组的下标开头是0。由上面的Ann看,你要调的时候,写的就是Ann[0],Ann[1],Ann[2],Ann[3],Ann[4],这就是调元素,取元素):   
                                                               数组名[下标]

屏幕上要显示:写System.out.println(a[0]);直接取元素

1.对数组的每一个空间进行编号,这个编号被称为下标。

              数组的下标范围: 0   ~  数组长度-1(其实就是把0当作开头,数到数组长度)

2.如果操作数组时,指定的数组下标不在 0~数组长度-1的范围内,编译通过,

            运行报错,错误信息为:java.lang.ArrayIndexOutOfBoundsException(数组的下标越界)
(用照猫画虎1举例子,
前提是:
    int[] a;
    a = new int[6];

(分配了6个空间)

    a[0]=3;
    a[1]=15;    
    a[2]=20;    
    a[3]=21;    
    a[4]=23;
    a[5]=18;
改为:
    a[0]=3;
    a[1]=15;    
    a[2]=20;    
    a[3]=21;    
    a[4]=23;
    a[5]=18;
    a[6]=20;
(多了一个下标6,总共分配了6个空间,但现在超了一个空间)


在你cmd并javac -d . Test1.java,这时不会报错,但是你输入java demo.Test1,才会出现java.lang.ArrayIndexOutOfBoundsException)
3.数组的遍历:对数组中的元素进行一一访问的过程。

        语法  :
              // 用循环的变量 控制 数组的下标                        
 for(int i=0;
i< 数组的长度;i++){

                                  // 通过 a[i] 操作数组的每一个元素

                        }

                       获取数组的长度:   数组名.length(可以动态获取)
(还拿Ann举例子)(i是一个数)i<Ann.length


4.数组具有默认值值,默认值情况如下:
             整数: 0
             小数:0.0
             布尔:false
             字符:空字符 (\u0000)
             对象/引用:null

(以照猫画虎1为例

前提是:
 int[] a;
 a = new int[6];

(分配了6个空间)

a[0]=3;
a[1]=15;    
a[2]=20;    
a[3]=21;    

a[4]=23;
a[5]=18;


改为:

a[0]=3;
a[1]=15;    
a[2]=20;    
a[3]=21;    

a[4]=23;


(少了一个下标为5的,输入java demo.Test1此时输出下标0对应的数据为:3
下标1对应的数据为:15
下标2对应的数据为:20
下标3对应的数据为:21
下标4对应的数据为:23
下标5对应的数据为:0
数组的长度6
20
0
平均值13.666666666666666
15
21
0
)下标5对应的数据为:0(int(整数)的默认值为0)


照猫画虎1:

package demo;

public class Test1{
	public static void main(String[]args){
	//存储 65名同学的年龄
	int age =18;  
	int age2 =20; 
	int age3 =18; 
    //..定义65个int类型的变量

    //定义一个  数组,存储5个学生年龄
    //1.声明
    int[] a;//声明:确定数组的数据类型和数组名
    //2.分配空间
    a = new int[6];//分配空间:确定数组的长度
    //3.使用
 	a[0]=3;
	a[1]=15;	
	a[2]=20;	
	a[3]=21;	
	a[4]=23;
	a[5]=18;
	//System.out.println(a[0]);
	//System.out.println(a[1]);
	//System.out.println(a[2]);
	//System.out.println(a[3]);
	//System.out.println(a[4]);
	//前提是没有a[5]数组,System.out.println(a[5]);java.lang.ArrayIndexOutOfBoundsException数组下标越界(访问数组时,超过数组下标的范围)
	//利用循环变量控制数组的下标
	//数组的历遍:将数组中的数据一一访问
	for(int i=0;i<a.length;i++){
	    System.out.println("下标"+i+"对应的数据为:"+a[i]);	
	}
	System.out.println("数组的长度"+a.length);
	//打印输出 数组中的偶数
	for(int i=0;i<a.length;i++){
	    if(a[i]%2==0){
		System.out.println(a[i]);
	  }
	}
	//计算数组中所有数据的平均数,并打印输出
	int sum =0;
	for(int i=0;i<a.length;i++){
    sum +=a[i];
	}
	System.out.println("平均值"+(double)sum/a.length);
	
	
	
	//打印奇数下标得内容对应的元素(下标:1.3.5-->)	
	for(int i=0;i<a.length;i++){

	  if(i%2!=0){
		System.out.println(a[i]);
	  }
	}
	//打印奇数下标,改变i
	
	}
	    
}

1.咱们的年龄是一年长一岁,所以用循环结构进行数组的遍历。
2.//打印输出 数组中的偶数
    for(int i=0;i<a.length;i++){
        if(a[i]%2==0){
        System.out.println(a[i]);
      }
    }
    //计算数组中所有数据的平均数,并打印输出

 


    //打印奇数下标得内容对应的元素(下标:1.3.5-->)    
    for(int i=0;i<a.length;i++){

      if(i%2!=0){
        System.out.println(a[i]);
      }
    }

一个是打印数组中的偶数为数组中的元素的偶数,另一个是打印奇数下标。

输出:
下标0对应的数据为:3
下标1对应的数据为:15
下标2对应的数据为:20
下标3对应的数据为:21
下标4对应的数据为:23
下标5对应的数据为:18
数组的长度6
20
18
平均值16.666666666666668
15
21
18

基础知识2:

1.数组的其他定义方式(重点)
(1)声明的同时分配空间:数据类型[]  数组名 = new  数据类型[长度];
(2)声明的同时显示初始化:数据类型[]  数组名 = new 数据类型[]{值1,值2,值3};              注意:[]中不能再指定数组的长度,长度有{}中值个数决定。
(3)
显示初始化:数据类型[]  数组名 = {值1, 值2, 值3};             注意:声明和初始化必须一起完成,同时数组的长度由{}中值个数决定。           
eg:           int[] a ;                         a = {1,7,4}; //error错误(错误的)(这是先声明再初始化这是错误的,必须同时)

            int[] a ={3,7,9,12,4};(正确的) 
 

2.数组的内存                                                  
(1)数组在内存中空间是连续的(你给分配空间(写数字,给长度)也是连续的在电脑内存中)

(2)数组名存储的是 数组在 内存中的首地址

(3)计算机中的寻址方式:首地址 + 下标 * 每一个存储空间的字节数。--->(数组名[下标])

(4)数组下标从 0开始,是为了提高 寻址效率。

(5)数组类型的变量相互赋值,传递的是数组在内存中首地址。

基本数据类型变量相互赋值,传递的是数值(在数组中传递的是数组中的元素,假如说a数组有3个元素,b数组有4个元素,把b赋给a,传递的是元素,你第一时间是不是认为b的长度大于a的长度,怎么赋值呢,不,直接赋值,之后a数组与b数组中的元素一摸一样了)。

同类型的数组类型,是可以直接相互赋值的

在这种数组的代码,一但出错有可能显示出一大堆错,先看第一行先改第一行,说不定下面的错误就都没了


照猫画虎2:

package demo;

public class Test2{
	public static void main(String[]args){
	//第二种定义方式:声明的同时并分配空间	
	double [] ds = new double[4];
    ds[0] = 9.8;	
	ds[1] = 9.0;		
	ds[2] = 7.8;			
	ds[3] = 17.8;	
	for(int i =0;i<ds.length;i++){
		System.out.println(ds[i]);
	}
	
	//第三种定义方式:声明的同时并初始化(显示的初始化)
	String[] strs = new String[]{"aa","bb","cc"};
    for(int i=0;i<strs.length;i++){
		System.out.println(strs[i]);
	}	

	//第四种定义方式:显示初始化
	int[] a ={3,7,9,12,4};
	for(int i=0;i<a.length;i++){
		System.out.println(a[i]);
	}	
	
	int[] bs =new int[3];
	for(int i=0;i<bs.length;i++){
		System.out.println(bs[i]);
	}	
	
	
	
	}
}	

int[] bs =new int[3];
    for(int i=0;i<bs.length;i++){
        System.out.println(bs[i]);
    }    
    仅声明不初始化就用到下面的知识了。

输出:

9.8
9.0
7.8
17.8
aa
bb
cc
3
7
9
12
4
0
0
0

基础知识3:

数组的扩容                                                                  

  1. 扩容思想:
    (1)先申请一个更大空间的新数组,通常新数组长度为原数组长度的2倍
    (2)将原数组中的元素进行一一复制到新数组中
    (3)新地址 覆盖 旧地址
  2. 数组扩容实现的方式:
    (1)第一种方式:

int[] a = new int[]{1,7,4,3};

// 1. 申请新数组 :长度为原有数组的2倍

int[] b = new int[a.length*2];

// 2. 将原有数组中内容进行一一拷贝到新数组中

for(int i=0;i<a.length;i++){     b[i] = a[i]; }

// 3. 新的地址覆盖旧的地址 a = b;     


          (2)第二种方式:利用 System.arraycopy(a,0,b,0,a.length);   // 完成 数组复制

            (是你填System.arraycopy(a,0,b,0,a.length);括号里的) 参数说明:
                               第一个参数:原数组名
                               第二个参数:原数组拷贝的起始下标                               
                               第三个参数:新数组名                                                                                                                   第四个参数:新数组的存储起始下标                                                                                             第五个参数:拷贝的个数/长度

          (3)第三种方式:利用 java.util.Arrays.copyOf(原数组名,新数组的长度) ; // 完成新数组的定义+数组的复制           

                                        (还是填java.util.Arrays.copyOf(原数组名,新数组的长度) ;括号里的,)参数说明:第一个参数:扩容的数组名(就是你想扩容的数组名,也就是原数组名)
                             第二个参数:指定新数组的长度

照猫画虎3:

package demo;

public class Test1{
	public static void main(String[]args){
		int[]a={1,8,4,6};
		//扩容:
		//1.定义一个更大长度的新数组
		int []b=new int[a.length*2];
		//2.将原来数组中的数据赋值到新的数组中
		for(int i=0;i<a.length;i++){
			b[i]=a[i];
			
		}
		//3.新的地址覆盖旧的地址
		a=b;
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]);
			
		}
		
		//第二种扩容方式:借助工具类
		a=java.util.Arrays.copyOf(a,a.length*2);
		System.out.println("第二次扩容之后的数据:");
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]);
			
		}
		
	}
}

输出:

1
8
4
6
0
0
0
0
第二次扩容之后的数据(int []b=new int[a.length*2];,这不就是乘以2倍了嘛,原来是8个长度,现在是16个长度,但是我们只给前4个元素了,所以不管是扩容前还是扩容后,之后的位置都输出的默认值):
1
8
4
6
0
0
0
0
0
0
0
0
0
0
0
0



基础知识4:
 

数组的排序

1.冒泡排序法:将相邻的两个元素进行一一比较,元素大逐步往后移。 (从小到大排序)  (照猫画虎4就是用的这个方法)

 

2.选择排序:固定一个下标对应的元素,和其他元素进行一一比较,较小数据逐步往前移。(从小到大排序)

3.利用 java.util.Arrays.sort(数组名); 进行排序 --->快速排序

照猫画虎4:

package demo;

public class Test2{
	public static void main(String[]args){
		
		
		
		int[]a={9,4,5,2};
		//将数组中数据进行从小到大排序
		/*冒泡排序:相邻的两个元素进行一一比较
		/*
		
		两个比较项:j控制比较第一个下标,j+i第二个比较项
		每次都是a[j]和a[j+1]进行比较
		
		*/
		//外层循环:控制重复轮数
		
		
		for(int i=0;i<a.length;i++){
			for(int j=0;j<a.length-i;j++){
				
			//判断a[j]和a[j+1]的大小
				if(a[j]>a[j+1]){
					//需要两个变量之间进行交换
					int temp =a[j];//借助第三个变量实现两个变量交换
					a[j]=a[j+1];
					a[j+1]=temp;
				}
			}
		}
		//第一轮:i=1
		/*for(int j=0;j<3;j++)*/
		java.util.Arrays.sort(a);
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]);
		}
		
	}
}

输出:

2
4
5
9

基础知识5:

二维数组                                                              

  1. 语法:
    (1)声明:数据类型 [] [] 数组名;
    (2)分配空间:数组名 = new 数据类型[行数] [列数];  // 行 又称为高维     列:低维
  2. 二维数组的使用:
    (1)通过行和列对二位数组进行访问(语法)(前面的[]为行标,后面的[]为列标,前后不能变):数组名[行标] [列标]            
    注意:行标和列表都是从 0 开始

     例如: a[0] [3]  // 第0行第3列的元素


        (2)二维数组也具有默认值,同一维数组
        (3)获取二维数组的行数: 数组名.length

              列数:数组名[行标].length 注意:二维数组是一维数组的一维数组。

 

3.二维数组的其他定义方式
  (1)声明的同时并分配空间:数据类型[][] [] [] 数组名 = new 数据类型[行数] [列数];
  
(2) 显示初始化:数据类型[] [] 数组名 = new 数据类型[] []{{值1,值2},{值3,值4},{值5,值6}};               注意:后面 {} 中 {}的个数决定行数,所以[] []中个不能再制定行数和列数。
  (3) 显示初始化:数据类型[] [] 数组名 = {{值1,值2},{值3,值4}};              注意:声明和初始化必须一起完成。

4.不规则的二维数组
(1)概念:每一行的列数不相同
(2) 不规则的二维数组的定义方式:

             a.(行数确定了,列数一个个定义)
                ​​​​​​​数据类型[] [] 数组名 = new 数据类型[行数] [];

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

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

            ....

           注意:二维数组定义可以只指定行数/高维,但是不能只指定列数/低维

            ​​​​​​​b.数据类型[] [] 数组名 = {{值1},{值1,值2,值3},{值1,值2}};

 

 

基础知识6:

 (这个其实我也不太了解)

  1. 可变长参数:函数可以接受个数不固定的实参,jdk5.0 提出的概念。
  2. 注意:参数的个数由调用者调用数给定 个数确定;可变长参数可以接受不等数量的相同类型的数据。
  3. 语法: public static 返回值类型 函数名(数据类型... 变量名){}
  4. 使用:可变长参数会自动生成对应类型数组,所以在函数中直接将 可变长参数当做数组应用即可。

      5.语法规定:一个函数中最多只能定义一个可变长参数,并且可变长参数必须定义在形参最后           一个位置。

      6.可变长参数:可以提高代码的灵活度。




跟我一步步学,慢慢走。
未完待续。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值