贵州网站建设hsyunso,母版页和窗体做网站例子,江西省住房和城乡建设部网站,企业展厅策划设计公司有哪些Java中有很多内容在开发项目的过程中并不常用#xff0c;但是却是很重要的部分#xff0c;为了避免忘记#xff0c;今天重新温习了一遍Java中的重点和难点#xff0c;借此机会记录一下方便以后查找。本文主要分为以下几个部分#xff1a;1.进制的相互转换2.Java中位运算符…Java中有很多内容在开发项目的过程中并不常用但是却是很重要的部分为了避免忘记今天重新温习了一遍Java中的重点和难点借此机会记录一下方便以后查找。本文主要分为以下几个部分 1.进制的相互转换 2.Java中位运算符的解释和运用 3.Java数组中常用的排序算法分析 4.Java中折半查找方法的分析和运用 5.Java中对象的初始化过程 6.Java抽象类在模板方法模式中的运用 7.Java多线程的难点和设计多线程程序时需要注意的问题 8.Java中集合框架运用时需要注意的问题 9.Java中IO难点和重点的分析 10.Java网络编程的分析和运用 11.Java中常用正则表达式的运用和技巧第一部分进制的相互转换 1.十进制和二进制的相互转换十进制转二进制int num 102;
StringBuffer sb new StringBuffer();
while(num 1) {sb.append(num%2);num (int) (num / 2);
}
System.out.println(sb.reverse());二进制转十进制String binaryStr 1100110;
int num 0;
for (int i 0; i binaryStr.length(); i){num Integer.parseInt(String.valueOf(binaryStr.charAt(binaryStr.length() - 1 - i))) i;
}
System.out.println(num);第二部分Java中位运算符的解释和运用Java中一共有7个位运算符分别是、、、|、^、~、1.“”--左移运算符参与左移运算的数字乘以2的左移位数次方例如323*222.“”--右移运算符参与右移运算的数字除以2的右移位数次方例如323/223.“” --与运算符参与与运算的两个数字的二进制等位都为1时结果值的该位为1其余情况为0例如32001100100010,与运算符和“”运算符结合可以实现十进制转十六进制的功能num15 - num4这样一组运算就能得到一个十六进制位再将超过10的通过(num-10)A转换为十六进制位4.“|” --或运算符参与或运算的两个数字的二进制等位至少有一个为1时结果值的该位为1其余情况为0例如3|20011|001000115.“^” --异或运算符参与异或运算的两个数字的二进制等位如果不相同则为1相同则为0一个数字异或同一个数字两次则等于原数字。其中一个应用是在不使用第三个变量的情况下交换两个×××变量的值。int n 4,m 6;
//此时n n ^ m的值
n n ^ m; //此时m n ^ m,因为上句代码执行后n n ^ m所以这里m n ^ m n ^ m ^ m n(这里的m n中的n 4)
m n ^ m;//此时m n,n n ^ m , 所以n n ^ m n ^ m ^ nm这里的n m中的m 6
n n ^ m;6.“~” --取反运算符参与取反运算的数字的所有二进制位都取相反的值0变成1,1变成0因为一个正数的负数或者一个负数的正数等于它取反然后加1所以一个数取反则等于该数乘以-1然后减去17.“” --无符号右移高位补零功能和右移类似第三部分Java数组中常用的排序算法 1.选择排序int[] attr {3,6,5,85,2,44,1,46,67,0,45,4,134,123,112};for(int x 0;x attr.length() - 1, x) {for(int y x 1; y attr.length(); y) {if(attr[x]attr[y]) {attr[x] attr[x] ^ attr[y];attr[y] attr[x] ^ attr[y];attr[x] attr[x] ^ attr[y];}}
}for(int i in attr) {System.out.print(i );
} 2.冒泡排序int[] attr {3,6,5,85,2,44,1,46,67,0,45,4,134,123,112};for(int x attr.length() - 1;x 0; x--) {for(int y 0; y x;y) {if(attr[y] attr[y 1]) {attr[y] attr[y] ^ attr[y 1];attr[x] attr[y] ^ attr[y 1];attr[y] attr[y] ^ attr[y 1];}}
}for(int i in attr) {System.out.print(i );
}第四部分Java中折半查找方法的分析和运用 折半查找的原理是先将数组排序从小到大如果是从大到小则需要一些改变然后找到数组中的中间数然后把中间数和需要查找的数进行比较如果需要查找的数小于中间数则将最大索引赋值为中间结果索引1反之则把最小索引赋值为中间结果-1。代码如下int[] attr {3,6,5,85,2,44,1,46,67,0,45,4,134,123,112};int min 0;
int max attr.length();
int mid (int) (min max) / 2;Arrays.sort(attr);int key 67;
int keyIndex -1;
while(min max) {if(key attr[mid]) {max mid 1;} else if(key attr[mid]) {min mid - 1;} else {keyIndex mid;break;}mid (int) (min max) / 2;
}if(keyIndex ! -1) {System.out.println(attr[mid]);
}第五部分Java中对象的初始化过程初始化静态代码块初始化属性默认值初始化属性显示设置值初始化构造代码块初始化构造函数第六部分Java抽象类在模板方法模式中的运用这里举一个简单的示例代码来说明代码如下//首先声明一个抽象类这个抽象类的作用是计算一段代码的执行时间
public abstract class GetTime {public final void getDoWorkTime() {int start System.currentTimeMillis();doWork();int end System.currentTimeMillis();System.out.println(工作时间 (start - end));}public abstract void doWork();
}//声明一个GetTime类的子类并实现doWork方法
public class SubGetTime extends GetTime {Overridepublic void doWork() {System.out.println(做一些工作);}
}public class Test {public static void main(String[] args) {SubGetTime getTime new SubGetTime();getTime.getDoWorkTime();}
}//这里的doWork方法声明为抽象方法然后交给子类去实现需要做的工作这种方式就是模板方法模式这是设计模式中行为模式中的一种第七部分Java多线程的难点和设计多线程程序时需要注意的问题 Java多线程中的难点和重点主要是线程安全的问题这里就主要说一下线程安全的问题因为在JDK1.5后Java引入了Lock和Condition来代替synchronized、wait和notify所以这里分两种情况来讨论。 首先在Java中创建线程的方式有两种第一种是继承Thread类然后复写run方法第二种方式是实现Runable接口并实现run方法。 继承Threadpublic class SaveMoney extends Thread {Overridepublic void run() {System.out.println(存钱);}
}
public class GetMoney extends Thread {Overridepublic void run() {System.out.println(取钱);}
}
public class BankTest {public static void main(String[] args) {SaveMoney saveMoneyThread new SaveMoney();GetMoney getMoneyThread new GetMoney();saveMoneyThread.start();//启动线程这里如果调用run是执行run方法不是启动线程需要注意getMoneyThread.start();}
} 实现Runable接口public class SaveMoney implements Runable {public void run() {System.out.println(存钱);}
}
public class GetMoney implements Runable {public void run() {System.out.println(取钱);}
}
public class BankTest {public static void main(String[] args) {new Thread(new SaveMoney()).start();//启动线程这里如果调用run是执行run方法不是启动线程需要注意new Thread(new GetMoney()).start();}
}下面就在JDK1.5之前和JDK1.5之后两种情况下结合银行取钱和存钱的例子来说明线程同步的问题JDK1.5之前//首先创建一个用户帐户类
public class BankAccont {private String accontName ;private Double totalMoney 0d;public BankAccont(String accontName, Double initMoney) {this.accontName accontName;this.totalMoney initMoney;}public void saveMoney(Double money) {this.totalMoney money;System.out.println(存了 money 块钱);}public void getMoney(Double money) {this.totalMoney - money;System.out.println(取了 money 块钱);}public String toString() {System.out.println(this.accontName 总共还有 this.totalMoney 元人民币);}
}//分别创建存钱和取钱的线程使用实现Runable接口的方式这种方式可以轻松的让不同的线程执行相同的任务除非程序员打算修改或增强类的基本行为否则不应为该类Thread创建子类
public class SavaMoney implements Runable {private BankAccont accont null;public SaveMoney(BankAccont accont) {this.accont accont;}public void run() {//这里使用同一个锁进行同步synchronized(BankAccont.class) {while(true) {this.accont.saveMoney(100);}}}
}
public class GetMoney implements Runable {private BankAccont accont null;public GetMoney(BankAccont accont) {this.accont accont;}public void run() {//这里使用同一个锁进行同步synchronized(BankAccont.class) {while(true) {this.accont.getMoney(100);}}}
}
public class BankTest {public static void main(String[] args) {BankAccont accont new BankAccont(张三, 1000);new Thread(new SaveMoney(accont)).start();new Thread(new GetMoney(accont)).start();accont.toString();}
}JDK1.5之后//首先创建一个用户帐户类
public class BankAccont {private String accontName ;private Double totalMoney 0d;private final Lock lock new RentrantLock();private final Condition condition_save lock.newCondition();private final Condition condition_get lock.newCondition();public BankAccont(String accontName, Double initMoney) {this.accontName accontName;this.totalMoney initMoney;}public void saveMoney(Double money) {lock.lock();condition_get.await();//这里引用不合适只是一个示例this.totalMoney money;System.out.println(存了 money 块钱);condition_get.signal();//这里引用不合适只是一个示例lock.unlock();}public void getMoney(Double money) {lock.lock();condition_save.await();//这里引用不合适只是一个示例this.totalMoney - money;System.out.println(取了 money 块钱);condition_save.signal();//这里引用不合适只是一个示例lock.unlock();}public String toString() {System.out.println(this.accontName 总共还有 this.totalMoney 元人民币);}
}//分别创建存钱和取钱的线程使用实现Runable接口的方式这种方式可以轻松的让不同的线程执行相同的任务除非程序员打算修改或增强类的基本行为否则不应为该类Thread创建子类
public class SavaMoney implements Runable {private BankAccont accont null;public SaveMoney(BankAccont accont) {this.accont accont;}public void run() {while(true) {this.accont.saveMoney(100);}}
}
public class GetMoney implements Runable {private BankAccont accont null;public GetMoney(BankAccont accont) {this.accont accont;}public void run() {while(true) {this.accont.getMoney(100);}}
}
public class BankTest {public static void main(String[] args) {BankAccont accont new BankAccont(张三, 1000);new Thread(new SaveMoney(accont)).start();new Thread(new GetMoney(accont)).start();accont.toString();}
} 以上只是一个简单的示例需要根据需要进行修改。在设计多线程程序的时候需要多考虑线程同步的问题线程安全在多线程中还有一个问题就是Java中有哪些线程安全的集合 Java中线程安全的集合分别是Vector(向量已经不常用了)、HashTable、Enumeration(枚举),除了这几个其余都为线程不安全集合。StringBuffer和StringBuider的差别也是StringBuffer为线程安全StringBuider为线程不安全。 Java多线程相关的问题暂时只想到这些再想起的时候再补充。©著作权归作者980254744所有来自51CTO博客作者980254744的原创作品。该篇文章我从别的地方看到的感觉有点帮助所以我分享一下给大家看看。如果觉得好的话麻烦大家评论转发一下。资料下面是我自己积累的一些JAVA资料如果需要的话回复资料二字即可免费获取或者点击我下面链接获取石墨文档shimo.im