一、选择题
1、【自动装箱与拆箱】
public class Test{
public static void main(String[] args){
int x = 100;
int y = 100;
Integer wx = x;
Integer wy = y;
System.out.println(x == y);
System.out.println(wx == wy);
}
}
问这段程序的输出:true true
错误分析:Integer两次打包过程中都会创建新的Integer对象,所以wx和wy是两个不同的对象。
正确分析:
Integer和Long、Double、Float、Boolen等类是打包器(Wrapper),可以将基本类型打包在对象之中。
Integer wx = x; 在这个打包基本类型的过程中,wx会参考Integer实例。
自动装箱是编译程序蜜糖,非常方便使用,但也隐藏了一些细节,实际上会使用Integer.valueOf()来建立Integer实例,valueOf()的操作内容:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i); //创建新的实例
}
如果传入的int在 IntegerCache.low 和 IntegerCache.high之间,就尝试看看前面缓存(cache)中有没有打包过相同的值,如果有就直接返回。
所以题目中wy打包时,没有运行到new Integer(i),也就没有创建新的实例(只有new才创建新的实例)。wx和wy中打包的是同一个Integer实例。
二、操作题
1、洗牌程序
要求攥写一个简单的洗牌程序,可在文本模式下显示洗牌结果。例如:
梅8 桃4 梅4 梅3 方9 方10 心11 梅12 桃7 方4 方3 方6 方11
桃12 方8 桃11 心1 桃2 梅6 桃3 梅2 梅7 桃10 方2 心7 心9
桃1 方5 心5 梅5 心13 心3 心4 桃5 方1 梅13 心6 心12 心10
桃8 方7 桃9 梅10 方12 梅9 心8 心2 桃6 梅1 梅11 桃13 方13
一开始没有什么思路,想着花色和数字都要随机生成,怎样结合就完全没有思路。
其实虽然每个数字出现四次,但完全可以当成一个长度54的数组的随机打乱,因为牌的张数是52,每张牌都是独一无二的,对应数组索引0~51。然后可以用整除和取余的方法分别表示数字和花色。
那么怎样打乱呢?有两种方法:
1、每次输出时就生成一个随机数,输出的就是这个随机数所对应的牌
缺陷——随着生成随机数的数量增加,新的随机数与已产生的随机数相同的可能性越来越大,有可能出现算法延迟问题
2、现将52张牌与牌面顺序排放,再将其随机打乱。每次循环生成一个0~51之间的随机数 j ,然后将result中的result[i]与随机选出的result[j]进行交换。
此法更高效
Java生成随机数的两种方法:
// new Random()
public static void main(String[] args) {
Random rand = new Random();
for (int i = 0; i < 10; i++) {
System.out.println(rand.nextInt(100) + 1);
}
}
// int randNumber = rand.nextInt(MAX - MIN + 1) + MIN;
// Math.random()返回[0.0, 1.0)的double型数值
public void test2() {
for (int i = 0; i < 10; i++) {
int ran = (int) (Math.random() * 100 + 1); //范围[0,100]
System.out.print(ran + " ");
}
}
完整程序:
import java.util.Random;
public class Test{
public static void main(String[] args){
String[] color = {"方", "心", "梅", "桃"};
int[] poker = new int[52];
for(int i = 0; i < 52; i++){
poker[i] = i;
} //初始化
Random rand = new Random();
for(int i = 0; i < 52; i++){
int ran = rand.nextInt(52); //范围0~51
// System.out.println(ran);
//交换poker[i]与poker[ran]
int temp = poker[i];
poker[i] = poker[ran];
poker[ran] = temp;
}
//输出文本
for(int i = 0; i < 52; i++){
System.out.printf("%s%d\t",color[poker[i]%4],poker[i]/4+1);
if((i+1)%13 == 0) System.out.println();
}
}
}