JAVA笔试面试题集锦03

1.3 JAVA核心API-String、正则表达式、Object、包装类、日期操作等

【题目描述】

         What will be the output when you compile and execute the following program. The symbol ’? ’ means space.

1:public class Base{

2:

3:      private void test() {

4:

5:      String aStr = "? One? ";

6:      String bStr = aStr;

7:      aStr.toUpperCase();

8:      aStr.trim();

9:      System.out.println("[" + aStr + "," + bStr + "]");

10:    }

11:

12:    static public void main(String[] a) {

13:   new Base().test();

14:   }

15: }

Select most appropriate answer.

【选项】

A. [ONE,? One? ]

B. [? One? ,One]

C. [ONE,One]

D.[ONE,ONE]

E. [? One? ,? One? ]

【正确答案】        E

【解释】

通过 String bStr = aStr;这句代码使 bStr 和 aStr 指向同一个地址空间,所以最后 aStr 和 bStr 的结 果应该是一样,String 类是定长字符串,调用一个字符串的方法以后会形成一个新的字符串。

 

【题目描述】

Given:

public class Test {

        private static float[] f = new float[2];

        public static void main(String args[]) {

                  System.out.println(“f[0] = “ + f[0]);

        }

}

What is the result?

【选项】

A. f[0] = 0

B. f[0] = 0.0

C. Compilation fails.

D. An exception is thrown at runtime.

【正确答案】        B

 

【题目描述】

Given:

public class Test {

       public static void main (String [] args)    {

               String foo = “blue”;

               String bar = foo; foo = “green”; System.out.println(bar);

       }

}

What is the result?

【选项】

A. An exception is thrown.

B. The code will not compile.

C. The program prints “null”

D. The program prints “blue”

E. The program prints “green”

【正确答案】        D

【解释】

采用 String foo = “blue”定义方式定义的字符串放在字符串池中,通过 String bar = foo;

他们指向了同一地址空间,就是同一个池子,当执行 foo = “green”; foo 指向新的地址空间。

 

【题目描述】

指出下列程序运行的结果

public class Example{

         String str=new String("good");

         char[]ch={'a','b','c'};

         public static void main(String args[]){

                  Example ex=new Example();

                  ex.change(ex.str,ex.ch);

                  System.out.print(ex.str+" and ");

                  System.out.print(ex.ch);

         }

         public void change(String str,char ch[]){

                  str="test ok";

                  ch[0]='g';

         }

}

【选项】

A. good and abc                        B. good and gbc

C. test ok and abc           D. test ok and gbc

【正确答案】        B

【解释】

数组和字符串都是引用类型。

【题目描述】

给出如下声明:

String s = “Example”; 合法的代码由哪些?

【选项】

A. s>>>=3   B. s[3]= “X”    C. int i = s.iength()     D. s = s +10

【正确答案】        D

【解释】

A.     移位运算,要是整数类型。;B.s 不是数组;C.String 类取长度的方法为:length()          D. 字符串相加

【题目描述】

正则表达式”\d+\.?\d*”在匹配下列字符串时结果是失败的是?

【选项】

A. 12.5              B. 1.25      C. 以上都成功        D. 以上都失败

【正确答案】        B

【解释】

\d+ 表示可以出现 1 次或是 n 次数字

\. .? 表示可以“.”可以出现一次,也可以不出现

\d* 表示可以出现 0 次或是 n 次数字

 

【题目描述】

Which code determines the int value foo closest to a double value bar?

【选项】

A. int foo = (int) Math.max(bar);

B. int foo = (int) Math.min(bar);

C. int foo = (int) Math.abs(bar);

D. int foo = (int) Math.ceil(bar);

E. int foo = (int) Math.floor(bar); F. int foo = (int) Math.round(bar);

【正确答案】        DEF

【解释】

A B 两个选项方法是用错误,都是两个参数。

abs 方法是取 bar 的绝对值,ceil 方法返回最小的(最接近负无穷大)double 值,该值大于等于参数,并等于某个整数。floor方法返回最大的(最接近正无穷大)double值,该值小于等于参数,并等于某个整数。round方法返回最接近参数的 long。

 

【题目描述】

String       s=new String(“hello”);     String  t =new String(“hello”);

char c [ ] ={‘h’,’e’,’l’,’l’,’o’};

下列哪些表达式返回 true ?

【选项】

A.s.equals(t);                B.t.equals(c);                 C.s= =t ;

D.t.equals (new String(“hello”));                      E.t= = c;

【正确答案】        AD

【解释】

String 类的 equals 方法已经覆盖了Object 类的 equals 方法,比较的是两个字符串的内容是否相等,双等号比较的是两个对象的内存地址是否相等

 

【题目描述】

String,StringBuffer,StringBuilder 的区别。

【正确答案】       

String 的长度是不可变的;

StringBuffer 的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时, 那么使用 StringBuffer,如果最后需要 String,那么使用 StringBuffer 的 toString()方法;线程安全;

StringBuilder 是从 JDK 5 开始,为 StringBuffer 该类补充了一个单个线程使用的等价类;通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

 

【题目描述】

如何格式化日期

【正确答案】       

Date now=new Date();

SimpleDateFormat sdf=new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);

String formatNow=sdf.format(now);

变量 formatNow 就是格式化好的日期。

 

【题目描述】

将字符“12345”转换成 long 型

【正确答案】       

String s="12345";

long num=Long.valueOf(s).longValue();

 

【题目描述】

数组有没有 length()这个方法?String 有没有 length()这个方法?

【正确答案】       

数组没有 length()方法它有length 属性String 有 length()方法。

 

【题目描述】

请写出如下正则表达式的含义;

com︱cn︱net

^http://www.d-heaven.com/$

^http://www.sina.com.cn/new/newid=\d+

【正确答案】       

com︱cn︱net 表示匹配 com 或是 cn 或是 net 中一个

^http://www.d-heaven.com/$ 表示匹配:http://www.d-heaven.com/

^http://www.sina.com.cn/new/newid=\d+ 表示匹配 错误!超链接引用无效。多个数字

 

【题目描述】

在 web 应用开发过程中经常遇到输出某种编码的字符,如从 GBK 到 iso8859-1 等,如何输出一个 某种编码的字符串?

【正确答案】       

public static String translate(String str) {

         String tempStr = "";

         try {

                  tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");

                  tempStr = tempStr.trim();

         } catch (Exception e) {

                  System.err.println(e.getMessage());

         }

         return tempStr;

}

 

【题目描述】

请写出一个公用方法,输入 String 返回该串是否含有非空字符,并写出 junit 的测试用例。

【正确答案】       

public class TestString {

         public static boolean hasBlank(String str) {

                  if (str.endsWith("") || str.startsWith("")) {

                          return false;

                  } else {

                          String[] strs = str.split("");

                          if (strs.length == 1) {

                                   return false;

                          }

                  }

                  return true;

         }

@Test

         public void testFun() {

                  System.out.println(TestString.hasBlank("test"));

         }

}

【题目描述】

编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是 要保证汉字不被截半个,如"我 ABC"4,应该截为"我 AB",输入"我 ABC 汉 DEF",6,应该输出为"我 ABC"而不是"我 ABC+汉的半个"。

【正确答案】       

package com.tarena;

public class SplitString {

         String SplitStr;

         int SplitByte;

         public SplitString(String str, int bytes) {

                  SplitStr = str;

                  SplitByte = bytes;

                  System.out.println("The String is:" + SplitStr + ";SplitBytes="+ SplitByte);

         }

         public void SplitIt(){

                  int loopCount;

                  loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):

                                            (SplitStr.leng th()/SplitByte+1);

                  System.out.println("Will Split into "+loopCount);

                  for (int i=1;i<=loopCount ;i++ ){

                          if (i==loopCount){

                                   System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));

                          } else {

                                   System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));

                          }

                  }

         }      

         public static void main(String[] args) {

                  SplitString ss = new SplitString(

                          "test 中 dd 文 dsaf 中男大 3443n 中国 43 中国人 0ewldfls=103", 4);

                  ss.SplitIt();

         }

}

【题目描述】

假定屏幕的像素宽度为 screenWidth,写一个函数计算一个字符串需要分成几行显示。 要求:

1)、每行应尽可能多地显示字符,但不能有字符部分或完全显示在屏幕外。超过部分的字符换下一行 显示。

2)、每个字符的像素宽度不一样,每个字符的像素宽度不一样。用 int GetCharWidth(char c)获得每个字符的像素宽度

【正确答案】       

/**

* 计算一个字符串可以分多少行进行显示

* @param s原始字符串

* @param screenWidth屏幕宽度

* @return 行数

*/

public int calcLineNum(String s, int screenWidth) {

  int length = 0;

  // 行数

  int n = 0;

  // 统计长度

  for (int i = 0; i < s.length(); i++) {

           // 当前字符的宽度

           int charLen = GetCharWidth(s.charAt(i));

           // 总长度增加

           length += charLen;

           // 如果达到屏幕宽度

           if (length > screenWidth) {

                   n++; // 行数+1

                   length = charLen; // 重新计算长度

           }

  }

  // 最后一行处理

  if (length > 0) {

           n++;

  }

  return n;

}

【题目描述】

写一个函数去掉一个字符串中单词间多余的空格,使得相邻两个单词间有且只有一个空格。例如当输入字符串是“Hello!_ _Game_programming_ _world!”时,调用该函数后字符串变为“Hello!_Game_programming_world!”。

【正确答案】       

/**

* 去除字符串中多余的空格

* @param s需要处理的字符串

* @return 处理后的字符串

*/

public String trimSpace(String before) {

         String temp= "" + before.charAt(0);

         for (int i = 1; i < before.length(); i++) {

                  char c = before.charAt(i);

                  // 如果当前字符是空格

                  if (c == ' ') {

                  // 判断前一个不是是空格则添加,否则不添加

                          if (before.charAt(i - 1) != ' ') {

                                   temp += c;

                          }

                  } else {

                          temp += c;

                  }

         }

         return temp;

}

 

【题目描述】

         找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的最大子串为"actyet"。

【正确答案】       

public class MaxSameString {

   public static void main(String[] args) {

       MaxSameString mss = new MaxSameString();

       System.out.println(mss.getMaxSubString("找到相同字符后",

                                                     "再循环判断之后的字符知否相同"));

   }

   public static String getMaxSubString(String str1, String str2) {

       int maxLen = 0;

       String result = "";

       for (int flag1 = 0; flag1 < str1.length(); flag1++) {

           for (int flag2 = 0; flag2 < str2.length(); flag2++) {

               int len = 0;

               String str = "";

               // 找到相同字符后,再循环判断之后的字符知否相同,

                                   记录相同的字符长度,判断是否为最大子串

               if (str1.charAt(flag1) == str2.charAt(flag2)) {

                   int i = flag1;

                   int j = flag2;

                   while (i < str1.length() && j < str2.length()

                           && str1.charAt(i++) == str2.charAt(j++)) {

                       len++;

                       str = str + str2.charAt(j - 1);

                   }

                   if (len > maxLen) {

                       maxLen = len;

                       result = str;

                   }

               }

           }

       }

       return result;

   }

}

 

【题目描述】

               Java实现字符串压缩算法。

【正确答案】       

public class StringCompression {

 private StringBuffer sb = new StringBuffer();

 /**

  * aaabcdda--->3a1b1c2d1a

  *

  * @param sourceStr

  * @return

  */

 public String compression(String sourceStr) {

  if (sourceStr == null || "".equals(sourceStr)) {

   ;

  } else {

   //字符串长度

   int strLen = sourceStr.length();

   //字符串中第一个字符

   char firstChar = sourceStr.charAt(0);

   int count=1;

   //用于截串,字符串的起始位置

   int index = 0;

   if (strLen > 1) {

    for (int i = 1; i < strLen; i++) {

     char c = sourceStr.charAt(i);

     if (!String.valueOf(firstChar).equals(String.valueOf(c))) {

      index = i;

      break;

     }else{

       //统计相同字符的个数

       ++count;

     }

    }

    //相同字符的字符串,在sb中追加字符串长度和首字符

    if (index == 0) {

     return sb.append(strLen).append(firstChar)

       .toString();

    }

    sb.append(count).append(firstChar);

   } else if (strLen == 1) {  //字符串长度为1时

    return sb.append("1").append(firstChar).toString();

   }

   //起始索引必须小于等于结束索引,否则会报越界错误

   if (index <= strLen)

    compression(sourceStr.substring(index, strLen));

  }

  return sb.toString();

 }

 public static void main(String[] args) {

  StringCompression sc = new StringCompression();

  String sourceStr = "aaabcdda";

  String resultStr = sc.compression(sourceStr);

  System.out.println(resultStr);

 }

}

【题目描述】

编写一个加密类Ecryption,在其中实现对字符串的加密和解密方法。加密原理是:

加密后的字符串的第一个字符是原字符串的最后一个字符,其余的每个字符是对应的原字符串中的前一个字符的值加上3。比如:“welcome“,末尾的字符为’e’;“welcom“依次加上3后成为“zhofrp“,故加密后的结果为“ezhofrp“

【正确答案】       

class Ecryption{

           //加密方法:输入明文,返回密文

 public String encrypt(String source){

                   //加密代码

   }

   //解密方法:输入密文,返回明文

 public String decrypt(String dest){

                   //解密代码

    }

}

 

public class EncryptDecrypt {

  public static void main(String[] args) {

           String source="Apple12大连";

           String dest=encrypt(source);

           System.out.println(source+" 加密==>"+dest);

           String resultSource=decrypt(dest);

           System.out.println(dest+" 解密==>"+resultSource);

  }

//       加密函数

  static public String  encrypt(String str){

           StringBuilder result=new StringBuilder(str.substring(str.length()-1));//取最后一个字符放到结果字符串的开头

           for(int i=0;i<str.length()-1;i++){

                   char c=(char)(str.charAt(i)+3);//取出第i个字符;

                   result.append(c);

           }

           return result.toString();

  }

  //解密函数

  static public String  decrypt(String str){

           StringBuilder result=new StringBuilder();//取最后一个字符放到结果字符串的开头

           for(int i=1;i<str.length();i++){

                   char c=(char)(str.charAt(i)-3);//取出第i个字符;

                   result.append(c);

           }

           result.append(str.charAt(0));//原来第一个字符到现在最后一个字符

           return result.toString();

  }

}

【题目描述】

               编写一个函数将一个十六进制数的字符串参数转换成整数返回。

【正确答案】       

  String str = “13abf”;

  int len = str.length;

  int sum = 0;

  for(int i=0;i<len;i++){

           char c = str.charAt(len-1-i);

           int n = Character.digit(c,16);

           sum += n * (1<<(4*i));

  }

 

 

 

【题目描述】

以下代码,请问答以下的打印语句的输出结果是什么?

public static void main(String[] args){

                  String classPath="java.lang.String";

                  System.out.println(classPath.replaceAll(".","/")); 

}

【正确答案】       

        

 

 

【题目描述】

查看下面的代码,写出可以使程序正常执行的修改方法

1.public class MyClass {

2.static String s1;

3.      String s2;

4.      public static void main(String args[]) {

5.      String s3;

6.      System.out.println("s1 =" + s1);

7.      System.out.println("s2 =" + s2);

8.     System.out.println("s3 =" + s3);

9.     }

10.}

【正确答案】       

删除第 8 行或者将第 6 行改为 String s3 = "";

 

 

【题目描述】

         为了显示 myStr = 23 这样的结果,写出在控制台输入的命令

public class MyClass {

         public static void main(String args[]) {

                  String s1 = args[0];

                  String s2 = args[1];

                  String myStr = args[2];

                  System.out.printin("myStr =" + s2 + myStr);

         }

}

【正确答案】       

java MyClass 1 2 3 4

 

【题目描述】

写出下面代码的执行结果

public class MyClass {

         static void aMethod(StringBuffer sf1, StringBuffer sf2) {

                 sf1.append(sf2);

                 sf2 = sf1;

         }

         public static void main(String[] args){

                 StringBuffer sf1 = new StringBuffer("A");

                 StringBuffer sf2 = new StringBuffer("B");

                 aMethod(sf1,sf2);

                 System.out .println(sf1+ ":"+sf2);

         }

}

【正确答案】       

AB:B

 

【题目描述】

第 3 行中生成的 object 在第几行执行后成为 garbage collection 的对象?

1.public class MyClass {

2.     public StringBuffer aMethod() {

3.     StringBuffer sf = new StringBuffer("Hello");

4.     StringBuffer[] sf_arr = new StringBuffer[1];

5.     sf_arr[0] = sf;

6.     sf = null;

7.     sf_arr[0] = null;

8.     return sf;

9.     }

10.}

【正确答案】       

         第 7 行

 

【题目描述】

请用正则表达式匹配出 QQ 号(假设 QQ 号码为 5—10 位);

【正确答案】        ^ \d{5,10}$

1.4 JAVA核心API-集合操作

【题目描述】

               下面代码的执行结果是?

import java.util.*;

public class ShortSet{

  public static void main(String args[]){

    Set<Short> s=new HashSet<Short>();

       for(Short i=0;i<100;i++)

 {

          s.add(i);

          s.remove(i-1);

 } System.out.println(s.size());

  }

}

【选项】

A. 1

B. 100

C. Throws Exception

D. None of the Above

【正确答案】        B

【解释】

i 是 Short 类型     i-1 是 int 类型,其包装类为 Integer,所以 s.remove(i-1);不能移除 Set 集合中 Short类型对象。

 

 

【题目描述】

请选出下列正确的答案。(    )

1. import java.util.*;

2. public class WrappedString {

3.      private String s;

4.      public WrappedString(String s) { this.s = s; }

5.      public static void main(String[] args) {

6.               HashSet<Object> hs = new HashSet<Object>();

7.               WrappedString ws1 = new WrappedString("aardvark");

8.               WrappedString ws2 = new WrappedString("aardvark");

9.               String s1 = new String("aardvark");

10.             String s2 = new String("aardvark");

11.             hs.add(ws1); hs.add(ws2); hs.add(s1); hs.add(s2);

12.             System.out.println(hs.size()); } }

【选项】

A. 1

B. 4

C. 2

D. 3

【正确答案】        D

 

【题目描述】

下面哪个是链式存储并快速顺序(不需要随机访问)访问的集合类型?(    )

【选项】

A. java.util.LinkedList 

B. java.util.Queue 

C. java.util.ArrayList 

D. java.util.LinearList 

【正确答案】        B

 

【题目描述】

关于以下代码正确的描述正确的有( )

   public class Cats{

       public static void main(String args[]){

          List<Cat> cats = new ArrayList<Cat>();

               cats.add(new Cat());

               Animal b = new Animal();

               Cat a = null;

               if(b  instanceof Animal) a = (Cat)b;

               if(a != null)  cats.add(a);

                System.out.println(cats.size() +"cats");

         }

   }

   calss Animal {}

   class Cat extends Animal{}

【选项】

A. 编译失败

B. 输出1 cats

C. 输出2 cats

D. 运行时抛出异常

【正确答案】        D

 

【题目描述】

如果要保证元素唯一,且按照存放顺序读取,可以选用( )

【选项】

A. Map  B. Set  C. LinkedList  D. LinkedHashSet

E. SortedMap   F. Collection

【正确答案】        D

 

【题目描述】

若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的借点访问顺序是( )

【选项】

A. bdgcefha  B. gdbecfha  C. bdfaechf  D.gdbehfca

【正确答案】        D

 

【题目描述】

链表具有的特点是:

【选项】

A. 不必事先估计存储空间

B. 可随机访问任一元素

C. 插入删除不需要移动元素      

D. 所需空间与线性表长度成正比

【正确答案】        ACD

【解释】

A. 采用动态存储分配,不会造成内存浪费和溢出。

B. 不能随机访问,查找时要从头指针开始遍历

C. 插入、删除时,只要找到对应前驱结点,修改指针即可,无需移动元素

         D. 需要用额外空间存储线性表的关系,存储密度小

 

【题目描述】

关于 Java 语言,下列描述正确的是(   )

【选项】

A.     switch 不能够作用在 String 类型上

B.     List, Set, Map 都继承自 Collection 接口

C.     Java 语言支持 goto 语句

D.     GC 是垃圾收集器,程序员不用担心内存管理

【正确答案】        AD

【解释】

B.Map 没有继承 Collection 接口;C.java 不支持 goto 语句。

 

 

【题目描述】

Which two statements are true regarding the return values of property written hashCodeand equals methods from two instances of the same class? (Choose two)

【选项】

A. If the hashCode values are different, the objects might be equal.

B. If the hashCode values are the same, the object must be equal.

C. If the hashCode values are the same, the objects might be equal.

D. If the hashCode values are different, the objects must be unequal.

【正确答案】        CD

【解释】

先通过 hashcode 来判断某个对象是否存放某个桶里,但这个桶里可能有很多对象,那么我们就需要再 通过 equals 来在这个桶里找到我们要的对象。

 

【题目描述】

Collection 和 Collections 的区别?

【正确答案】       

Collection 是 java.util 下的接口,它是各种集合的父接口,继承于它的接口主要有 Set 和 List;Collections 是个 java.util 下的类,是针对集合的帮助类,提供一系列静态方法实现对各种 集合的搜索、排序、线程安全化等操作。

 

【题目描述】

HashMap 与 TreeMap 的区别?

【正确答案】       

HashMap 通过 hashcode 对其内容进行快速查找,而 TreeMap 中所有的元素都保持着某种固定的 顺序,如果你需要得到一个有序的结果你就应该使用 TreeMap(HashMap 中元素的排列顺序是不固定 的)。

 

【题目描述】

ArrayList 和 Vector 的区别?

【正确答案】

同步性:Vector 是线程安全的,也就是说是同步的,而 ArrayList 是线程不安全的,不是同步的;数据增长:当需要增长时,Vector 默认增长为原来一培,而 ArrayList 却是原来的一半。        

 

【题目描述】

HashMap 和 Hashtable 的区别?

【正确答案】       

HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都实现了 Map 接口,主要区别在于 HashMap 允许空(null)键值(key),由于非线程安全,效率上高于 Hashtable。HashMap 允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因为 contains 方法容易让人引起误解。Hashtable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现。最大的不同是, Hastable 的方法是 synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为 它的方法实现同步,而 HashMap 就必须为之提供同步。

 

【题目描述】

请说出 ArrayList,Vector, LinkedList 的存储性能和特性

【正确答案】       

ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加 和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以 索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但 是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

 

【题目描述】

List、Map、Set 三个接口存储元素时各有什么特点?

【正确答案】       

1)List 是有序的 Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素,这类似于 Java 的数组。

2)Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有 e1.equals(e2)=false,Set最多有一个null元素。

3)Map接口:请注意,Map没有继承Collection接口,Map提供key到value的映射。

 

【题目描述】
         在 java 中,List 是个接口,那实现 List 接口的类有哪些,有什么区别?

【正确答案】       

ArrayList 是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素, 它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而 插入数据慢,LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需 要记录本项的前后项即可,所以插入速度较快。

 

【题目描述】

判断下列语句是否正确,如果有错误,请指出错误所在?

List<Short> a = new ArrayList<Short>();

a.add(5);

【正确答案】

错误,默认封装 int 类型。  

 

【题目描述】

写出执行下面的代码后的结果

public class MyClass {

         public static void main(String args[]) {

                  java.util.Vector v1 = new java.util.Vector();

                  v1.addElement("Hello");

                  v1.addElement(new Float(3.14f));

                  v1.addElement(10);

                  System.out.println(v1.elementAt(0) + ":" + v1.elementAt(1) + ":"+

                                                     v1.elementAt(2));

         }

}

【正确答案】       

Hello : 3.14 : 10

 

【题目描述】

你是怎么理解 java 的泛型的?

【正确答案】

在 Java SE 1.5 之前,没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意 化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型 可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

泛型是 Java SE 1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定 为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用 率。     

 

【题目描述】      

判断一个 int 数组中的元素是否存在重复,方法声明如下:

boolean isRepeat(int[] m){      }

【正确答案】       

public boolean isRepeat2(int[] m){

         Set h =new HashSet(m.length);

         for (int i = 0; i < m.length; i++) {

                  h.add(new Integer(m[i]));

         }

         if (h.size()==m.length ){

                  return false;

         }else {

                  return true;

         }

}

 

【题目描述】

编写函数 insert(String str),将字符串“a,123;b,456;c,789”置入 HashMap 中。

【正确答案】       

import java.util.HashMap;

public class HashMapDemo {

         HashMap<String,String> map=new HashMap<String,String>();

public void insert(String str){

                  map.put("a", str);

         }

         public static void main(String[] args) {

                  HashMapDemo demo=new HashMapDemo();

                  demo.insert("a,123;b,456;c,789");

         }

}

 

【题目描述】

实现函数 public String[ ] array(List list),其中参数 list 中元素类型为字符串。

【正确答案】       

public String[] array(List list) {

  String[] elementData = new String[list.size()];

  for(int i=0;i<list.size();i++){

          elementData[i]=(String)list.get(i);

  }

  return elementData ;

}

 

【题目描述】

编写程序将由数字及字符组成的字符串中的数字截取出来并按顺序输出,例如: “ABC137GMNQQ2049PN5FFF”输出结果应该为 01234579。

【正确答案】       

package com.tarena;

import java.util.Arrays;

public class NumberSplitChar {

         public static void main(String[] args) {

                  String str="ABC137GMNQQ2049PN5FFF";

                  char[] beforechars=str.toCharArray();

                  char[] afterchars=new char[beforechars.length];

                  int j=0;

                  for(int i=0;i<beforechars.length;i++){

                          if(beforechars[i]>='0' && beforechars[i]<='9'){

                                   afterchars[j++]=beforechars[i];

                          }

                  }

                  Arrays.sort(afterchars);

                  for(int i=(afterchars.length-j);i<afterchars.length;i++){

                          System.out.print(afterchars[i]);

                  }

         }

}

 

【题目描述】

请用 JAVA 实现两个类,分别实现堆栈(Stack)和队列(Queue)操作。

【正确答案】       

public class MyStack {

         private List list;

         public MyStack(){

                  list = new ArrayList();

         }

         public boolean isEmpty(){

                  return list.size() == 0;

         }

         public void push(Object obj){

                  list.add(obj);

         }

         public Object pop(){

                  if(list.size()>0){

                          Object obj = list.get(list.size()-1);

                          list.remove(list.size()-1);

                          return obj;

                          }else{

                                   return null;

                          }      

    }

         public int getNumber(){

                  return list.size();

         }

}

 

class IntegerQueue {

         public int[] integerQueue;// 用来当队列

         public int tail;// 队尾

         public int size;// 队的长度,也可以设置一个默认值,溢出时从新申请

         public IntegerQueue(int size) {

                  integerQueue = new int[size];

                  this.size = size;

                  tail = 0;

         }

         public void inQueue(int i) {

                  if (tail < size) {

                          this.integerQueue[tail] = i;

                          tail++;

                  } else {

                          System.err.println("溢出啦!");

                  }

         }

         public int outQueue() {

                  if (tail >= 0) {

                          int tmp = this.integerQueue[tail];

                          tail--;

                          return tmp;

                  } else {

                          System.err.println("队列为空!");

                          throw new RuntimeException();

                  }

         }

}

 

【题目描述】

有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。

【正确答案】

String content = “中国 aadf 的 111 萨 bbb 菲的 zz 萨菲”;

HashMap map = new HashMap();

for(int i=0;i<content.length;i++){

           char c = content.charAt(i);

           Integer num = map.get(c);

           if(num == null)

                   num = 1;

           else

                   num = num + 1;

           map.put(c,num);

}

for(Map.EntrySet entry : map){

           system.out.println(entry.getkey() + “: ” + entry.getValue());

}

 

【题目描述】

阅读代码,并回答问题

public String listToString( Vector strList) {

     String str = new String();

     SortedSet set = new TreeSet();

     set.addAll(strList);

     for(Iterator iter=set.iterator(); iter.hasNext();

     String currStr = (String) iter.next();

     Str += currStr + “;”;

     }return str;

}

问题1:这段代码完成什么功能?如果输入列表{“To” , “SAIC” , “Welcome”},输入结果是什么?

问题2:这段代码中有什么地方有错误或者可以改善的地方吗?

【正确答案】

问题1,数组元素拼接。TreeSet是按字母顺序存储的,结果是:SAIC;To;Welcome;

问题2,错误:for(Iterator iter=set.iterator(); iter.hasNext();后面缺少“)”

改善:拼接到最后时,最后一个分号应去掉。

 

【题目描述】

有一数组 a[1000]存放了 1000 个数,这 1000 个数取自 1-999, 且只有两个相同的数,剩下的 998 个数不同, 写一个搜索算法找出相同的那个数的值(请用 C# or JAVA 编程实现,注意空间效率和时间效率尽可能优化)。

【正确答案】       

import java.util.Arrays;

public class SearchDemo {

  /** 被搜索数据的大小 */

  private static final int size = 1000;

  public static void main(String[] args) {

           int[] data = new int[size];

           // 添加测试数据

           for (int k = 0; k < data.length; k++) {

                   data[k] = k + 1;

           }

           data[999] = 567;

           result(data);

  }

/**

* 调用分搜索算法的方法实现查找相同元素

* @param data

*/

  public static void result(int data[]){ Arrays.sort(data);

           for (int i = 0; i < data.length; i++) {

                   int target = data[i];

                   data[i] = 0;

                   int result = binaryFind(data, target);

         if (result != -1) {

                                   System.out.println("相同元素为:"+data[result]); break;

                          }

                  }

         }

/**

* 二分搜索算法实现

* @param data数据集合

* @param target搜索的数据

* @return 返回找到的数据的位置,返回-1 表示没有找到。

*/

         public static int binaryFind(int[] data, int target) {

                  int start = 0;

                  int end = data.length - 1;

                  while (start <= end) {

                          int middleIndex = (start + end) / 2;

                          if (target == data[middleIndex]) {

                                   return middleIndex;

                          }

                          if (target >= data[middleIndex]) {

                                   start = middleIndex + 1;

                          } else {

                                   end = middleIndex - 1;

                          }

                  }

                  return -1;

         }

}

 

【题目描述】

JAVA 实现一种排序。

【正确答案】       

用插入法进行排序代码如下

package com.tarena;

import java.util.*;

class InsertSort{

         ArrayList list;

         public InsertSort(int num,int mod){

                  list = new ArrayList(num);

                  Random rand = new Random();

                  System.out.println("The ArrayList Sort Before:");

                  for (int i=0;i<num ;i++ ){

                          list.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));

                          System.out.println("list["+i+"]="+list.get(i));

                  }

         }

         public void SortIt(){

                  Integer tempInt;

                  int MaxSize=1;

                  for(int i=1;i<list.size();i++){

                          tempInt = (Integer)list.remove(i);

                          if(tempInt.intValue()>=((Integer)list.get(MaxSize-1)).intValue()){

                                   list.add(MaxSize,tempInt); MaxSize++;

                                   System.out.println(list.toString());

                          }else{

                                  for (int j=0;j<MaxSize ;j++ ){

                                            if (((Integer)list.get(j)).intValue()>=tempInt.intValue()){

                                                   list.add(j,tempInt); MaxSize++;

                                                     System.out.println(list.toString());

                                                     break;

                                            }

                                   }

                          }

                  }

                  System.out.println("The ArrayList Sort After:");

                  for(int i=0;i<list.size();i++){

                           System.out.println("list["+i+"]="+list.get(i));

                  }

         }

         public static void main(String[] args){

                  InsertSort sort = new InsertSort(10,100);

                  sort.SortIt();

         }

}

 

1.5 JAVA核心API-IO操作

【题目描述】

下面哪个流类属于面向字符的输入流( )

【选项】

A. BufferedWriter                            B. FileInputStream 

C. ObjectInputStream             D. InputStreamReader

【正确答案】        D

 

 

【题目描述】

FilterOutputStream是BufferedOutputStream、DataOutputStream及PrintStream的父类,以下哪个类可能是FilterOutputStream构造函数的参数类型?

【选项】

A. OutputStream   B. File   C. InputStream  D. BufferedOutputStream

【正确答案】        A

 

【题目描述】

什么是 java 序列化,如何实现 java 序列化?

【正确答案】       

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题;

序列化的实现:将需要被序列化的类实现 Serializable 接口,该接口没有需实现的方法,implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如 FileOutputStream)来 构造一个 ObjectOutputStream( 对象流 ) 对 象 , 接 着 , 使 用 ObjectOutputStream 对象的 writeObject(Object obj)方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输 入流。

1.6 JAVA核心API-异常处理

【题目描述】

Given:

public class ExceptionTest {

         class TestException extends Exception {}

         public void runTest () throws TestException {}

         public void test () /* Point X*/         {

                  runTest ();

         }

}

At point X on line 4, which code can be added to make the code compile?

【选项】

A. throws Exception

B. Catch (Exception e).

C. Throws RuntimeException.

D. Catch (TestException e). E. No code is necessary.

【正确答案】        A

【解释】

         方法上使用 throws 抛出异常,Exception 是异常类的超类。

 

【题目描述】

Which four types of objects can be thrown using the throw statement? (Choose Four)

【选项】

A. Error

B. Event

C. Object

D. Exception

E. Throwable

F. RuntimeException

【正确答案】        ADEF

【解释】

         能够抛出的对象类型要是 Throwable 或是 Throwable 的子类

 

 

【题目描述】

运行时异常与一般异常有何异同?

【正确答案】       

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇 到的异常,是一种常见运行错误。java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是 并不要求必须声明抛出未被捕获的运行时异常。

 

【题目描述】

请写出 5 种常见到的 runtime exception。

【正确答案】       

NullPointerException:当操作一个空引用时会出现此错误。

NumberFormatException:数据格式转换出现问题时出现此异常。

ClassCastException:强制类型转换类型不匹配时出现此异常。

ArrayIndexOutOfBoundsException:数组下标越界,当使用一个不存在的数组下标时出现此异常。

ArithmeticException:数学运行错误时出现此异常

 

【题目描述】

Java 异常处理中,try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code会不会被执行,什么时候被执行,在 return 前还是后?

【正确答案】       

         会执行,在 return 前执行。

 

【题目描述】

error 和 exception 有什么区别?

【正确答案】       

error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;

exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。

 

【题目描述】

执行以下的example()方法,请根据unface()方法出现异常情况,判断可能的输出结果;

class TestClass {

         private void unsafe() throws SafeException {//方法体实现}

         public void example() {

                  try {

                          unsafe();

                          System.out.print("Test1");

                  } catch (SafeException e) {

                          System.out.print("Test 2");

                  } finally {

                          System.out.print("Test 3");

                  }

                  System.out.print("Test 4");

         }

}

@SuppressWarnings("serial")

class SafeException extends Exception {

         public SafeException() {

                  super();

         }

}

1) 如果执行unsafe()方法没有发生异常,那么输出______________________

2) 如果执行unsafe()方法发生SafeException异常,那么输出 _____________

3)如果执行unsafe()方法发生RuntimeException异常,那么输出____________

【正确答案】

1) Test1Test 3Test 4    

2)  Test 2Test 3Test 4  

3) Test 3         

 

【题目描述】

getSomething ()执行时发生 illegalArgumentException 会出现什么样的结果?

void makeConnection(String url)    {

         try {  getSomething();

         }catch(NullPointerException e) {

                  System.out.printin("Invalid URL") ; return;

         }catch(Exception e) { System.out.println("Exception");}

}

【正确答案】

Exception

1.7 JAVA核心API-多线程

【题目描述】

关于 sleep()和 wait(),以下描述错误的一项是(   )

【选项】

A. sleep 是线程类(Thread)的方法,wait 是 Object 类的方法;

B. sleep 不释放对象锁,wait 放弃对象锁;

C. sleep 暂停线程、但监控状态仍然保持,结束后会自动恢复;

D. wait 后进入等待锁定池,只有针对此对象发出 notify 方法后获得对象锁进入运行状态。

【正确答案】        D

【解释】

sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控 状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。

wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对 象锁进入运行状态。

 

【题目描述】

请选出正确的一项。(    )

1. public class ThreadTest {

2.    public static void main (String[] args) {

3.              new Thread(new Runnable() {

4.             public void run() {

5.                       System.out.print("bar");

6.                       }}).start();

7.     }

8. }

【选项】

A. Compilation fails.

B. An exception is thrown at runtime.

C. The code executes normally, but nothing prints.

D. The code executes normally and prints "bar".

【正确答案】        D

 

【题目描述】

以下哪一个是错误的?(    )

【选项】

A.  public synchronized void go() { /* code here */ }

B.    private synchronized(this) void go() { /* code here */ }

C.    void go() {

         Object o = new Object();

         synchronized(o) { /* code here */ }

D.    void go() {

         synchronized(Object.class) { /* code here */ }

【正确答案】        B

 

【题目描述】

请选择正确的一项。(    )

1. public class Threads3 implements Runnable { 

2.    public void run() { 

3.             System.out.print("running"); 

4.    } 

5.    public static void main(String[] args) { 

6.             Thread t = new Thread(new Threads3()); 

7.             t.run(); 

8.             t.run(); 

9.             t.start(); 

10.   } 

11. } 

【选项】

A. The code executes and prints "runningrunning". 

B. The code executes and prints "runningrunningrunning". 

C. The code executes and prints "running". 

D. An exception is thrown at runtime. 

【正确答案】        B

 

【题目描述】

下列有关线程的说法正确的是:(  )

【选项】

A.启动一个线程是调用start()方法,是线程所代表的虚拟处理机处于可运行状态,这意味着线程此时就会立即运行。

B.notify()方法可以确切的唤醒某个处于等待状态的线程。

C.wait()方法可以使一个线程处于等待状态,但不会释放所持有对象的锁。

D.sleep()方法使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法时,需要捕捉InterruptedException异常

【正确答案】        D

 

【题目描述】

               代码执行后输出的结果是:(   )

public class Z{

         public static void main(String[] args){

                 new Z();

         }

        

         Z(){

                 Z alias1 = this;

                 Z alias2 = this;

                 synchronized (alias1){

                          try{

                                   alias2.wait();

                                   System.out.println("DONE WAITING");

                          } catch (InterruptedException e) {

                                   System.out.println("IN TEEEUPTED");

                          } catch (Exception e) {

                                   System.out.println("OTHER EXCEPTION");

                          } finally {

                                   System.out.println("FINALLY");

                          }

                 }

                 System.out.println("ALL DONE");

         }

}

【选项】

               A. The application compiles but doesn't print anything.

               B.The application compiles and print "DONE WAITING"

               C.The application compiles and print "FINALLY"

               D.The application compiles and print "ALL DONE"

【正确答案】        A

 

【题目描述】

在主线程中启动新线程后,新线程处于就绪状态,那么新线程对象中的哪个方法被系统执行时,视为已经进入执行新线程的内容:(   )

【选项】

A. public void start()

B. public void run()

C. public static void main(Stirng[] args)

D. public void runnable()

【正确答案】        A

 

【题目描述】

下列程序的功能是在控制台上,每隔1秒钟显示字符串”Hello”,能够填写在程序中下划线位置,使程序完整,并能够正确运行的语句是(  )

public class  Test implements Runnable{

         public static void main(String[] args){

                  Test t=new Test();

                  Thread tt=new Thread(t);

                  tt.start();

         }

         public void run(){

                  for(;;){

                          try{

                                   __________

                          }

                          catch(_________  e ){}

                          System.out.println(“Hello”);

                  }

         }

}

【选项】

A.  Thread. sleep (1000)  InterruptedException

B.  sleep (1000)  InterruptedException

C.  t. sleep (1000)  InterruptedException

D.  Thread. sleep (1000)  RuntimeException

【正确答案】        A

 

【题目描述】

10.Exhibit:

1.public class X implements Runnable {

2.    private int x;

3.    private int y;

4.    public static void main(String [] args) {

5.             X that = new X();

6.             (new Thread(that)).start();

7.             (new Thread(that)).start();

8.    }

9.    public synchronized void run( ){

10.           for (;;) {

11.                    x++;

12.                    y++;

13.                    System.out.println(“x = “ + x + “, y = “ + y);

14.           }

15.  }

16.}

What is the result?

【选项】

A.     An error at line 11 causes compilation to fail.

B.     Errors at lines 7 and 8 cause compilation to fail.

C.     The program prints pairs of values for x and y that might not always be the same on the same line (for example, “x=2, y=1”)

D.     The program prints pairs of values for x and y that are always the same on the same line (for example, “x=1, y=1”. In addition, each value appears twice (for example, “x=1, y=1” followed by “x=1, y=1”)

E.     The program prints pairs of values for x and y that are always the same on the same line (for example, “x=1, y=1”. In addition, each value appears twice (for example, “x=1, y=1” followed by “x=2, y=2”)

【正确答案】        E

【解释】

多线程共享相同的数据,使用 synchronized 实现数据同步。

 

 

【题目描述】

方法 resume()负责恢复哪些线程的执行( )

【选项】

A 通过调用 stop()方法而停止的线程。

B 通过调用 sleep()方法而停止的线程。

C 通过调用 wait()方法而停止的线程。

D 通过调用 suspend()方法而停止的线程。

【正确答案】        D

【解释】

Suspend 可以挂起一个线程,就是把这个线程暂停了,它占着资源,但不运行,用 Resume 是恢复挂起 的线程,让这个线程继续执行下去。

 

 

【题目描述】

下面能让线程停止执行的有(       )

【选项】

A. sleep();                 B. stop();                   C. notify();                D. synchronized();

E. yield();                   F. wait();                    G. notifyAll();

【正确答案】        ABDEF

【解释】

sleep:导致此线程暂停执行指定时间;

stop: 这个方法将终止所有未结束的方法,包括 run 方法;

synchronized():对象锁;

yield:当前正在被服务的线程可能觉得 cpu 的服务质量不够好,于是提前退出,这就是 yield;

wait:当前正在被服务的线程需要睡一会,醒来后继续被服务。

 

【题目描述】

Which two CANNOT directly cause a thread to stop executing? (     )

【选项】

A. Existing from a synchronized block.

B. Calling the wait method on an object.

C. Calling notify method on an object.

D. Calling read method on an InputStream object.

E. Calling the SetPriority method on a Thread object.

【正确答案】        AD

【解释】

stop 方法.这个方法将终止所有未结束的方法,包括 run 方法。当一个线程停止时候,他会立即释放所有他锁住对象上的锁。这会导致对象处于不一致的状态。当线程想终止另一个线程的时候,它无法知道何时调用 stop 是安全的,何时会导致对象被破坏。所以这个方法被弃用了。你应该中断一个线程而不是停止他。被中断的线程会在安全的时候停止。

 

【题目描述】

有关线程的哪些叙述是对的( )

【选项】

A. 一旦一个线程被创建,它就立即开始运行。

B. 使用 start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行。

C. 当一个线程因为抢先机制而停止运行,它被放在可运行队列的前面。

D. 一个线程可能因为不同的原因停止并进入就绪状态。

【正确答案】        BCD

【解释】

在抢占式线程模型中,操作系统可以在任何时候打断线程。通常会在它运行了一段时间(就是所谓的一个时间片)后才打断它。这样的结果自然是没有线程能够不公平地长时间霸占处理器。

 

【题目描述】

进程和线程分别该怎么理解?

【正确答案】       

进程是资源分配的基本单位。所有与该进程有关的资源,都被记录在进程控制块 PCB 中。以表示该进程拥有这些资源或正在使用它们。另外,进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。与进程相对应,线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地 址空间。

线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表 TCB 组成。寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。 发生进程切换与发生线程切换时相比较,进程切换时涉及到有关资源指针的保存以及地址空间的变化等问题;线程切换时,由于同不进程内的线程共享资源和地址空间,将不涉及资源信息的保存和地址变化问题,从而减少了操作系统的开销时间。而且,进程的调度与切换都是由操作系统内核完成, 而线程则既可由操作系统内 核完成,也可由用户程序进行。

 

【题目描述】

同步和异步有何异同,在什么情况下分别使用他们?请举例说明

【正确答案】       

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象 上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异 步编程,在很多情况下采用异步途径往往更有效率。

 

【题目描述】

sleep()和 wait()有什么区别?

【正确答案】       

sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。

wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁 定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

 

【题目描述】

               说说下面语句是否有错误,或可能出现的缺陷,并指出错误,或缺陷在哪里?

public class MyFile implements Runnable{

public void run(){ while (true){

              try{

                  FileReader fr=new FileReader(new File("a.txt")) ;

                  String line=fr.readLine();

                  System.out.println(line);

               }catch(IOException err) {

               }

               Sleep(1000);       }

}

【正确答案】       

1.fr.readLine()没有这个方法

2.Sleep(1000)需要用 Thread.sleep(1000);

 

 

【题目描述】

简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?

【正确答案】       

主要相同点:Lock 能完成 synchronized 所实现的所有功能

主要不同点:Lock 有比 synchronized 更精确的线程语义和更好的性能。 synchronized 会自动释放锁, 而 Lock 一定要求程序员手工释放,并且必须在 finally 从句中释放。

 

【题目描述】

多线程有几种实现方法,都是什么?同步的方法有几种,都是什么?

【正确答案】       

多线程有两种实现方法:继承 Thread 类或者实现 Runnable 接口。 实现同步也有两种方法:一种是同步方法,另一种是同步代码块。 同步方法是在方法返回类型前面加上 synchronized 关键字同步代码块是 synchronized (这里写需要同步的对象){...}

 

【题目描述】

死锁的必要条件?怎么克服?

【正确答案】       

产生死锁的四个必要条件: 互斥条件:一个资源每次只能被一个进程使用。 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足, 就不会发生死锁。

死锁的解决方法:

a 撤消陷于死锁的全部进程;

b 逐个撤消陷于死锁的进程,直到死锁不存在;

c 从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。

d 从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态

 

【题目描述】

请说出你所知道的线程同步的方法。

【正确答案】       

wait():使一个线程处于等待状态,并且释放所持有的对象的 lock;

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException 异常;

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且不是按优先级;

notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

 

【题目描述】

编程实现:线程 A 向队列 Q 中不停写入数据,线程 B 从队列 Q 中不停读取数据(只要Q中有数据)。

接口中有两个一个是向队列中写 push 方法 一个是从队列中读。

public interface StackInterface{

         public void push(int n);

         public int[] pop();

}

上边接口的实现类。

public class SafeStack implements StackInterface {

         private int top = 0;

         private int[] values = new int[10];

         private boolean dataAvailable = false;

         public void push(int n) {

                  synchronized (this) {

                          while (dataAvailable) { // 1

                                   try {

                                            wait();

                                   } catch (InterruptedException e) {

                                   // 忽略 //2

                                   }

                          }

                          values[top] = n;

                          System.out.println("压入数字" + n + "步骤 1 完成");

                          top++;

                          dataAvailable = true; notifyAll();

                          System.out.println("压入数字完成");

                  }

         }

         public int[] pop() {

                  synchronized (this) {

while (!dataAvailable) {

                                   try {

                                            wait();

                                   } catch (InterruptedException e) {

                                   // 忽略 //4

                                   }

                          }

                          System.out.print("弹出");

                          top--;

                          int[] test = { values[top], top };

                          dataAvailable = false;

                          // 唤醒正在等待压入数据的线程

                          notifyAll();

                          return test;

                  }

         }

}

【正确答案】       

读线程

public class PopThread implements Runnable{

         private StackInterface s;

         public PopThread(StackInterface s){

                  this.s = s;

         }

         public void run(){

                while(true){

                          System.out.println("->"+ s.pop()[0] + "<-");

                          try {

                                   Thread.sleep(100);

                          }

                          catch(InterruptedException e){}

                  }

         }

}

写线程

public class PushThread implements Runnable{

         private StackInterface s;

         public PushThread(StackInterface s){             

this.s = s;

         }

         public void run(){

                  int i = 0;

                  while(true){

                          java.util.Random r = new java.util.Random();

                          i = r.nextInt(10);

                          s.push(i);

                          try {

                                   Thread.sleep(100);

                         }catch(InterruptedException e){

                  }

         }

}

【题目描述】

设计线程类 WorkerThread,其构造函数接受一个 message 字符串作为参数,把该字符串打印到console 上,同时,在 WorkThread 的 main 函数中启动该线程。

【正确答案】

public class WorkerThread extends Thread {

       public WorkerThread(String message) {

                System.out.println(message);

       }

       public static void main(String[] args) {

               new WorkerThread("hello world!").start();   

       }

}

【题目描述】

模拟火车站5个售票窗口同时卖票。

【正确答案】

public class RunnableTest {

    public static void main(String[] args) {

        Runnable runnable=new MyThread();

        new Thread(runnable).start();

        new Thread(runnable).start();

        new Thread(runnable).start();

        new Thread(runnable).start();

        new Thread(runnable).start();

    }

    public static class MyThread implements Runnable{

        private int tickets=100;

        public void run() {

            while(tickets>0){

                System.out.println(Thread.currentThread().getName()+"卖出第"+tickets--+"张火车票");

            }

        }

       

    }

}

 

【题目描述】

请阅读如下代码,执行该代码后,打印的输出是什么。

class MainThread extends Thread {

         public MainThread(String name) {

                  super(name);

         }

         public void run() {

                  new TestThread("Thread-1").start();

                  new TestThread("Thread-2").run();

         }

}

class TestThread extends Thread {

         public TestThread(String name) {

                  super(name);

         }

         public void run() {

                  System.out.println(Thread.currentThread().getName());

         }

}

public class Test {

         public static void main(String[] args) {

                  new MainThread("Main").start();

         }

}

【正确答案】       

Main

Thread-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值