Java基础知识笔记 2

方法

定义方法

  • 定义方法的一般形式
修饰符	返回值类型	方法名(形式参数表)
{
	//	方法体;
}

下面是一个找例子

public static int max(int a , int b)	
{
    int result;
    if(a > b)
        result = a;
    else
        result = b;
    return result;			        //返回值
}

调用方法

仍旧以上面定义的方法为例

int z = max(x,y);	//max()内是实际参数

堆栈(call stack)

每当调用一个方法时,系统就会创建一个活动记录活动框架),用以保存方法中的参数和变量。活动记录置于一个内存区域中,称为调用堆栈(call stack)。调用堆栈也称为执行堆栈运行堆栈、或者一个机器堆栈,通常简称为“堆栈”。当一个方法调用另一个方法时,调用者的活动记录保持不动,一个新的活动记录被用于被调用的新方法。一个方法结束返回到调用者时,其相应的活动记录也被释放。

Java基础知识笔记 2

重载

Java依旧有重载机制,类比C++的机制,这里不在赘述。

生成随机字符

每个字符都有唯一的在十六进制数0到FFFF之间的Unicode。配合random()方法可以随机生成0~FFFF之间的整数。

(int)Math.random()*(65535+1)

参照这个方法,可以定义随机字符

char ('a' + Math.random()*('z'-'a'+ 1))

同时也可以申城任意两个字符ch1和ch2之间的随机字符,其中要求ch1 < ch2

(char)(ch1 + Math.random()*(ch2 - ch1 + 1))

数组

数组复制

数组复制有三种方法

  1. 使用循环语句逐个进行复制
public static void copyArray1()
{
    int [] a = {0,1,2,3,4,5,6};
		int [] b = new int [a.length];
		for( int i: a)
		{	
			b[i] = a[i];
		}
}
  1. 使用System类中的静态方法arraycopy()

arraycopy () 方法存在于java.lang.System 类中

arraycopy的语法如下

arraycopy(sourceArray, srcPos, targetArray, tarPos, length);
//srcPos 和 tarPos是源数组和目标数组的复制启示下标,length控制复制的长度
//arraycopy方法没有给目标数组分配内存空间。复制前必须创建目标数组并分配给它内存空间
//复制完成后,sourcArray和targetArray有相同的内容,但占有独立的内存空间

arraycopy使用的例子

	public static void copyArray2()
	{
		int [] a = {0,1,2,3,4,5,6};
		int [] b = new int [a.length];
		
		System.arraycopy(a,4,b,0,3);
		for(int i : b )
		{
			System.out.print(i);
		}
	}
  1. 使用clone方法复制数组

将数组传递给方法

Java采用按值传递(pass-by-value)的方式将实参传递给方法。传递基本数据类型的值与传递数组值有很大的不同

  • 对于基本数据类型参数,传递的是实参的值
  • 对于数组类型参数,参数值是数组的引用,给方法传递的是这个引用

可变长参数列表

具有相同类型的可变长度的参数可以传递给方法,并将作为数组对待

可以把类型相同但个数可变的参数传递给方法。方法中的 参数声明如下

typeName ... parameterName (类型名...参数名)

在方法声明中,指定类型后紧跟着省略号(…)。只能给方法中指定一个可变长参数,同时该参数必须是最后一个参数。任何常规参数必须在它之前。

Java将可变长参数当成数组对待。可以讲一个数组或数目可变的参数传递给可变长参数。当用数目可变的参数调用方法时,Java会创建一个数组并把参数传给它。

public class VarArray
{	
	public static void main(String [] args)
	{
        printMax();
		printMax(34,3,3,2,56.5);
		printMax(new double[] {1,2,3});
	}
	public static void printMax(double...numbers)
	{
		if(numbers.length == 0)
		{
			System.out.println("No argument passed");
			return;
		}
		double result = numbers[0];
		for(int i = 1; i< numbers.length; i++)
		if(numbers[i] > result)
			result = numbers[i];
		System.out.println("The max value is " + result);                                                                                                                                                                                                                                                                                                                                                                                                                  
	}
     }

以上代码输出是

No argument passed
The max value is 56.5
The max value is 3.0

数组的简单查找

线性查找

public static void LinearSearch(int [] a , int num)
	{
		if(a.length == 0)
			System.out.println("ERROR");
		else
			for(int i =0 ; i< a.length ; i++)
				if(a[i] == num)
					{
					System.out.println("Search the number,it's position is " + i);
					break;
					}
	}

二分查找

	public static int BinarySearch(int [] a , int num)
	{
		int left = 0;
		int right = a.length-1;
		while(left <= right)
		{
			int mid = (left + right)/2;
			if(a[mid] > num)
				right = mid -1 ;
			else if(a[mid] < num) 
				left = mid + 1;
			else if(a[mid] == num)
				{
				return mid;
				}
		}
		return -1;
	}

数组的选择排序

public static void SelectionSort(int [] a )
	{
		for(int i = 0 ; i< a.length ; i++)
		{
			int min = i;
			for(int j =i + 1; j<a.length; j++)
			{
				if(a[i] > a[j])
					{
					min = j;
					int temp = a[i];
					a[i] = a[j];
					a[j] =temp;
					}					
			}
		}
	}

Arrays 类

java.util.Arrays类包含一些实用的方法用于常见的数组操作,比如排序和查找

排序

可以使用sort或者parallelSort方法对整个数组或部分数组进行排序。

pararllelSort()方法适用于多处理器的情况

具体使用方法如下:

double[] number = {6.0,4.4,1.9,2.9,3.4,3.5};
java.util.Arrays.sort(number);	//sort the whole array
java.util.Arrays.parallelSort(number);	//sort the whole array
char [] chars = {'a','A','4','F','D','P'};	
java.util.Arrays.sort(chars,1,3);	//sort part of the array
java.util.Arrays.parallelSort(chars,1,3)	//sort part of the array

二分查找(binarySearch方法)

  • 使用该方法的前提是数组已经按照升序排好
  • 如果数组中不存在关键字,方法返回 - (插入点下标+1)

具体例子见下

import java.util.Arrays; 
int [] list = {2,4,7,10,11,45,50,58};
Array.binarySearch(list,11);
Array.binarySearch(list,12);
import java.util.Arrays; 
char [] ch = {'a','b','c'};
Array.binarySearch(ch,'a');
Array.binarySearch(ch,'d');

equals方法检测数组相等

import java.util.Arrays; 
int a = {2,3,4};
int b = {2,3,5};
int c = {2,3,4};
System.out.println(Arrays.equals(a,b));	
System.out.println(Arrays.equals(a,c));

fill方法填充数组或者部分数组

下列代码将5填充到a中,将8填充到b[1]到b[5 -1]中

import java.util.Arrays; 
int [] a = {2,4,7,10};
int [] b = {2,4,7,7,7,10};
Arrays.fill(a,5);
Arrays.fill(b,1,5,8);

toString返回字符串

import java.util.Arrays; 
int [] a = {2,4,7,10};
System.out.println(Array.toString(a));

命令行参数

  • main 方法具有String[]类型参数args,它是一个字符串数组
  • main方法就像一个带参数的普通方法,可以通过传递实参来调用一个普通方法

调用方式如下:

public class A
{
    public static void main (String [] args)
    {
        String[] strings = {"New York", "Boston","Atlanta"};
        TestMain.main(strings);
    }
}

public class TestMain{
    public static void main(String[] args)
    {
        for(int i = 0 ; i< args.length; i++)
            System.out.println(args[i]);
    }
}

向main方法传递字符串

运行程序时,可以从命令行给main方法传递字符串参数。如:

java TestMain arg0 arg1 arg2

当调用main方法时,Java解释器会创建一个数组存储命令行参数,然后将该数组的引用传递给args,如果调用n个参数的程序,Java解释权创建一个**arg = new String[n]**的数组,随后,Java解释器传递参数args去调用main方法。

如果运行程序时没有传递字符串,那么使用new String[0]创建数组。在这种情况下,该数组是长度为0的空数组。args是对这个空数组的引用。因此,args不是null,但是args.length是0。

例子,在Calculator包下定义Calculator类

package Calculator;

public class Calculator 
{
	public static void main(String [] args)
	{
		if (args.length != 3)
			System.exit(1);
		switch(args[1].charAt(0))
		{
		case '+':
			System.out.println(args[0] + " + " + args[2] + " = " + (Integer.parseInt(args[0])+Integer.parseInt(args[2]) ));
			break;
		case '-':
			System.out.println(args[0] + " - " + args[2] + " = " + (Integer.parseInt(args[0])-Integer.parseInt(args[2]) ));
			break;
		case '.':
			System.out.println(args[0] + " * " + args[2] + " = " + (Integer.parseInt(args[0])*Integer.parseInt(args[2]) ));
			break;
		case '/':
			System.out.println(args[0] + " / " + args[2] + " = " + (Integer.parseInt(args[0])/Integer.parseInt(args[2]) ));
			break;
		}
			
	}
}

在test包下对Calculator进行调用

package test;
import  Calculator;

public class TestDemo 
{	
	public static void main (String [] args)
	{
		String [] str  = {"1","+","2"};
		Calculator.main(str);
	}
}

多维数组

  • 多维数组只需要记住一句话:“多维数组也是一维数组,只不过是数组的数组
  • Java中多维数组可以实现锯齿数组(ragged array)。如,二维数组的各行长度不同。