• Java 核心类库 (一) 练习


    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 }

                

  • 相关阅读:
    不同类型的磁盘存储在Ubuntu下的性能测试
    Ubuntu16.04编译安装Redis Desktop Manager
    gnu screen的用法
    MySQL Workbench常用快捷键
    Libevent例子(二)
    Libevent例子(一)
    Ubuntu下的init.d管理update-rc.d
    Centos7 修改终端文字显示颜色
    通过socks tunnel设置http代理
    linux:C++的socket编程
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/14840683.html
Copyright © 2020-2023  润新知