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依旧有重载机制,类比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))
数组
数组复制
数组复制有三种方法
- 使用循环语句逐个进行复制
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];
}
}
- 使用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);
}
}
- 使用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)。如,二维数组的各行长度不同。