Java程序设计经典300例
一、基础篇(basic)
1.不借助第三者实现两个变量值的交换:
1 package basic; 2 3 import java.util.Scanner; 4 5 public class ExchangeValue { 6 public static void main(String[] args) { 7 Scanner scan = new Scanner(System.in); 8 System.out.println("请输入变量A的值:"); 9 long a = scan.nextLong(); 10 System.out.println("请输入变量B的值:"); 11 long b = scan.nextLong(); 12 System.out.println("a=" + a + "\tb=" + b); 13 System.out.println("变量交换...\t"); 14 a = a ^ b; 15 b = a ^ b; 16 a = a ^ b; 17 System.out.println("a=" + a + "\tb=" + b); 18 } 19 }
2.利用异或进行加解密:
1 package basic; 2 3 import java.util.Scanner; 4 5 public class Encryption { 6 public static void main(String[] args) { 7 Scanner scan=new Scanner(System.in); 8 System.out.println("请输入一个英文字符串或解密字符串"); 9 String password=scan.nextLine(); 10 char[] array=password.toCharArray(); 11 for(int i=0;i<array.length;++i){ 12 array[i]=(char)(array[i]^20000); 13 } 14 System.out.println("加密或解密结果如下:"); 15 System.out.println(new String(array)); 16 } 17 }
3.利用BigDecimal求和:
1 package basic; 2 3 import java.math.BigDecimal; 4 5 public class Factorial { 6 public static void main(String[] args) { 7 BigDecimal sum=new BigDecimal(0.0); 8 BigDecimal factorial=new BigDecimal(1.0); 9 int i=1; 10 while(i<=10){ 11 sum=sum.add(factorial); 12 ++i; 13 factorial=factorial.multiply(new BigDecimal(1.0/i)); 14 } 15 System.out.println("1+1/2!+1/3!+1/4!....+1/10!="+sum); 16 } 17 }
4.for循环打印空心菱形:
1 package basic; 2 3 public class Diamond { 4 public static void main(String[] args) { 5 printDiamond(6); 6 } 7 8 public static void printDiamond(int size) { 9 if (size % 2 == 0) { 10 size++; 11 } 12 for (int i = 0; i < size / 2 + 1; ++i) { 13 for (int j = size / 2 + 1; j > i + 1; j--) { 14 System.out.print(" "); 15 } 16 for (int j = 0; j < 2 * i + 1; j++) { 17 if (j == 0 || j == 2 * i) { 18 System.out.print("*"); 19 } else { 20 System.out.print(" "); 21 } 22 } 23 System.out.println(""); 24 } 25 for (int i = size / 2 + 1; i < size; i++) { 26 for (int j = 0; j < i - size / 2; j++) { 27 System.out.print(" "); 28 } 29 for (int j = 0; j < 2 * size - 1 - 2 * i; j++) { 30 if (j == 0 || j == 2 * (size - i - 1)) { 31 System.out.print("*"); 32 } else { 33 System.out.print(" "); 34 } 35 } 36 System.out.println(""); 37 } 38 } 39 }
5.猴子分桃问题:一堆桃子,5个猴子先后到,每次都均分5份,扔掉多余的一个,拿走自己的那份。问最少有几个桃子,最后一个猴子得到几个桃子。
1 package basic; 2 3 public class MonkeyPeach { 4 public static void main(String[] args) { 5 int n = 1; 6 int m = 0; 7 int flag = 1; 8 int monkeyNum = 5; 9 while (true) { 10 flag = 1; 11 m = monkeyNum * n + 1; 12 for (int i = monkeyNum; i >= 1; i--) { 13 if ((m % (monkeyNum - 1) == 0)) { 14 m = m / (monkeyNum - 1) * monkeyNum + 1; 15 flag++; 16 } else { 17 break; 18 } 19 } 20 if (flag == monkeyNum) 21 break; 22 n++; 23 } 24 System.out.println("桃子总数为:" + m); 25 System.out.println("第五个猴子得到的桃子数为:" + n); 26 } 27 }
6.约瑟夫问题:
1 package basic; 2 3 import javax.swing.JOptionPane; 4 5 public class Josephus { 6 public static void main(String[] args) { 7 String s; 8 int n, k, m, n1; 9 s = JOptionPane.showInputDialog("请输入人数:"); 10 n = Integer.parseInt(s); 11 n1 = n + 1; 12 s = JOptionPane.showInputDialog("请输入起始报数的人的编号:"); 13 k = Integer.parseInt(s); 14 s = JOptionPane.showInputDialog("请输入死亡数字:"); 15 m = Integer.parseInt(s); 16 int a[] = new int[n + 1]; 17 a[0] = 0; 18 System.out.println("出局人的编号:"); 19 for (int i = 1; i < a.length; i++) { 20 a[i] = 1; 21 } 22 for (int i = 1; i <= m; i++) { 23 if (n == 1) 24 break; 25 else if (i == m) { 26 n--; 27 i = 0; 28 a[k] = 0; 29 System.out.print(k + " "); 30 } 31 do { 32 k++; 33 k = k % n1; 34 } while (a[k] != 1); 35 } 36 System.out.println(""); 37 System.out.println("幸存者编号:" + k); 38 } 39 }
7.数独问题:
1 package basic; 2 3 import java.util.Scanner; 4 5 public class Sudoku { 6 public static void main(String[] args) { 7 Scanner s = new Scanner(System.in); 8 System.out.println("请输入要计算的数独维数(大于1的奇数):"); 9 int x = s.nextInt(); 10 int h = 0; 11 int l = x / 2; 12 int[][] a = new int[x][x]; 13 for (int i = 1; i <= x * x; i++) { 14 a[h][l] = i; 15 h--; 16 l++; 17 if (h < 0 && l >= x) { 18 h += 2; 19 l--; 20 } else if (h < 0) { 21 h = x - 1; 22 } else if (l >= x) { 23 l = 0; 24 } else if (a[h][l] > 0) { 25 h += 2; 26 l--; 27 } 28 } 29 for (int i = 0; i < x; i++) { 30 for (int j = 0; j < x; j++) 31 System.out.print(a[i][j] + " "); 32 System.out.println(); 33 } 34 } 35 }
8.数字格式转为货币字符串:
1 package basic; 2 3 import java.text.NumberFormat; 4 import java.util.Locale; 5 import java.util.Scanner; 6 7 public class CurrencyFormat { 8 public static void main(String[] args) { 9 Scanner scan = new Scanner(System.in); 10 System.out.println("请输入一个货币数字:"); 11 double number = scan.nextDouble(); 12 NumberFormat format = NumberFormat.getCurrencyInstance(Locale.CHINA); 13 System.out.println("Locale.CHINA:" + format.format(number)); 14 format = NumberFormat.getCurrencyInstance(Locale.US); 15 System.out.println("Locale.US:" + format.format(number)); 16 format = NumberFormat.getCurrencyInstance(Locale.UK); 17 System.out.println("Locale.UK:" + format.format(number)); 18 } 19 }
9.检验IP地址:
1 package basic; 2 3 import java.util.Scanner; 4 5 public class IPAddress { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 System.out.println("请输入需要校验的IP地址:"); 9 String text = sc.nextLine(); 10 String info = matches(text); 11 System.out.println(info); 12 } 13 14 public static String matches(String text) { 15 if (text != null && !text.isEmpty()) { 16 String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." 17 + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." 18 + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." 19 + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$"; 20 if (text.matches(regex)) { 21 return text + "是一个合法的IP地址!"; 22 } else { 23 return text + "不是一个合法的IP地址!"; 24 } 25 } 26 return "请输入要验证的IP地址!"; 27 } 28 }
10.检验电话号码:
1 package basic; 2 3 import java.util.Scanner; 4 5 public class PhoneNumber { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 System.out.println("请输入电话号码:"); 9 String phoneNumber = sc.nextLine(); 10 System.out.println(check(phoneNumber)); 11 } 12 13 public static String check(String phoneNumber) { 14 if (phoneNumber == null || phoneNumber.isEmpty()) 15 return "请输入电话号码"; 16 String regex = "^\\d{3}-?\\d{8}|\\d{4}-?\\d{8}$"; 17 if (phoneNumber.matches(regex)) 18 return phoneNumber + "是一个合法的电话号码!"; 19 else 20 return phoneNumber + "不是一个合法的电话号码!"; 21 } 22 }
11.字符串编码转换:
1 package basic; 2 3 import java.io.UnsupportedEncodingException; 4 5 public class ChangeCharset { 6 public static final String ISO_8859_1 = "ISO-8859-1"; 7 8 public static final String UTF_8 = "UTF-8"; 9 10 public static final String GBK = "GBK"; 11 12 public static final String GB2312 = "GB2312"; 13 14 public String toISO_8859_1(String str) throws UnsupportedEncodingException { 15 return this.changeCharset(str, ISO_8859_1); 16 } 17 18 public String toUTF_8(String str) throws UnsupportedEncodingException { 19 return this.changeCharset(str, UTF_8); 20 } 21 22 public String toGBK(String str) throws UnsupportedEncodingException { 23 return this.changeCharset(str, GBK); 24 } 25 26 public String toGB2312(String str) throws UnsupportedEncodingException { 27 return this.changeCharset(str, GB2312); 28 } 29 30 public String changeCharset(String str, String newCharset) 31 throws UnsupportedEncodingException { 32 if (str != null) { 33 byte[] bs = str.getBytes(); 34 return new String(bs, newCharset); 35 } 36 return null; 37 } 38 39 public String changeCharset(String str, String oldCharset, String newCharset) 40 throws UnsupportedEncodingException { 41 if (str != null) { 42 byte[] bs = str.getBytes(oldCharset); 43 return new String(bs, newCharset); 44 } 45 return null; 46 } 47 48 public static void main(String[] args) throws UnsupportedEncodingException { 49 ChangeCharset test = new ChangeCharset(); 50 String str = "This is a 中文的 string"; 51 System.out.println("str:" + str); 52 String iso8859_1 = test.toISO_8859_1(str); 53 System.out.println("转换为ISO-8859-1:" + iso8859_1); 54 String utf_8 = test.toUTF_8(str); 55 System.out.println("转换为UTF-8:" + utf_8); 56 String gbk = test.toGBK(str); 57 System.out.println("转换为GBK码:" + gbk); 58 String gb2312 = test.toGB2312(str); 59 System.out.println("转换为GB2312码:" + gb2312); 60 } 61 }
12.StringBuilder,StringBuffer和String的区别:
1 package basic; 2 3 public class BufferString { 4 public static void main(String[] args) { 5 String string = ""; 6 long startTime = System.nanoTime(); 7 for (int i = 20000; i < 50000; ++i) 8 string += (char) i; 9 long endTime = System.nanoTime(); 10 System.out 11 .println("String耗时:" + (endTime - startTime) / 1000000 + "ms"); 12 StringBuffer stringBuffer = new StringBuffer(); 13 startTime = System.nanoTime(); 14 for (int i = 20000; i < 50000; ++i) 15 stringBuffer.append((char) i); 16 endTime = System.nanoTime(); 17 System.out.println("StringBuffer耗时:" + (endTime - startTime) / 1000000 18 + "ms"); 19 StringBuilder stringBuilder = new StringBuilder(); 20 startTime = System.nanoTime(); 21 for (int i = 20000; i < 50000; ++i) 22 stringBuilder.append((char) i); 23 endTime = System.nanoTime(); 24 System.out.println("StringBuilder耗时:" + (endTime - startTime) / 1000000 25 + "ms"); 26 } 27 }
13.利用TreeSet模拟数组:
1 package basic; 2 3 import java.util.Random; 4 import java.util.TreeSet; 5 6 public class NoRepeatRandom { 7 public static void main(String[] args) { 8 TreeSet<Integer> set = new TreeSet<Integer>(); 9 Random ran = new Random(); 10 int count = 0; 11 while (count < 10) { 12 boolean succeed = set.add(ran.nextInt(100)); 13 if (succeed) 14 count++; 15 } 16 int size = set.size(); 17 Integer[] array = new Integer[size]; 18 set.toArray(array); 19 System.out.println("生成的随机不重复的数据如下:"); 20 for (int value : array) { 21 System.out.print(value + " "); 22 } 23 } 24 }
14.逆序遍历ArrayList:
1 package basic; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.ListIterator; 6 7 public class ReverseOrder { 8 public static void main(String[] args) { 9 List<Integer> list = new ArrayList<Integer>(); 10 for (int i = 0; i < 10; ++i) 11 list.add(i); 12 System.out.println("顺序输出:" + list); 13 System.out.print("逆序输出:"); 14 ListIterator<Integer> li = list.listIterator(); 15 for (li = list.listIterator(); li.hasNext();) { 16 li.next(); 17 } 18 for (; li.hasPrevious();) { 19 System.out.print(li.previous() + " "); 20 } 21 } 22 }
15.用LinkedList实现猴子大王问题:
1 package basic; 2 3 import java.util.Iterator; 4 import java.util.LinkedList; 5 6 public class Monkey { 7 public static void main(String[] args) { 8 LinkedList<Integer> monkeys = new LinkedList<Integer>(); 9 int number, cnt; 10 for (number = 1; number <= 100; ++number) 11 monkeys.addLast(number); 12 cnt = 100; 13 number = 0; 14 Iterator<Integer> it = monkeys.iterator(); 15 while (cnt > 1) { 16 if (it.hasNext()) { 17 it.next(); 18 ++number; 19 } else { 20 it = monkeys.iterator(); 21 } 22 if (number == 14) { 23 number = 0; 24 it.remove(); 25 --cnt; 26 } 27 } 28 System.out.println("猴子大王编号为:" + monkeys.element()); 29 } 30 }
16.线程的启动和结束:
1 package basic; 2 3 import java.util.Date; 4 5 class ThreadX implements Runnable { 6 private Date runDate; 7 8 @SuppressWarnings("deprecation") 9 public void run() { 10 System.out.println("线程X已经启动..."); 11 this.runDate = new Date(); 12 System.out.println("启动时间:" + runDate.toLocaleString()); 13 } 14 } 15 16 class ThreadY extends Thread { 17 private boolean isRunState = false; 18 19 public void start() { 20 this.isRunState = true; 21 super.start(); 22 } 23 24 public void run() { 25 int i = 0; 26 try { 27 while (isRunState) { 28 this.setName("Thread-" + i++); 29 System.out.println("线程Y" + this.getName() + "正在运行"); 30 Thread.sleep(200); 31 } 32 } catch (Exception e) { 33 } 34 System.out.println(this.getName() + "结束运行..."); 35 } 36 37 public void setRunning(boolean isRunState) { 38 this.isRunState = isRunState; 39 } 40 41 public void startThreadY() { 42 System.out.println("启动线程Y..."); 43 this.start(); 44 } 45 46 public void stopThreadY() { 47 System.out.println("结束线程Y..."); 48 this.setRunning(false); 49 } 50 } 51 52 public class StartThread { 53 public void startX() { 54 Runnable runnX = new ThreadX(); 55 Thread threadX = new Thread(runnX); 56 threadX.start(); 57 } 58 59 public void startY() { 60 ThreadY ty = new ThreadY(); 61 ty.startThreadY(); 62 try { 63 Thread.sleep(1000); 64 } catch (Exception e) { 65 e.printStackTrace(); 66 } 67 ty.stopThreadY(); 68 } 69 70 public static void main(String[] args) { 71 StartThread test = new StartThread(); 72 test.startX(); 73 test.startY(); 74 } 75 }
17.设置线程优先级:
1 package basic; 2 3 class Clicker extends Thread { 4 private int click = 0; 5 private volatile boolean running = true; 6 7 public int getClick() { 8 return click; 9 } 10 11 public void run() { 12 while (running) 13 click += 1; 14 } 15 16 public void normalStop() { 17 running = true; 18 } 19 } 20 21 public class Pri { 22 public static void main(String[] args) { 23 Clicker trHigh, trLow; 24 trHigh = new Clicker(); 25 trLow = new Clicker(); 26 trHigh.setPriority(Thread.NORM_PRIORITY + 2); 27 trLow.setPriority(Thread.NORM_PRIORITY - 2); 28 trLow.start(); 29 trHigh.start(); 30 try { 31 Thread.sleep(1); 32 } catch (InterruptedException e) { 33 } 34 trHigh.normalStop(); 35 trLow.normalStop(); 36 try { 37 trHigh.join(); 38 trLow.join(); 39 } catch (InterruptedException e) { 40 } 41 System.out.println("trHigh的循环次数为:" + trHigh.getClick()); 42 System.out.println("trLow的循环次数为:" + trLow.getClick()); 43 } 44 }