构造最全的Java面试题整理(编程题)

1 、写一个 Singleton 出来
答: Singleton 模式主要作用是保证在 Java 应用程序中,一个类 Class 只有一个实例存在。
一般 Singleton 模式通常有几种种形式 :
第一种形式

定义一个类,它的构造函数为 private 的,它有一个 static private 的该类变量,在类初始化时实例话,通过一个 public getInstance 方法获取对它的引用 , 继而调用其中的方法。
public class Singleton {
private Singleton(){}
       // 在自己内部定义自己一个实例,是不是很奇怪?
       // 注意这是 private  只供内部调用
       private static Singleton instance = new Singleton();
       // 这里提供了一个供外部访问本 class 的静态方法,可以直接访问  
       public static Singleton getInstance() {
         return instance;    
       } 
    } 
第二种形式
public class Singleton { 
   private static Singleton instance = null;
   public static synchronized Singleton getInstance() {
   // 这个方法比上面有所改进,不用每次都进行生成对象,只是第一次       
   // 使用时生成实例,提高了效率!
   if (instance==null)
     instance new Singleton();
     return instance; 
  

其他形式 :
定义一个类,它的构造函数为 private 的,所有方法为 static 的。
一般认为第一种形式要更加安全些  

 

Java 的通信编程,编程题 ( 或问答 ) ,用 JAVA SOCKET 编程,读服务器几个字符,再写入本地显示?
: Server 端程序 :
package test;
import java.net.*;
import java.io.*;

public class Server
{
 private ServerSocket ss;
 private Socket socket;
 private BufferedReader in;
 private PrintWriter out;
 public Server()
 {
  try
  {
   ss=new ServerSocket(10000);
   while(true)
   {
    socket = ss.accept();
    String RemoteIP = socket.getInetAddress().getHostAddress();
    String RemotePort = ":"+socket.getLocalPort();
    System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
    in = new BufferedReader(new

InputStreamReader(socket.getInputStream()));
    String line = in.readLine();
    System.out.println("Cleint send is :" + line);
    out = new PrintWriter(socket.getOutputStream(),true);
    out.println("Your Message Received!");
    out.close();
    in.close();
    socket.close();
   }
  }catch (IOException e)
  {
   out.println("wrong");
  }
 }
 public static void main(String[] args)
 {
  new Server();
 }
};
Client
端程序 :
package test;
import java.io.*;
import java.net.*;

public class Client
{
 Socket socket;
 BufferedReader in;
 PrintWriter out;
 public Client()
 {
  try
  {
   System.out.println("Try to Connect to 127.0.0.1:10000");
   socket = new Socket("127.0.0.1",10000);
   System.out.println("The Server Connected!");
   System.out.println("Please enter some Character:");
   BufferedReader line = new BufferedReader(new

InputStreamReader(System.in));
   out = new PrintWriter(socket.getOutputStream(),true);
   out.println(line.readLine());
   in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   System.out.println(in.readLine());
   out.close();
   in.close();
   socket.close();
  }catch(IOException e)
  {
   out.println("Wrong");
  }
 }
 public static void main(String[] args)
 {
  new Client();
 }
};

 

 

将一个键盘输入的数字转化成中文输出
(例如:输入:1234567     输出:一百二拾三万四千五百六拾七)
java语言实现,,请编一段程序实现
!

答:
 public class Reader {
  private String strNum;
  private String strNumChFormat;
  private String strNumTemp;
  private int intNumLen;
  private String strBegin;
  public Reader(String strNum) {
    this.strNum = strNum;
  }
  public boolean check(String strNum) {
    boolean valid = false;
    
    if (strNum.substring(0,1).equals("0")){
     this.strNum = strNum.substring(1);
    }
    try {
      new Double(strNum);
      valid = true;
    }
    catch (NumberFormatException ex) {
      System.out.println("Bad number format!");
    }
    return valid;
  }
  public void init() {
    strNumChFormat = "";
    intNumLen = strNum.length();
    strNumTemp = strNum;
    strNumTemp = strNumTemp.replace('1', '
');
    strNumTemp = strNumTemp.replace('2', '
');
    strNumTemp = strNumTemp.replace('3', '
');
    strNumTemp = strNumTemp.replace('4', '
');
    strNumTemp = strNumTemp.replace('5', '
');
    strNumTemp = strNumTemp.replace('6', '
');
    strNumTemp = strNumTemp.replace('7', '
');
    strNumTemp = strNumTemp.replace('8', '
');
    strNumTemp = strNumTemp.replace('9', '
');
    strNumTemp = strNumTemp.replace('0', '
');
    strNumTemp = strNumTemp.replace('.', '
');
    strBegin = strNumTemp.substring(0, 1);
  }
  public String readNum() {
    if (check(strNum)) {
      init();
      try {
        for (int i = 1, j = 1, k = 1; i < intNumLen; i++) {
          if (strNumTemp.charAt(intNumLen - 1) == '
' && i == 1) {
            strNumChFormat = "
";
          }
          else if (strNumTemp.charAt(intNumLen - i) == '
' && j == 1) {
            strNumChFormat = "
" + strNumChFormat;
          }
          else if (strNumTemp.charAt(intNumLen - i) == '
') {
            j = 1;
            k = 1;
            strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;
            continue;
          }
          else {
            strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;
          }
          if (strNumTemp.charAt(intNumLen - i - 1) != '
' &&
              strNumTemp.charAt(intNumLen - i - 1) != '
') {
            if (j == 1 && i < intNumLen) {
              strNumChFormat = '
' + strNumChFormat;
            }
            else if (j == 2 && i < intNumLen) {
              strNumChFormat = '
' + strNumChFormat;
            }
            else if (j == 3 && i < intNumLen) {
              strNumChFormat = '
' + strNumChFormat;
            }
          }
          if (j == 4 && i < intNumLen) {
            j = 0;
          }
          if (k == 4 && i < intNumLen) {
            strNumChFormat = '
' + strNumChFormat;
          }
          else if (k == 8 && i < intNumLen) {
            k = 0;
            strNumChFormat = '
亿' + strNumChFormat;
          }
          j++;
          k++;
        }
        while (strNumChFormat.indexOf("
") != -1) {
          strNumChFormat = strNumChFormat.replaceAll("
", " ");
        }
        if (strNumChFormat.substring(0, 2) == "
一拾") {
          strNumChFormat = strNumChFormat.substring(1, strNumChFormat.length());
        }
        if (strNumChFormat.indexOf("
") >= 0) {
          String rebegin = strNumChFormat.substring(0,
              strNumChFormat.indexOf("
"));
          String relast = strNumChFormat.substring(strNumChFormat.indexOf("
"),
              strNumChFormat.length());
          for (int i = 1; i <= relast.length(); i++) {
            relast = relast.replaceAll("
", "");
            relast = relast.replaceAll("
", "");
            relast = relast.replaceAll("
", "");
            relast = relast.replaceAll("
", "");
            relast = relast.replaceAll("
亿", "");
          }
          strNumChFormat = rebegin + relast;
        }
      }
      catch (ArrayIndexOutOfBoundsException ex) {
        ex.printStackTrace();
      }
      catch (Exception ex) {
        ex.printStackTrace();
      }
      int off = strNumChFormat.indexOf("
");
      strNumChFormat = strBegin + strNumChFormat.substring(0);
    }
    else {
      strNumChFormat = "";
    }
    return strNumChFormat;
  }
  public static void main(String args[]) {
    try {
      String number = args[0].toString();
      System.out.println("The number is: " + number);
      Reader reader = new Reader(number);
      System.out.println("Output String: " + reader.readNum());
    }
    catch (Exception ex) {
      System.out.println("Please input like that: javac Reader <number>");
    }
  }
}

 

4、设计 4 个线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1 。写出程序。

以下程序使用内部类实现线程,对 j 增减的时候没有考虑顺序问题。
public class ThreadTest1{
  private int j;
  public static void main(String args[]){
ThreadTest1 tt=new ThreadTest1();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();
for(int i=0;i<2;i++){
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}
}
  private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
  }
  private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
  }
  class Inc implements Runnable{
public void run(){
for(int i=0;i<100;i++){
inc();
}
}
  }
  class Dec implements Runnable{
public void run(){
for(int i=0;i<100;i++){
dec();
}
 }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值