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<data.length;x++)
{
System.out.print(data[x]+".");
}
}
public static boolean isRepeat(int temp[],int num) //判断数组中是否已经出现此号码的函数
{
if(num==0)
return false;
for(int x=0;x<temp.length;x++)
{
if(temp[x]==num){
return true;
}
}
return false;
}
}
每次出来的数字都不一样,结果如下:
彩票号码为:
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();
}
该程序简单的实现了客户端与服务端的链接,当客户端发送数据的时候,服务器端接收到数据并且在前面加上ECHO后发送到客户端,客户端接受到数据后再将数据显示输出,直到出现end为止。
注意:
ServerSocket主要用在TCP协议的服务器程序开发上,使用accept方法等待客户端连接,每一个连接的客户端都使用一个Socket。