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;xout.print(data[x]+".");
            }
        }
        public static boolean isRepeat(int temp[],int num)  //判断数组中是否已经出现此号码的函数
        {
            if(num==0)
                return false;
            for(int x=0;xif(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。

你可能感兴趣的:(JAVA)