1. 下面代码的输出结果是什么?
String s1 = "abc"; // 表示在栈区中申请一块内存,赋给s1; s1指向常量池中的"abc"
String s2 = new String("abc"); // 表示在栈区中申请一块内存,赋给s2;在堆区中申请一块内存,内容为"abc"; s2指向堆区内存
s2 = s2.intern();
System.out.println(s1 == s2);
备注: intern() - 返回 常量池中 字符串对象 的 引用
也就是,去常量池中,寻找与s2内容相同的 字符串对象, 并返回
答: true.
s2.intern()返回了常量池中的"abc"对象
2. String 是线程安全的吗?
答: 安全
因为String对象是被final修饰的,不可改变
3. 为什么在使用HashMap的时候总是使用String类作为key的类型?
答: String类的对象不可变,故其对应的哈希码值也不改变,在放入新元素的时候,无需再次计算哈希码值,故运行效率更高
4. Collection 和 Collections 有什么区别?
答: Collection 是 集合,是一个顶层的接口,包含了对集合中内容进行操作的通用的方法
Collecrions 是 工具类,提供了大量的静态方法,实现了对集合中元素的一系列操作,如排序、搜索等
5. HashMap 在 Java7 和 Java8 中有哪些主要的不同之处?
答: <1> 在结构上
HashMap在 Java7 中 是一个链表数组 (数组中的每一个元素都是一个链表)
在Java8中,如果某个链表的长度过大,或是数组的长度过大,HashMap的底层就会转化为红黑树
<2> 在功能上
在Java 7 中, 新添元素在链表的头部
在Java 8 中,新添元素在链表的尾部
6. 编程题
编程统计字符串“ABCD123!@#$%ab”中大写字母、小写字母、数字、其他字符的个数并打印出来
思路:(伪代码)
String str = “ABCD123!@#$%ab”;
int[] count = new int [4];
for (int i = 0; i < str.length; i++ ){
if ( str.chatAt[i] >= 'A' && str.charAt[i] <= 'Z' ) {
count[0] ++; // 统计大写字母的个数
}else if ( str.chatAt[i] >= 'a' && str.charAt[i] <= 'z' ) {
count[1] ++; // 统计小写字母的个数
}else if ( str.chatAt[i] >= '0' && str.charAt[i] <= '9' ) {
count[2] ++; // 统计数字的个数
}else{
count[3]++; // 统计其他字符的个数 (剩下的字符则为其他字符)
}
}
代码:
1 // 编程统计字符串“ABCD123!@#$%ab”中 2 // 大写字母、小写字母、数字、其他字符的个数并打印出来 3 4 public class Question1 { 5 public static void main(String[] args) { 6 7 // 1. 初始化字符串 8 String str = "ABCD123!@#$%ab"; 9 10 // 2.初始化4个一维数组,用来记录个数 11 int[] count = new int[4]; 12 13 // 3.遍历字符串中的每个字符 14 for (int i = 0; i < str.length(); i++) { 15 if (str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') { 16 count[0]++; // 统计大写字母的个数 17 }else if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z') { 18 count[1]++; // 统计小写字母的个数 19 }else if (str.charAt(i) >= '0' && str.charAt(i) <= '9') { 20 count[2]++; // 统计数字的个数 21 }else { 22 count[3]++; // 统计其他字符的个数 (剩下的字符则为其他字符) 23 } 24 } 25 26 // 4.输出结果 27 System.out.println("大写字母的个数为" + count[0]); 28 System.out.println("小写字母的个数为" + count[1]); 29 System.out.println("数字的个数为" + count[2]); 30 System.out.println("其他字符的个数为" + count[3]); 31 32 } 33 }
7. 编程题
准备一个HashMap集合,统计字符串"123,456,789,123,456"中每个数字字符串出现的次数并打印出来。
如:
123 出现了 2 次
456 出现了 2 次
789 出现了 1 次
思路:(伪代码)
String str = "123,456,789,123,456";
Array[] arr = str.spilt();
HashMap<key,value> map = new HashMap <key,value> ();
for(int i = 0; i < arr.length; i++ ){
if (map.keys does not contain arr[i] ){
map.addKey(arr[i]);
}
arr[i].value ++;
}
代码:
1 import java.util.HashMap; 2 3 // 准备一个HashMap集合,统计字符串"123,456,789,123,456"中 4 // 每个数字字符串出现的次数并打印出来。 5 public class Question2 { 6 public static void main(String[] args) { 7 8 // 1. 初始化字符串 9 String str = "123,456,789,123,456"; 10 11 // 2.分割字符串,分割后的元素存入数组中 12 String[] arr = str.split(","); 13 14 // 3.创建一个HashMap,统计每个数字字符串出现的次数 15 HashMap<String, Integer> numberMap = new HashMap<>(); 16 int count; 17 for(int i = 0; i < arr.length; i++) { 18 if( !numberMap.containsKey(arr[i]) ) { 19 numberMap.put(arr[i], 1); 20 }else { 21 count = numberMap.get(arr[i]) + 1; 22 numberMap.put(arr[i], count); 23 } 24 } 25 26 // 4. 打印结果 (使用Lambda表达式遍历输出) 27 numberMap.forEach((k,v) -> System.out.println(k + "的个数为:" + v)); 28 } 29 }
8. 编程题
使用集合实现斗地主游戏的部分功能,要求如下:
<1> 首先准备54张扑克牌并打乱顺序
<2> 由三个玩家交替摸牌,每人17张扑克牌,最后三张留作底牌
<3> 查看三个玩家手中的扑克牌和底牌
<4> 其中玩家手中的扑克牌需要按照大小顺序打印,规则如下:
抽中扑克牌从大到小的摆放顺序: 大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
思路 1. 描述扑克牌
List 1 --> 黑 红 方 梅 (四种花色)
List 2 --> 2,A,K,Q,J,10,9,8,7,6,5,4,3 (十三种点数)
2. 生成 54 张扑克牌
// 1. 创建一个名为 card_number的List, 用于储存每张牌所对应的编号 ( 0 ~ 53 )
List card_number = new List();
for(int i = 0; i < 54; i++) {
card_number.add(i);
}
// 2. 创建一个名为card_map的 Map, 用于储存扑克牌的信息 <key,value> = <编号,牌面值>
Map card_map --> key: 编号 ( 0 ~ 53)
value: 大王 、小王 、 List 1 X List 2
3. 打乱顺序
使用Collection中的shuffle()方法打乱 牌的编号, card_number.shuffle()
4. 将扑克牌分成三份 (每人 17 张牌)
List[] player = new List [3]; // 用于储存玩家手中的牌
List board = new List(); // 用于储存三张底牌
for (int i = 0; i < 17*3; i++) {
if ( i % 3 == 0) {
player[0].add( card_map.findValue(card_number[i]) );
}else if ( i % 3 == 1){
player[1].add( card_map.findValue(card_number[i]) );
}else{
player[2].add( card_map.findValue(card_number[i]) );
}
}
最后三张留作底牌
for (int i = 0; i < 3 ; i++){
board.add ( card_map.findValue(card_number[ 51 + i]) ); // 51 为 倒数第三张牌的编号
}
5. 根据每张牌所对应的编号,给玩家手中的牌和底牌进行排序
for ( int i = 0; i < 2; i++ ){
player[i].sort();
}
board.sort();
6. 打印三个玩家手中的牌和底牌
代码:
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.HashMap; 4 5 /* 6 使用集合实现斗地主游戏的部分功能,要求如下: 7 8 <1> 首先准备54张扑克牌并打乱顺序 9 10 <2> 由三个玩家交替摸牌,每人17张扑克牌,最后三张留作底牌 11 12 <3> 查看三个玩家手中的扑克牌和底牌 13 14 <4> 其中玩家手中的扑克牌需要按照大小顺序打印,规则如下: 15 16 抽中扑克牌从大到小的摆放顺序: 大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3 17 */ 18 19 public class Question3 { 20 21 public static void main(String[] args) { 22 23 // 1.描述扑克牌: 4种花色(pattern),13种点数(figure) 24 String[] pattern = {"黑桃","红桃","方块","梅花"}; 25 String[] figure = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"}; 26 27 // 2.生成54张扑克牌 28 // <1> 创建一个名为 cardNumber的Array, 用于储存每张牌所对应的编号(0~53) 29 ArrayList<Integer> cardNumber = new ArrayList<>(); 30 for(int i = 0; i < 54; i ++) { 31 cardNumber.add(i); 32 } 33 34 // <2> 创建一个名为cardMap的HashMap,用于储存扑克牌的信息 35 // <key,value> = <编号,牌面值> 36 HashMap<Integer, String> cardMap = new HashMap<>(); 37 38 // <3> 向cardMap集合中加入大王、小王 39 cardMap.put(0, "大王"); 40 cardMap.put(1, "小王"); 41 42 // <4> 向cardMap集合中加入其它52张牌 43 String cardString; 44 int keyIndex = 2; 45 for(int i = 0; i < 13; i ++) { 46 for(int j = 0; j < 4; j++) { 47 cardString = pattern[j] + figure[i]; 48 cardMap.put(keyIndex, cardString); 49 keyIndex++; 50 } 51 } 52 53 // 3.打乱54张牌的顺序 54 Collections.shuffle(cardNumber); 55 56 // 4.将扑克牌分成三份(每人17张牌) 57 ArrayList<Integer> player1 = new ArrayList<>(); // 用于储存玩家1手中的牌的编号 58 ArrayList<Integer> player2 = new ArrayList<>(); // 用于储存玩家2手中的牌的编号 59 ArrayList<Integer> player3 = new ArrayList<>(); // 用于储存玩家3手中的牌的编号 60 ArrayList<Integer> board = new ArrayList<>(); // 用于储存三张底牌的编号 61 62 // 添加三个玩家手中的牌的编号 63 for(int i = 0; i < 17 * 3; i++) { 64 if(i % 3 == 0) { 65 player1.add( cardNumber.get(i)); 66 }else if(i % 3 == 1) { 67 player2.add( cardNumber.get(i)); 68 }else { 69 player3.add( cardNumber.get(i)); 70 } 71 } 72 73 // 5.添加最后三张牌(底牌)的编号 74 for(int i = 0; i < 3; i++) { 75 board.add(cardNumber.get(51+i)); 76 } 77 78 // 6.根据每张牌所对应的编号(key),给三个玩家手中的牌和底牌进行排序 79 Collections.sort(player1); 80 Collections.sort(player2); 81 Collections.sort(player3); 82 Collections.sort(board); 83 84 // 7.打印玩家手中的牌和底牌 85 System.out.print("玩家1: "); 86 for(int i = 0; i < 17; i++) { 87 System.out.print(cardMap.get(player1.get(i))+" "); 88 } 89 System.out.println(); 90 91 System.out.print("玩家2: "); 92 for(int i = 0; i < 17; i++) { 93 System.out.print(cardMap.get(player2.get(i))+" "); 94 } 95 System.out.println(); 96 97 System.out.print("玩家3: "); 98 for(int i = 0; i < 17; i++) { 99 System.out.print(cardMap.get(player3.get(i))+" "); 100 } 101 System.out.println(); 102 103 System.out.print("底牌:"); 104 for(int i = 0; i < 3; i++) { 105 System.out.print(cardMap.get(board.get(i))+" "); 106 } 107 } 108 }