Java学习与技术总结——(三)高级编程及新特性

1. Annotation JDK1.5之后最具有鲜明特点的莫过于注解技术的提出与应用,利用注解技术可以回避面向对象中覆写方法名称固定的问题,并且其直观的描述也适合开发者进行程序的编写。
1.1 准确的覆写:@Override
当进行方法的覆写时,为了保证子类所覆写的方法的确是父类中定义过的方法,就可以加上”@Override” 注解,这样即使在覆写的时候出现了错误,也可以在编译时检查出来。例如:

class Car { @Override//注解后只要正确进行覆写,就不会报错 public String toString() { return "Java"; }public String tostring() { return "Java" } }

注意:不写该注解在正确覆写的时候不会出错,但是一旦覆写出错例如下面的情况将toString大小拼写错误,那么无法得知覆写失败。
1.2 声明过期操作:@Deprecated
可以用次注解来声明过期的不建议使用的方法,使用方法和上面类似。
1.3 压制警告:@SuppressWarnings
在编写程序的时候经常会在编译时产生安全警告,但是我们却执意这样做,这样就可以使用@SuppressWarnings注解来压制警告信息。例如:
@SuppressWarnings{("rawtypes","unchecked")} //压制rawtypes、unchecked警告信息

2. Java常用类库 2.1 Random类
java.util.Random是一个专门负责产生随机数的操作类,用法基本有如下:
方法名称 函数描述
public Random(); 创建一个Random实例;
public Random(long seed); 创建一个新的Random实例并且设置一个种子数;
public int nextInt(int bound); 产生一个不大于指定边界的随机整数;
举个简单的例子如下,产生了10个不大于100的数。
Random rand=new Random(); for(int i=0; i<10; i++) { System.out.println(rand.nextInt(100)+"、"); }

下面以此编写一个彩票随机选号系统:
public class Random { public static void main(String[] args ) { java.util.Random rand =new java.util.Random(); int data[]=new int[7]; int foot=0; while(foot<7) { int t=rand.nextInt(37); //生成一个不大于37的数字 if(!isRepeat(data,t))//如果数组中没有这个数字就加入 { data[foot++]=t; } } Arrays.sort(data); System.out.println("彩票号码为:"); for(int x=0; x

每次出来的数字都不一样,结果如下:
彩票号码为: 3.4.6.14.16.19.34.

2.2 Date类
日期是开发中经常会使用的操作之一,特别是在Android开发中也会出现日期的使用,那么在Java中如何实现日期的处理操作呢?一般使用Date类和日期格式化类SimpleDateFormat来输出时间,
java.util.Date可以获得当前时间,但是显得格式不适合阅读,这时候搭配日期格式化类SimpleDateFormat就可以将日期转化为字符串输出了,例如:
public class data { public static void main(String args[]) { Date date =new Date(); System.out.println("未格式化的原始数据:"+date); SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS:"); String string=simpleDateFormat.format(date); System.out.println("格式化的数据:"+string); } }

注意:日期时间标记:年(yyyy)、月(MM)、日(dd)、时(HH)、分(mm)、秒(ss)、毫秒(SSS)
输出得到如下结果:
未格式化的原始数据:Sat Dec 30 00:31:11 CST 2017 格式化的数据:2017-12-30 00:31:11:261:

2.3 Arrays 类
在Java中,Arrays是一个定义在java.util包中专门进行数组操作的类,在这个类中定义了与数组有关的基本操作:二分查找、相等判断、数组填充等等。
方法名称 函数描述
public static boolean equals(int[] a,int[] a2); 判断数组相等
public static void fill(int[] a,int val); 将指定内容填充进数组
public static void sort(int[] a) 数组排序
public static int binarySearch(int[] a,int key) 对排序后的数组进行二分查找指定元素
实现二分查找:
int data[] =new int[]{1,5,6,9,4,3,5,6,7,5}; java.util.Arrays.sort(data); for(int i:data) { System.out.print(i+","); } System.out.println(""); System.out.println(Arrays.binarySearch(data, 3)); }

输出为:
1,3,4,5,5,5,6,6,7,9,
1
3 正则表达式 正则表达式在本质上是一种字符串操作的语法规则,正则表达式在JDK1.4引入Java,,主要用来匹配需要的字符串然后进行拆分、替换等操作,在网络爬虫中一般有广泛应用。
3.1 正则标记
常用的正则标记都在java.util.regex.Pattern类中说明,常用的有以下几种。
1.单个字符
  • 字符 :表示一位字符组成;
  • \ :表示转义字符“\”,所以后面当需要表示”\d”时,就需要使用”\d”来表示。
  • \n :匹配换行(\n)符号
2.字符集
  • [abc]:表示可能是字符a,字符b,字符c中的任意一位;
  • [^abc]:表示不是字符a、b、c中的任意一位;
  • [a-z]:表示所有的小写字母;
  • [a-zA-Z]:表示任意的一位字母,不区分大小写;
  • [0-9]:表示任意的一位数字;
3.简化的字符集表达式
  • . :一个点表示任意的一位字符;
  • \d:等价于[0-9],表示任意一位数字的简写;
  • \D:等价于[^0-9],表示不是任意一位数字的简写;
  • \s:表示任意的空白字符,例如:”\t”“\n”;
  • \S:表示任意的非空白字符;
  • \w:表示由任意字母、数字、_组成
4.边界匹配
  • ^:正则的开始;
  • $:正则的结束;
5.数量表达
  • 正则?:表示此正则可以出现0或者1次以上;
  • 正则+:表示此正则可以出现1次或者1次以上;
  • 正则*:表示此正则可以出现0、1或者多次;
  • 正则{n}:表示此正则正好出现n次;
  • 正则{n,}:表示此正则出现n次以上;
3.2 String中的正则
在实际使用中一般直接使用String中的方法来见简化正则的操作,一般常用以下方法
方法名称 函数描述
public boolean matches(String regex) 正则验证,使用指定字符串判断是否符合给出的正则表达式结构
public String replaceAll(String regex,String replacement) 满足验证条件内容全部替换成新的内容
public String[] split(String regex) 按照指定的正则标记进行字符串全拆分
例如:
String str= "hello***wor***ld!"; //原来的乱七八糟语句 System.out.println(str.replaceAll("[^a-z]", "")); //将语句中不是小写字母的全部去掉

输出:
helloworld
注意:正则表达式是一个String字符串
或者这样:
String str= "mooc9world123java44android"; //原来的乱七八糟语句 String result[]=str.split("\\d+"); //注意拆分后变成字符串数组,每个索引对应一个分出来的字符串 for(String str1:result) { System.out.println(str1); //输出拆分后的每个字符串 }

输出结果如下:
mooc world java android

总算忙完期末那堆事情了,继续复习JAVA,开更…
针对利用String的正则再举几个例子加深印象
  • 验证一个字符串是否是数字,若是则将其变为double型
String str= "10.10"; //原来的数字 String regex="\\d+(\\.\\d+)?"; //设置正则 \\d+表示一位以上的数字 \\. 表示小数点 ?表示0个或1个这样的小数部分 if(str.matches(regex))//正则前需要验证 { System.out.println(Double.parseDouble(str)); }

  • 判断给定字符串是否为IP地址
String str= "192.168.16.1"; String regex="\\d{1,3}\\.\\d{1,3}\\.\\d{1,2}\\.\\d{1}"; //设置正则 \\d{1,3}表示该处出现1位或者3位数字 if(str.matches(regex)) { System.out.println(str.matches(regex)); }

  • 判断是否为日期格式,若是则转换成Date型数据,本次验证年-月-日格式
String str= "2018-01-20"; //时间串 String regex="\\d{4}-\\d{2}-\\d{2}"; //设置时间正则 因为要使用SimpleDateFormat格式化日期所以必须使用\\d{2} if(str.matches(regex)) { Date date2=new SimpleDateFormat("yyyy-MM-dd").parse(str); System.out.println(date2); }

4 Java 网络编程 java.net包提供了网络编程有关的开发工具类,并在此包中有以下的主要核心操作类
4.1 ServerSocket类:是一个封装支持TCP(传输控制协议)的操作类,只要工作在服务器端,用于接受客户端请求;
方法名称 功能
Public ServerSocket(int port) 开辟一个指定的端口监听,一般使用5000以上端口
Public Socket accept() 服务器端接受客户端请求,通过Socket返回
Public void close() 关闭服务器端
4.2 Socket类:也是一个封装支持TCP协议的操作类,每一个Socket对象都表示一个客户端。
方法名称 功能
Public Socket(String host,int port) 指定要连接的主机(IP地址)和端口
Public OutputStream getOutputStream() 取得指定客户端的输出对象,使用PrintStream打印流操作
Public InputStream getInputStream() 从指定的客户端读取操作,使用Scanner扫描流操作
4.4 网络开发的一个经典模型————ECHO
主要设计思路就是客户端发送任意信息到服务端,服务端需要将数据接受并且在前面加上ECHO后将数据返还给客户端。
服务端部分程序如下:
ServerSocket serverSocket=new ServerSocket(9999); //定义连接接口 Socket clinet=serverSocket.accept(); //等待客户端连接 //得到客户端输入数据以及向客户端输出数据的对象,利用扫描流接受,打印流输出 Scanner scanner=new Scanner(clinet.getInputStream()); PrintStream printStream=new PrintStream(clinet.getOutputStream()); boolean flag=true; while(flag) { if(scanner.hasNext()){//判断是否有东西输入 String str=scanner.next().trim(); //得到客户端输入数据并且去掉空格 if(str.equalsIgnoreCase("end"))//程序结束标记 { printStream.println("输入已经结束"); flag=false; //推出循环}else { printStream.println("echo"+str); }} } scanner.close(); printStream.close(); clinet.close(); serverSocket.close(); }

客户端程序:
Socket client=new Socket("192.168.1.1", 9999); //服务器端口和地址 Scanner input =new Scanner(System.in); //键盘输入数据 //得到客户端输入数据以及向客户端输出数据的对象,利用扫描流接受,打印流输出 Scanner scanner=new Scanner(client.getInputStream()); PrintStream out=new PrintStream(client.getOutputStream()); boolean flag=true; while(flag) { if(input.hasNext()){//判断键盘有无东西输入 String str=scanner.next().trim(); //得到键盘输入数据并且去掉空 out.println(str); //发送数据到服务器端 if(str.equalsIgnoreCase("end"))//程序结束标记 { flag=false; //推出循环} if (scanner.hasNext()) {//判断服务器端是否有回应System.out.println(scanner.next()); //输出回应数据 }} } input.close(); scanner.close(); out.close(); client.close(); }

【Java学习与技术总结——(三)高级编程及新特性】该程序简单的实现了客户端与服务端的链接,当客户端发送数据的时候,服务器端接收到数据并且在前面加上ECHO后发送到客户端,客户端接受到数据后再将数据显示输出,直到出现end为止。
注意:
ServerSocket主要用在TCP协议的服务器程序开发上,使用accept方法等待客户端连接,每一个连接的客户端都使用一个Socket。

    推荐阅读