Java SE第四课:数组的定义与使用

编译环境:Notepad++.
1.解答第三课留下的课后题
1>.打印九九乘法表:

 //multiplicationTable   乘法表
public class Java练习{
    public static void multiplicationTable(){    
	    for(int i=1;i<10;i++)
		{
		    for(int j=1;j<=i;j++)
			{
			    System.out.printf("%d*%d=%-2d ",j,i,i*j);
			}
			System.out.println();
		}
	}
	public static void main(String[] args){
        multiplicationTable();
    }
}	

运行结果:
在这里插入图片描述

2>.(递归、迭代求阶乘)利用公式:e = 1/0! + 1/1! + 1/2! + 1/3! + 1/4! + …,计算自然对数的底 e ,n计算多少项,return返回值:

//factorial   阶乘
public class Java练习{
//1.递归方法求阶乘
    /* public static long factorial(int n){
	    if(n==0||n==1)
		{
			return 1;
		}else{
			return n*factorial(n-1);
		}
	}	 */
//2.迭代方法求阶乘(0!=1)
    public static long factorial2(int n){
		int r=1;
		for(int i=1;i<=n;i++){//i必须从1开始,若从0开始,则第一个数的阶乘无法计算,导致后面的也无法计算
			r*=i;
		}
		return r;
	}
	public static double program(int n){
		double e=0;
		for(int i=0;i<n;i++)
		{
			//e+=(1.0/factorial(i));
			e+=(1.0/factorial2(i));//r在这个函数中未定义,所以要调用函数	
		}
		return e;
	} 
	public static void main(String[] args){
		System.out.printf("e=%f%n",program(5));  //想算几项就把5换成几
	}
} 

运行结果:
在这里插入图片描述
3>.利用公式: Pi / 4 = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 - …计算 pi 的值, n 一共计算多少项,return返回值:

public class Java练习{
    public static double jiSuanPi(int n){
		double pi4=0;
		for(int i=0;i<=n;i++)
		{
			int fenmu=i*2+1;
			double dest=1.0/fenmu;
			if(i%2==0)          //i为偶数时为正
			{
				pi4+=dest;
			}else{
				pi4-=dest;       //i为奇数时为负
			}
		}
		return pi4*4;
	}
	public static void main(String[] args){
		System.out.printf("pi=%f%n",jiSuanPi(5));//5的值可以改直到和3.14接近为止
	}
}

运行结果:
在这里插入图片描述
4>. 10 进制转 16 进制,计算公式如下:例:1958 转 16 进制1958 % 16 == 6 ;1958 / 16 == 122 ; 122 % 16 == 10 也就是 A , 122 / 16 == 7 ;7 < 16 所以1958 的 16 进制 为 7A6:

//binaryConversion   进制转换
//reverse   反转
public class Java练习{
    public static String reverse(String s) {    //字符串转换
        int length = s.length();
        String r = "";
        for (int i = length - 1; i >= 0; i--) {
            r += s.charAt(i);
        }

        return r;
    }	
	public static String binaryConversion(int n) {    //进制转换
		String r = "";  
		while (n > 16) {      //while也是一种循环
			int yushu = n % 16;
			int shang = n / 16;
			
			if (yushu > 9) {
				char c = (char)((yushu - 10) + 'A'); 
				r += c;      
			} else {
				r += yushu;
			}
			
			n = shang;
		}
		
		if (n > 9) {
			char c = (char)((n - 10) + 'A');
			r += c;
		} else {
			r += n;
		}
		
		return reverse(r);
	}
	public static void main(String[] args) {
		System.out.println(binaryConversion(300));
		System.out.println(binaryConversion(1958));//括号里的值就是你要求的值
	}
}

运行结果:
在这里插入图片描述
2.数组的定义
数组是引用数据类型,有内存分配问题。
1>数组动态初始化(声明并开辟数组空间):
通式: 数组类型[ ] 数组名称=new 数据类型[长度];
例:int[] a=new int[5];
2>.赋值方式:
①int[ ] a={1,2,3,4,5}; //只能在初始化的时候使用
②int[ ] a=new int[5]; //元素的值是0,因为是取int的默认值
③int[ ] a=new int[ ] {1,2,3,4,5};
④int[ ] a=null; /只定义了一个数组类型的引用变量,没有数组对象,a没有指向任何数组/
如果数组中的元素没有初始化,元素的值就是元素类型的默认值
3>.开辟空间后,可采用以下方式进行操作:
①数组的访问通过索引完成。即:“数组名称[索引]”,注意:数组索引从0开始,因此可以采⽤的索引范围就是0~长度-1;假设现在开辟了3个空间的数组,那么可以使⽤的索引是:0、1、2。如果访问超过索引访问,那么会产⽣"java.lang.ArrayIndexOutOfBoundsException"(下标越界)异常信息。例:int[] a=null;a[0]=100;NullPointerException;
②当数组采⽤动态初始化开辟空间之后,数组之中的每个元素都是该数据类型的默认值;{1,2,3,4,5,- - - };
③数组本身是⼀个有序的集合操作,所以对于数组的内容操作往往采⽤循环的模式完成。(数组是⼀个有限的集合,采⽤for循环)
④在Java中有⼀种动态取得数组⻓度的⽅法:.length;
4>.例:二分查找

//binarySearch   二分查找
public static int binarySearch(int[] a,int v){
----------
}
int[] a={1,2,3,4,5};
binarySearch(a,3);
binarySearch(new int[] {1,2,3,4,5};//匿名数组

可进行的一些操作:
①根据下标访问对应元素:a[index] 0<=index<a.length(index类型是int型)
②遇到的异常会有:NullPointerException / ArrayIndexOutOfBounds
③获取数组的长度:a.length
3.数组的使用
1>.例:int[ ] a=null;
int[ ] a={1,2,3,4,5};
int[ ] b=a; //b也指向a指向的数组对象
b[0]=10; //a[0]=?—>a[0]=10;
在这里插入图片描述2>.变量有四种形式:
①java内存中有3个区域:栈,堆,方法区;
②形参和局部变量在栈内,对象的属性在堆内,静态属性在方法区内;
③变量是数组类型的引用,堆上实际存储对象
3>.①引用类型是个线索,用来找到堆中的真正数据<一定在堆区>;
②引用的方法调用,不管是基本数据类型还是引用数据类型,在java中都是值传递,形参的改变不影响实参;
例1:

public class HelloWorld3{
//我理解为相当于C的全局变量和局部变量同名(相等)时,优先使用局部变量
//形参的改变不会影响实参
    public static void method(int[] a){  
	    a=new int[] {11,12,13,14,15};
	}
	public static void main(String[] args){
	    int[] a={1,2,3,4,5};
		int i=0;
		method(a);
		for(i=0;i<a.length;i++)
		{
		    System.out.println(a[i]);
		}
	}
}    
//结果:a[i]={1,2,3,4,5}

例2:

 public class HelloWorld3{
    public static void method(int[] a){  
	    a[0]=10;
	}
	public static void main(String[] args){
	    int[] a={1,2,3,4,5};
		int i=0;
		method(a);
		for(i=0;i<a.length;i++)
		{
		    System.out.println(a[i]);
		}
    }
}
//结果:a[i]={10,2,3,4,5}

例3:

public class HelloWorld3{ 
    public static void main(String[] args){    //引用的方法调用是值传递
	    int[] a={1,2,3,4,5};
	    int[] b=a;
	    int i=0;
	    b=new int[] {10,11};
	    for(i=0;i<a.length;i++)
	    {
		    System.out.println(a[i]);
	    }
	}
}
//结果:a[i]={1,2,3,4,5}

4>.数组的遍历:
int[ ] a={1,2,3,4,5};
第①种形式:
for(int i=0;i<a.length;i++){
a[i] ;//进行a[i]相关的操作
}
第②种形式:
//foreach形式(老版本的java可能不支持)
for(int element:a){
element;
}
5>.使用包的语法:(先简单了解,重点后面课程再讲)
①import.java.util.Arrrays;
②加" Arrays."前缀;
6>.Java中垃圾回收(Garbage Collection)
什么是“垃圾”?
答:没有使用价值,没有引用指向的对象(数组)
7>.例题:

//交换下标为0和下标为3的数据
//swap   交换
public class HelloWorld3{
	public static void swap(int[] a,int i,int j){
		int t=a[i];
		a[i]=a[j];
		a[j]=t;
	}
	public static void main(String[] args){
		int[] a={1,2,3,4,5};
		int n=0;
		swap(a,0,3);
		for(n=0;n<a.length;n++)
		{
			System.out.println(a[n]);
		}
	}
}
//结果:a[n]={4,2,3,1,5}
//查找数组中的一个值,查找成功返回值的下标,查找失败返回-1
//binarySearch   二分查找(数组要排好序)
//import java.util.Arrays;
 public class HelloWorld3{
    public static int binarySearch(int[] a,int v){
		int left=0; 
		int right=a.length;//左闭右开
		//int right=a.length-1;//左闭右闭
		while(left<right)
		{
			int mid=(left+right)/2;
			if(v==a[mid])
			{
				return mid;//返回的是要查找数据的下标
		    }else if(v<a[mid])
			{
			right=mid;
			//right=mid-1;//左闭右闭
		    }
		    else
		    {
			    left=mid+1;
			}
		}
		return -1;
	}
	public static void main(String[] args){
        int[] a={1,2,3,4,5,6,7,8,9};
		System.out.println(binarySearch(a,3));
		//System.out.println(Arrays.binarySearch(a,3));
	}
}
//结果:2
//找出在数组中第一次出现的值,返回该值的下标
public class HelloWorld3{    //顺序查找(数组不用排序)
    public static int searchFirst(int[] a,int v){
		for(int i=0;i<a.length;i++){
			if(a[i]==v){
				return i;
			}
		}
		return -1;
	}
    public static void main(String[] args){
		 int[] a={3,2,4,7,8,3,9,0};
		System.out.println(searchFirst(a,3));
	}
}
//结果:0
 //用1填充整个数组
  //fill   填充
    public static void fill(int[] a,int v){
		int i=0;
		for(i=0;i<a.length;i++){
	    a[i]=v;
		}
	}
	public static void main(String[] args){
		int[] a={1,2,3,4,5,6};
		int i=0;
		fill(a,1);
		for(i=0;i<a.length;i++)
		{
		System.out.println(a[i]);
		}
	}
}
    //将一个数组中的值拷贝到另一个数组
import java.util.Arrays;
    public class HelloWorld3{
	    public static int[] copyOf(int[] original, int newLength) {
		int[] dest = new int[newLength];
		int length = original.length <= newLength ? original.length : newLength;//三目运算符
		for (int i = 0; i < length; i++) {
			dest[i] = original[i];
		}
		
		return dest;
	}
	public static void main(String[] args) {
		int[] a = { 1, 2, 3, 4, 5 };
		copyOf(a, 10);     //a是原数组,10是复制数组的长度 
		System.out.println(Arrays.toString(Arrays.copyOf(a, 10)));
		
		int[] b = new int[10];
		System.arraycopy(a, 0, b, 5, 5);
		System.out.println(Arrays.toString(b));    
	}
}
//结果:[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
//      [0, 0, 0, 0, 0, 1, 2, 3, 4, 5]
  

数组相关代码的练习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值