zoukankan      html  css  js  c++  java
  • 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 }

                

  • 相关阅读:
    Service Name Port Number Transport Protocol tcp udp 端口号16bit
    linux linux 互传文件 win 不通过 ftp sftp 往linux 传文件(文件夹)
    soft deletion Google SRE 保障数据完整性的手段
    Taylor series
    Taylor's theorem
    Moving average
    REQUEST
    Unix file types
    mysqld.sock
    Tunneling protocol
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/14840683.html
Copyright © 2011-2022 走看看