• Java学习第七篇:与运行环境交互


    目录

    一.与用户互动

      1.main方法形参

      2.使用Scanner类获取输入

      3.使用BufferedReader类获取输入

    二.常用类

      1.System类和Runtime类

      2.String, StringBuilder和StringBuffer类

      3.Math类

      4.Random和ThreadLocalRandom类

      5.BigDecimal类

      6.Calendar类

    三.正则表达式

      1.正则表达式使用查询表

      2.使用正则表达式

      3.程序实例

    正文

    一.与用户互动

    1.main方法的形参

    main方法中包括一个字符串数组形参,根据方法调用的规则:谁调用方法,谁负责为形参赋值。也就是说,main方法由JVM调用,即args形参应该由JVM负责赋值。

    public class ArgsTest {
        public static void main(String[] args) {
            System.out.println(args.length);
            for(String arg : args) {
                System.out.println(arg);
            }
        }
    }
    View Code

    因程序放在本地的E:myJavaCode下,所以运行命令和运行结果如下:

    2.使用Scanner类获取输入

    import java.util.*;
    public class ScannerKeyBoardTest {
        public static void main(String[] args) {
            //System.in代表标准输入
            Scanner sc=new Scanner(System.in);
            //以回车作为分隔符
            sc.useDelimiter("
    ");
            
            //判断是否还有下个输入项
            while(sc.hasNext()) {
                //输出
                System.out.println("键盘输入的内容是: "+sc.next());
            }
        }
    }
    View Code

    运行结果:

    Java
    键盘输入的内容是: Java

    C++
    键盘输入的内容是: C++

    PHP
    键盘输入的内容是: PHP

    注:如果将sc.useDelimiter(" ")这行注释,则默认以空格、Tab空白等作为分隔符。

    Scanner不仅能读取用户键盘输入,还可以读取文件输入。

    import java.io.*;
    import java.util.*;
    public class ScannerFileTest{
        public static void main(String[] args) throws Exception{
            //将一个File对象作为Scanner的构造参数,Scanner读取文件内容
            Scanner sc=new Scanner(new File("ScannerFileTest.java"));
            System.out.println("ScannerFileTest.java的文件内容为:");
            
            //判断是否还有下一行
            while(sc.hasNextLine()) {
                //输出下一行
                System.out.println(sc.nextLine());
            }
        }
    }
    View Code

    运行结果:

    3.使用BufferedReader类获取输入

    import java.io.*;
    public class KeyboardInTest {
        public static void main(String[] args) throws Exception {
            //创建BufferedReader对象
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            
            //输出
            String line=null;
            while( (line=br.readLine()) !=null ) {
                System.out.println("用户从键盘输入的是: "+line);
            }
        }
    }
    View Code

    运行结果:

    Java
    用户从键盘输入的是: Java
    C++
    用户从键盘输入的是: C++
    PHP
    用户从键盘输入的是: PHP

    二.常用类

    1.System类和Runtime类

    Java程序在不同操作系统上运行时,可能需要取得平台相关的属性,或者调用平台命令来完成特定的功能。Java提供了System类和Runtime类来与程序的运行平台进行交互。

    (1).System类

    import java.io.*;
    import java.util.*;
    public class SystemTest {
        public static void main(String[] args) throws Exception{
            //获取系统所有的环境变量
            Map<String, String> env=System.getenv();
            for(String key : env.keySet() ) {
                System.out.println(key + "------>" + env.get(key));
            }
            
            //获取指定的环境变量
            System.out.println(env.get("JAVA_HOME"));
            
            //获取系统的所有属性,并将属性保存到文件props.txt文件中
            Properties props=System.getProperties();
            props.store(new FileOutputStream("props.txt"), "System Properties");
            
            //输出系统指定属性
            System.out.println(System.getProperty("os.name"));
        }
    }
    View Code

    System类还提供了identityHashCode(Object x)方法,来判断两个对象是不是同一个对象。

    public class IdentityHashCodeTest {
        public static void main(String[] args) {
            String s1=new String("Hello");
            String s2=new String("Hello");
            //String重写了hashCode()方法——改为根据字符序列计算hashCode值
            //因为s1和s2的字符序列相同,所以它们的hashCode()方法返回值相同
            System.out.println(s1.hashCode() + "---" + s2.hashCode());
            
            //s1和s2是不同的字符串对象,所以它们的identityHashCode值不同
            System.out.println(System.identityHashCode(s1)+"---"+
                               System.identityHashCode(s2)
                               );
            
            String s3="Java";
            String s4="Java";
            //s3和s4是相同的字符串对象,所以它们的hashCode()方法返回值和identityHashCode值相同
            System.out.println(s3.hashCode() + "---" + s4.hashCode());
            System.out.println(System.identityHashCode(s3)+"---"+
                    System.identityHashCode(s4)
                    );
        }
    }
    View Code

    运行结果:

    69609650---69609650
    12258573---5629279
    2301506---2301506
    21350489---21350489

    (2).Runtime类

    每个Java程序都有一个与之对应的Runtime实例,应用程序通过该对象与其运行时环境相连。应用程序不能创建自己的Runtime实例,但可以通过getRuntime()方法获取与之关联的Runtime对象。

    Runtime类代表Java程序的运行时环境,可以访问JVM的相关信息,如处理器数量、内存信息等。另外,Runtime类还可以直接单独启动一个进程来运行操作系统的命令。

    public class RuntimeTest {
        public static void main(String[] args) throws Exception {
            //获取Java程序关联的运行时对象
            Runtime rt=Runtime.getRuntime();
            //访问JVM的相关信息
            System.out.println("处理器数量: "+rt.availableProcessors());
            System.out.println("空闲内存数: "+rt.freeMemory());
            System.out.println("可用最大内存数: "+rt.maxMemory());
            
            //运行记事本程序
            rt.exec("notepad.exe");
        }
    }
    View Code

    2.String, StringBuilder和StringBuffer类

    String, StringBuilder和StringBuffer类的具体方法见Java API文档。

    public class StringBuilderTest {
        public static void main(String[] args) {
            StringBuilder sb=new StringBuilder();
            //追加字符串
            sb.append("java");
            System.out.println(sb);
    
            //插入
            sb.insert(0, "hello ");
            System.out.println(sb);
    
            //替换
            sb.replace(5, 6, ",");
            System.out.println(sb);
    
            //删除
            sb.delete(5, 6);
            System.out.println(sb);
    
            //反转
            sb.reverse();
            System.out.println(sb);
    
            //length
            System.out.println(sb.length());
            //capacity
            System.out.println(sb.capacity());
            
            //改变StringBuilder的长度
            sb.setLength(5);
            System.out.println(sb);
        }
    }
    View Code

    运行结果:

    java
    hello java
    hello,java
    hellojava
    avajolleh
    9
    16
    avajo

    3.Math类

    Math类的具体方法见Java API文档。

    public class MathTest {
        public static void main(String[] args) {
            /*----------下面是三角运算----------*/
            //将弧度转换成角度
            System.out.println("Math.toDegrees(1.57): "+Math.toDegrees(1.57));
            //将角度转换为弧度
            System.out.println("Math.toRadians(90): "+Math.toRadians(90));
    
            /*----------下面是取整运算----------*/
            //向下取整
            System.out.println("Math.floor(1.2): "+Math.floor(1.2));
            //向上取整
            System.out.println("Math.ceil(1.2): "+Math.ceil(1.2));
            //四舍五入
            System.out.println("Math.round(2.3): "+Math.round(2.3));
    
            /*----------下面是乘方、开方、指数运算----------*/
            //计算平方根
            System.out.println("Math.sqrt(2.3): "+Math.sqrt(2.3));
            //计算立方根
            System.out.println("Math.cbrt(9): "+Math.cbrt(9));
            //返回欧拉数e的n次幂
            System.out.println("Math.exp(2): "+Math.exp(2));
            //计算乘方
            System.out.println("Math.pow(3,2): "+Math.pow(3,2));
        }
    }
    View Code

    运行结果:

    Math.toDegrees(1.57): 89.95437383553926
    Math.toRadians(90): 1.5707963267948966
    Math.floor(1.2): 1.0
    Math.ceil(1.2): 2.0
    Math.round(2.3): 2
    Math.sqrt(2.3): 1.51657508881031
    Math.cbrt(9): 2.080083823051904
    Math.exp(2): 7.38905609893065
    Math.pow(3,2): 9.0

    4.Random和ThreadLocalRandom类

    ThreadLocalRandom类的用法与Random基本一致,只是ThreadLocalRandom用于并发访问的环境。

    import java.util.Arrays;
    import java.util.Random;
    
    public class RandomTest {
        public static void main(String[] args) {
            Random rand=new Random();
    
            //生成随机布尔值
            System.out.println("rand.nextBoolean(): "+rand.nextBoolean());
    
            //生成随机byte
            byte[] buffer=new byte[16];
            rand.nextBytes(buffer);
            System.out.println(Arrays.toString(buffer));
    
            //生成0.0~1.0之间的伪随机double数
            System.out.println("rand.nextDouble(): "+rand.nextDouble());
    
            //生成平均值是0.0,标准差是1.0的伪高斯数
            System.out.println("rand.nextGaussian(): "+rand.nextGaussian());
    
            //生成一个处于int整数取值范围的伪随机数
            System.out.println("rand.nextInt(): "+rand.nextInt());
    
            //生成0~26之间的伪随机整数(包含0,但不包含26)
            System.out.println("rand.nextInt(26): "+rand.nextInt(26));
    
            //生成指定区间的随机数[min,max]
            //int rand=rand.nextInt(max-min+1)+min;
            //生成[120,230]之间的随机数
            System.out.println("[120,230]之间的随机数: "+(rand.nextInt(230-120+1)+120));
    
            //生成一个处于long整数值范围的伪随机数
            System.out.println("rand.nextLong(): "+rand.nextLong());
        }
    }
    View Code

    运行结果:

    rand.nextBoolean(): true
    [47, -75, -97, -94, 63, 93, -22, -40, -79, -91, -4, -41, -90, 116, -73, 121]
    rand.nextDouble(): 0.1644444197510042
    rand.nextGaussian(): 0.8657605571241994
    rand.nextInt(): -488956561
    rand.nextInt(26): 13
    [120,230]之间的随机数: 199
    rand.nextLong(): 7184787237768710562

    5.BigDecimal类

    float,double两种基本类型容易引起精度的丢失,为此Java提供了BigDecimal类。

    import java.math.BigDecimal;
    
    public class BigDecimalTest {
        public static void main(String[] args) {
            BigDecimal f1=new BigDecimal("0.05");
            BigDecimal f2=BigDecimal.valueOf(0.01);
            BigDecimal f3=new BigDecimal(0.05);
    
            System.out.println("使用String作为BigDecimal构造器参数: ");
            System.out.println("0.05+0.01="+f1.add(f2));
            System.out.println("0.05-0.01="+f1.subtract(f2));
            System.out.println("0.05*0.01="+f1.multiply(f2));
            System.out.println("0.05/0.01="+f1.divide(f2));
    
            System.out.println("使用double作为BigDecimal构造器参数: ");
            System.out.println("0.05+0.01="+f3.add(f2));
            System.out.println("0.05-0.01="+f3.subtract(f2));
            System.out.println("0.05*0.01="+f3.multiply(f2));
            System.out.println("0.05/0.01="+f3.divide(f2));
        }
    }
    View Code

    运行结果:

    使用String作为BigDecimal构造器参数:
    0.05+0.01=0.06
    0.05-0.01=0.04
    0.05*0.01=0.0005
    0.05/0.01=5
    使用double作为BigDecimal构造器参数:
    0.05+0.01=0.06000000000000000277555756156289135105907917022705078125
    0.05-0.01=0.04000000000000000277555756156289135105907917022705078125
    0.05*0.01=0.0005000000000000000277555756156289135105907917022705078125
    0.05/0.01=5.000000000000000277555756156289135105907917022705078125

    注:从程序运行结果我们可以看出,创建BigDecimal对象时,不要直接使用double浮点数作为参数调用BigDecimal构造器,否则同样会发生精度丢失的问题。

    如果程序中要求对double浮点数进行加、减、乘、除基本运算,则需要先将double类型数值包装成BigDecimal对象,调用BigDecimal对象的方法执行运算后再将结果转换成double类型变量。这是比较烦琐的过程,可以考虑以BigDecimal为基础定义一个Arith工具类。

    import java.math.BigDecimal;
    
    /**
     * Created by Administrator on 13-12-26.
     * Description: 如果程序中要求对double浮点数进行加、减、乘、除基本运算,则需要先将double类型数值
     *              包装成BigDecimal对象,调用BigDecimal对象的方法执行运算后再将结果转换成double类型
     *              变量。这是比较烦琐的过程,可以考虑以BigDecimal为基础定义一个Arith工具类.
     */
    public class Arith {
    
        //默认除法运算精度
        private static final int DEF_DIV_SCALE=10;
    
        //构造器私有,让这个类不能实例化
        private Arith() {}
    
        /**
         * 提供精确的加法运算
         * @param v1 被加数
         * @param v2 加数
         * @return 两个参数的和
         */
        public static double add(double v1, double v2) {
            BigDecimal b1=BigDecimal.valueOf(v1);
            BigDecimal b2=BigDecimal.valueOf(v2);
            return b1.add(b2).doubleValue();
        }
    
        /**
         * 提供精确的减法运算
         * @param v1 被减数
         * @param v2 减数
         * @return 两个参数的差
         */
        public static double sub(double v1, double v2) {
            BigDecimal b1=BigDecimal.valueOf(v1);
            BigDecimal b2=BigDecimal.valueOf(v2);
            return b1.subtract(b2).doubleValue();
        }
    
        /**
         * 提供精确的乘法运算
         * @param v1 被乘数
         * @param v2 乘数
         * @return 两个参数的积
         */
        public static double mul(double v1, double v2) {
            BigDecimal b1=BigDecimal.valueOf(v1);
            BigDecimal b2=BigDecimal.valueOf(v2);
            return b1.multiply(b2).doubleValue();
        }
    
        /**
         * 提供相对精确的除法运算,当发生除不尽的情况时,精确到小数点以后10位的数字四舍五入
         * @param v1 被除数
         * @param v2 除数
         * @return 两个参数的商
         */
        public static double div(double v1, double v2) {
            BigDecimal b1=BigDecimal.valueOf(v1);
            BigDecimal b2=BigDecimal.valueOf(v2);
            return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
        }
    
        //主函数,测试
        public static void main(String[] args) {
            System.out.println("0.05+0.01=" +Arith.add(0.05, 0.01));
            System.out.println("1.0-0.42=" +Arith.sub(1.0, 0.42));
            System.out.println("4.05*1.03=" +Arith.mul(4.05, 1.03));
            System.out.println("12.0/7.0=" +Arith.div(12.0, 7.0));
        }
    }
    View Code

    6.Calendar类

    import java.util.Calendar;
    
    public class CalendarTest {
        public static void main(String[] args) {
            Calendar c=Calendar.getInstance();
            //取出年
            System.out.println(c.get(Calendar.YEAR));
            //取出月(月份的起始值是0)
            System.out.println(c.get(Calendar.MONTH));
            //取出日
            System.out.println(c.get(Calendar.DATE));
            //分别设置年月日时分秒
            c.set(2003, 10, 23, 12, 32, 33);
            System.out.println(c.getTime());
            //将Calendar的年推前一年
            c.add(Calendar.YEAR, -1);
            System.out.println(c.getTime());
            //将Calendar的月推前8个月
            c.roll(Calendar.MONTH, -8);
            System.out.println(c.getTime());
        }
    }
    View Code

    运行结果:

    2013
    11
    27
    Sun Nov 23 12:32:33 CST 2003
    Sat Nov 23 12:32:33 CST 2002
    Sat Mar 23 12:32:33 CST 2002

    7.TimeZone类

    import java.util.Arrays;
    import java.util.TimeZone;
    
    public class TimeZoneTest {
        public static void main(String[] args) {
            //取得Java所支持的所有时区ID
            String[] ids= TimeZone.getAvailableIDs();
            System.out.println(Arrays.toString(ids));
            TimeZone my=TimeZone.getDefault();
            //获取系统默认时区的ID
            System.out.println(my.getID());            //Asia/Shanghai
            //获取系统默认时区的名称
            System.out.println(my.getDisplayName());   //中国标准时间
            //获取指定ID的时区名称
            System.out.println(TimeZone.getTimeZone("CNT").getDisplayName()); //纽芬兰标准时间
        }
    }
    View Code

    三.正则表达式

    1.正则表达式使用查询表

    贪婪模式:数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。

    勉强模式:它只会匹配最少的字符,也称为最小匹配模式。

    占有模式:目前只有Java支持,很少用。

    2.使用正则表达式

    ①String类提供的操作正则表达式的方法

    ②Pattern和Matcher类

    Matcher类提供了如下几个常用方法

    Pattern和Matcher类使用正则表达式的典型调用顺序如下

    3.程序实例

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class FindGroup {
        public static void main(String[] args) {
            Matcher m= Pattern.compile("\w+").matcher("Java is very easy!");
            while(m.find()) {
                System.out.println(m.group()+ "子串的起始位置: "+m.start()
                                            + "子串的结束位置: "+m.end());
            }
        }
    }
    View Code

    运行结果:

    Java子串的起始位置: 0子串的结束位置: 4
    is子串的起始位置: 5子串的结束位置: 7
    very子串的起始位置: 8子串的结束位置: 12
    easy子串的起始位置: 13子串的结束位置: 17

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class ReplaceTest {
        public static void main(String[] args) {
            String[] msgs={
                    "Java has regular expressions in 1.4",
                    "regular expressions now expressing in Java",
                    "Java represses oracular expressions"
            };
            Pattern p=Pattern.compile("re\w*");
            Matcher matcher=null;
            for(String msg : msgs) {
                if(matcher==null) {
                    matcher=p.matcher(msg);
                }else {
                    matcher.reset(msg);
                }
                System.out.println(matcher.replaceAll("哈哈:)"));
            }
        }
    }
    View Code

    运行结果:

    Java has 哈哈:) exp哈哈:) in 1.4
    哈哈:) exp哈哈:) now exp哈哈:) in Java
    Java 哈哈:) oracular exp哈哈:)

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class MatchesTest {
        public static void main(String[] args) {
            String[] mails={
                    "kongyeeku@163.com",
                    "kongyeeku@gmail.com",
                    "ligang@crazyit.org",
                    "wawa@abc.xx"
            };
            String mailRegEx="\w{3,20}@\w+\.(com|org|cn|net|gov)";
            Pattern mailPattern=Pattern.compile(mailRegEx);
            Matcher matcher=null;
            for(String mail : mails) {
                if(matcher==null) {
                    matcher=mailPattern.matcher(mail);
                }
                else {
                    matcher.reset(mail);
                }
                String result=mail + (matcher.matches() ? "是" : "不是")
                                   + "一个有效的邮件地址!";
                System.out.println(result);
            }
        }
    }
    View Code

    运行结果:

    kongyeeku@163.com是一个有效的邮件地址!
    kongyeeku@gmail.com是一个有效的邮件地址!
    ligang@crazyit.org是一个有效的邮件地址!
    wawa@abc.xx不是一个有效的邮件地址!

  • 相关阅读:
    拍照
    【HDU 4372】 Count the Buildings (第一类斯特林数)
    【HDU 5370】 Tree Maker(卡特兰数+dp)
    【HDU 4436】 str2int (广义SAM)
    【BZOJ 3926】 [Zjoi2015]诸神眷顾的幻想乡 (广义SAM)
    【HDU 5184】 Brackets (卡特兰数)
    【HDU 1133】 Buy the Ticket (卡特兰数)
    【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
    【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)
    【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)
  • 原文地址:https://www.cnblogs.com/shunran/p/3476951.html
Copyright © 2020-2023  润新知