《Java黑皮书基础篇第10版》 第7章【习题】

Java语言程序设计 第七章

7.2 习题

如何声明一个数组引用变量,如何创建一个数组?

elementType[] arrayRefVar;
elementType[] arrayRefVar = new elementType[arraySize];

什么时候为数组分配内存?

把数组赋值给数组引用变量时

下面代码的输出是什么?

int x =30;
int[] numbers = new int[x];
x = 60;
System.out.println("x is " + x);
System.out.println("The size of numbers is " + numbers.length);
x is 60
The size of numbers is 30

指出下列语句是对还是错:

a.数组中的每个元素都有相同的类型。 正确

b.—旦数组被声明,大小就不能改变。 错误,数组被声明时还没有大小

c.一旦数组被创建,大小就不能改变。 正确

d.数组中的元素必须是基本数据类型。错误,可以是引用类型

以下哪些语句是有效的?

char[]r = new char(1..30); //错误,类型不匹配
int i = new int(30); //错误,初始化应该用[]
char[] c = new char(); //需要说明数组有多少元素,初始化应该用[]
int i[] = (3,4,3,2); //错误,包括数组的应该是{}
float f[] = {2.3,4.5,6.6};//浮点数默认double,需要加f变float
double d[] = new double[30]; //正确

如何访问数组的元素?

arrayRefVar[index] = value;

数组下标的类型是什么?最小的下标是多少?如何表示数组名为a的第三个元素?

整数数字,0,a[2]

编写语句完成:

a.创建一个含10个double值的数组。

double a[] = new double[10];

b.将5.5賦值给数组中最后一个元素。

a[a.length - 1] = 5.5;

c.显示数组前两个元素的和。

double b = a[0] + a[1];

d.编写循环计算数组中所有元素的和。

double sum = 0;
for (int i = 0; i <= a.length - 1; i++){
	sum = sum + a[i];
}
System.out.print(sum);

e.编写循环找出数组的最小值。

double min = 0;
for (int i = 0; i <= a.length - 1; i++){
	if(a[i] <= a[0])
	min = a[i];
}
System.out.print(min);

f.随机产生一个下标,然后显示该下标所对应的数组元素。

double a[] = {1,2,3,4,5};
int x = (int)(Math.random() * 5);
System.out.print(a[x]);

g.使用数组初始化语法创建另一个初始值为3.5、5.5、4.52 和 5.6的数组。

double a[] = {3.5, 5.5, 4.52, 5.6};

当程序尝试访问下标不合法的数组元素时会发生什么?

运行错误ArraylndexOutOfBoundsException

找出错误并修改下面的代码:

public class Main{
public static void main(String[]args){ 
  double[100] r;
	for (int i = 0; i<r.length(); i++); 
  	r(i) = Math.random * 100;
}
}
public class Main{
	public static void main(String[]args){ 
			  double[] r = new double[100];
				for (int i = 0; i<r.length; i++)
					r[i] = Math.random() * 100;
		}
}

以下代码的输出是什么?

public class Main{
public static void main(String[]args){ 
  int list[] = {1,2,3,4,5,6}; 
  for (int i = 1; i < list.length; i++) 
    list[i] = list[i - 1];

	for (int i =0; i < list.length; i++)
		System.out.print(list[i] + " ");
}
}
1 1 1 1 1 1 
7.4 习题

如果将程序清单7-2替换为以下代码,程序还会挑选出四张随机的牌出来吗?

int[] deck = new int[52];
String[]suits = {"Spades","Hearts","Diamonds","Clubs"};
String[]ranks = {"Ace","2","3","4","5","6","7","8","g", "10","Jack","Queen","King"};

//Initialize the cards
for (int i = 0; i < deck.length; i++) 
  deck[i]=i;

//Shuffle the cards
for (int i = 0; i < deck.length; i++) {
  //Generate an index randomly
	int index = (int)(Math.random() * deck.length); 
  int temp = deck[i]; 
  deck[i] = deck[index]; 
  deck[index] = temp;
}

//Display the first four cards 
for (int i = 0; i < 4; i++){
	int cardNumber = (int)(Math.random() * deck.length);
	String suit = suits[cardNumber / 13];
	String rank = ranks[cardNumber % 13];
	System.out.println("Card number " + cardNumber + ": " + rank + "of " + suit);
}

会的,但是随机的牌就会通过随机数的方式选取4张,不会从已经打乱的牌堆中选择前四张了

7.5习题

使用arraycopy方法将下面的数组复制到目标数组t中:

int[] source = {3, 4, 5};
int[] source = {3, 4, 5};
int[] target = new int[source.length];
System.arraycopy(source, 0, target, 0, 3);

—旦数组被创建,它的大小不能被更改。那么下面的代码是否重设了数组的大小呢?

int[] myList;
myList = new int[l0];
//Sometime later you want to assign a new array to myList 
myList = new int[20];

没有,只是myList指向的数组变了

7.7习题

假设以下所写代码用于将数组中的内容进行反转,解释为什么它是错误的,以及如何进行修正?

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

for (int i = 0, j = list.length -1; i < list.length; i++, j--){ 
  //Swap list[i]with list[j] 
  int temp = list[i]; 
  list[i] = list[j];
	list[j] = temp;
}

反转之后又反转回去了

7.8习题

下面说法真还是假?当传递一个数组给方法时,一个新的数组被创建并且传递给方法。

传递数组给方法时,传递的只是数组的引用,真正的数组在堆中

给出以下两个程序的输出:

public class Main{
	public static void main(String[]args){ 
  	int number = 0;
		int[] numbers = new int[1];

		m(number, numbers);

		System.out.println("number is " + number + " and numbers[0] is " + numbers[0]); 
  }

	public static void m(int x, int[]y){
		x = 3;
		y[0] = 3;
  }
}
number is 0 and numbers[0] is 3
public class Main {
	public static void main(String[]args) {
    int[] list = {1,2,3,4,5}; 
    reverse(list);

		for (int i = 0; i < list.length; i++)
			System.out.print(list[i] + " ");
  }

  public static void reverse(int[] list) {
    int[] newList = new int[list.length];

		for (int i = 0; i < list.length; i++) 							
      newList[i] = list[list.length - 1 - i];
		//"="不可以复制数组,所以数组并没有翻转
		list = newList;
  }
}
1 2 3 4 5

在程序执行过程中,数组保存在哪里?给出程序清单7-4中执行displayArray、countLetters、 displayCounts过程中以及之后堆栈中的内容。

数组保存在堆中

displayArray过程中:

栈:

displayArray方法所需要的空间

main方法所需要的空间

堆:

chars数组

displayArray过程后:

栈:

main方法所需要的空间

堆:

chars数组

countLetters过程中:

栈:

countLetters方法所需要的空间

main方法所需要的空间

堆:

chars数组和counts数组

countLetters过程后:

栈:

main方法所需要的空间

堆:

chars数组

displayCounts过程中:

栈:

countLetters方法所需要的空间

main方法所需要的空间

堆:

chars数组和counts数组

displayCounts过程后:

栈:

main方法所需要的空间

堆:

chars数组

7.9习题

下面的方法头哪里有错误?

a. public static void print(String... strings, double... numbers)

b. public static void print(double... numbers, String... name)

c. public static double... print(double d1, double d2)

可变参数必须在方法参数列表中,只能有一个,且必须是方法中的最后一个参数,

可以使用下面的语句来调用程序清单 7-5 中的 printMax 方法吗?

printMax(1, 2, 3, 4, 5);
printMax(new double[] {1, 2, 3});
printMax(new int[] {1, 2, 3});

程序清单7-5的printMax方法的参数列表是double,因此前两个参数可以,最后一个类型不匹配,不行

7.10习题

如果high是一个非常大的整数,比如最大的int值2147483647, (low + high)/2可能导致溢出。如何修改从而防止溢出?

{low + (high - low)} / 2

以图7-9为例,显示如何应用二分査找法在列表{2, 4, 7, 10, 11, 45, 50, 59, 60, 66, 69, 70, 79}中査找关键字 10 和关键字 12。

10: 四次查找,最后找到

12: 四次查找,最后没找到返回-1

如果二分査找方法返回-4, 该关键字在列表中吗? 如果希望将该关键字插人到列表中,应该在什么位置?

不在列表中,应该插入到左起第四个位置

7.11习题

以图7-11为例,显示如何应用选择排序方法对{3.4, 5,3, 3.5, 2.2, 1.9, 2}进行排序。

1.9 5.3 3.5 2.2 3.4 2

1.9 2 3.5 2.2 3.4 5.3

1.9 2 2.2 3.5 3.4 5.3

1.9 2 2.2 3.4 3.5 5.3

1.9 2 2.2 3.4 3.5 5.3

应该如何修改程序清单7-8中的selectionSort方法,实现数字按递减顺序排序?

import java.util.Arrays;

public class Main {
	public static void main(String[]args) {
		selectionSort(new double[] {5, 1, 3, 4, 2});
	}
	public static void selectionSort(double[]list){ 
		for (int i = 0; i < list.length -1; i++) {
			double currentMax = list[i]; 
			int currentMaxIndex = i;

			for (int j= i + 1; j < list.length; j++) {
				//只需改动下面这行的符号方向
				if (currentMax < list[j]) {
					currentMax = list[j]; 
					currentMaxIndex = j;
				}
			}
			
			if (currentMaxIndex != i) {
				list[currentMaxIndex] = list[i]; 
				list[i] = currentMax;
			}
		}
		System.out.print(Arrays.toString(list));
	}
}
7.12习题

使用java.util.Arrays.sort方法可以对什么类型的数组进行排序?这个sort方法会创建一个新数组吗?

可以对数值型数组和字符型数组进行排序

不会创建一个新数组

为了应用 java.util.Arrays.binarySearch(array, key), 数组应按升序还是降序排列? 还是可以既非升序也非降序?

升序

给出下面代码的输出结果

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

int[] list2 = {2,4,7,10};
System.out.println(java.util.Arrays.toString(list2));
System.out.print(java.util.Arrays.equals(list1, list2));
[7, 7, 7, 7]
[2, 4, 7, 10]
false
7.13习题

本书声明 main 方法为:

public static void main(String[] args)

它可以替换为下面行中的哪些呢?

public static void main(String args[])

public static void main(String[] x)

public static void main(String x[])

static void main(String x[])

前3个都可以,只要除了参数列表都对就行

给出使用下面命令调用时,以下程序的输出。

  1. java Test I have a dream
  2. java Test “1 2 3”
  3. java Test
public class Test {
	public static void main(String[] args){
		System.out.println("Number of strings is " + args.length); 
    for(int i = 0; i < args.length; i++)
		System.out.println(args[i]);
	}
}
Number of strings is 4
I
have
a
dream
Number of strings is 1
1 2 3
Number of strings is 0
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值