• Java核心技术梳理-基础类库


    一、引言

    Oracle为Java提供了丰富的基础类库,Java 8 提供了4000多个基础类库,熟练掌握这些基础类库可以提高我们的开发效率,当然,记住所有的API是不可能也没必要的,我们可以通过API文档或直接网上搜索来逐渐熟悉大部分类的功能和方法,下面我们来学习一些基础类库。

    二、Scanner

    Scanner类可以很方便的获取用户的键盘输入,是一个基于正则表达式的文本扫描器,可以从文件、输入流、字符串中解析出字符串和基本类型值,构造器也是以文件、输入流、字符串为数据源进行构造,主要有两种方法:

    • hasNextXxx():是否还有下一个Xxx类型输入项。

    • nextXxx():获取下一个Xxx输入项。
    //键盘输入
    Scanner scanner = new Scanner(System.in);
    //回车作为分隔符
    scanner.useDelimiter("
    ");
    while (scanner.hasNext()) {
        System.out.println(scanner.next());
    }

    默认使用空白(空格、tab空白、回车)来进行项之间的分隔符。我们也可以直接按照行来进行分隔,调用下面方法:

    • hasNextLine

    • nextLine

    Scanner 还可以读取文件输入

    try {
        Scanner scannerfile=new Scanner(new File("123.txt"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    三、系统相关

    3.1 System

    System类代表当前Java程序的运行平台,System不能被创建,可以获取环境变量,系统属性,还提供了加载文件和动态链接库的方法。

    //键盘输入
    Scanner scanner = new Scanner(System.in);
    //回车作为分隔符
    scanner.useDelimiter("
    ");
    while (scanner.hasNext()) {
        System.out.println(scanner.next());
    }
    try {
        Scanner scannerfile=new Scanner(new File("123.txt"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    3.2 Runtime

     Runtime类代表Java程序的运行环境,我们可以通过此类获取JVM信息,如处理器数量,内存信息。并可以使用gc进行垃圾回收。

    Runtime runtime = Runtime.getRuntime();
    System.out.println("处理器数量:" + runtime.availableProcessors());
    System.out.println("可用最大内存数:"+runtime.maxMemory());
    System.out.println("空闲内存:"+runtime.freeMemory());
    System.out.println("总内存数:"+runtime.totalMemory());

    四、常用类

     4.1 Object

    Object 是所有类、数组、枚举类的父类,任何类型都可以赋给Object,有以下常用的一些方法:

    • boolean equals(Object obj) 判断指定对象与该对象是否相等。

    • void finalize() 垃圾回收器调用此方法来清理对象资源。

    • Class<?> getClass() 返回该对象运行时类。

    • int hashCode() 返回该对象的hash值。

    • toString() 返回该对象字符串表示。

    Object还有控制线程的几个方法,wait()、notify()、notifyAll()。

    Java 7 之后新增了Objects方法,里面提供了工具方法来操作对象,这些工具方法大多是空指针安全的,使用更安全。

    4.2 字符串类

    字符串就是一连串字符序列,Java提供了String、StringBuffer、StringBuilder 三个类进行字符串封装和处理。其中StringBuffer、StringBuilder基本相似,只是StringBuffer线程安全而StringBuilder线程不安全。

    String类是不可变类,一旦创建,就不可改变,直至被销毁。String类的不可变性,后面有机会再详解。

    String类提供了很多构造器:

     

    String也提供了大量的方法来操作字符串对象,我们学习一些常用的方法:

    String s = new String("abcdefg");
    //获取字符串中指定位置的字符
    System.out.println(s.charAt(1));
    //比较字符串的大小
    System.out.println(s.compareTo("adasd"));
    //将该字符串与str连接在一起
    s.concat("higk");
    System.out.println(s);
    //与StringBuffer对象比较,值相等则返回true
    System.out.println(s.contentEquals(new StringBuffer("abcd")));
    //将字符数组连缀成字符串
    System.out.println(String.copyValueOf(new char[]{'a', 'b'}));
    //将字符数组的子数组连缀成字符串
    System.out.println((String.copyValueOf(new char[]{'a', 'b', 'c', 'd', 'e'}, 2, 3)));
    //将字符串与指定对象比较
    System.out.println(s.equals("abcdefg"));
    //忽略大小写字符串与指定对象比较
    System.out.println(s.equalsIgnoreCase("ABcdefg"));
    //将string对象转换成Byte数组
    byte[] bytes = s.getBytes();
    for (int i = 0; i < bytes.length; i++) {
        System.out.println(bytes[i]);
    }
    char[] s1 = new char[]{'晚', '安', '!', '世', '界'};
    String s2 = new String("。!?");
    //将字符串从srcBegin开始,到srcEnd结束复制到字符串数组串中,dstBegin为字符串数组的初始位置
    s2.getChars(0, 2, s1, 2);
    for (int i = 0; i < s1.length; i++) {
        System.out.println(s1[i]);
    }
    //查询字符在字符串中第一次出现的位置
    System.out.println(s.indexOf('b'));
    //查询字符在字符串中从fromIndex后第一次出现在的位置
    System.out.println(s.indexOf('b', 2));
    //查询子字符串在字符串中第一次出现的位置
    System.out.println(s.indexOf("bc"));
    //查询子字符在字符串中从fromIndex后第一次出现在的位置
    System.out.println(s.indexOf("bc", 2));
    //查询字符在字符串中最后一次出现的位置
    System.out.println(s.lastIndexOf('b'));
    //查询字符在字符串中从fromIndex后最后一次出现在的位置
    System.out.println(s.lastIndexOf('b', 2));
    //查询子字符串在字符串中最后一次出现的位置
    System.out.println(s.lastIndexOf("bc"));
    //查询子字符在字符串中从fromIndex后最后一次出现在的位置
    System.out.println(s.lastIndexOf("bc", 2));
    //字符串长度
    System.out.println(s.length());
    //替换字符串
    s.replace('a', 'b');
    System.out.println(s);
    //对象是否以某字符串结尾
    System.out.println(s.startsWith("ab"));
    //String 对象是以某字串结尾
    System.out.println(s.endsWith("fg"));
    //获取从beginIndex位置开始到结束的子字符串
    String substring = s.substring(4);
    System.out.println(substring);
    //获取从beginIndex位置开始到endIndex结束的子字符串
    String substring1 = s.substring(4, 6);
    System.out.println(substring1);
    char[] chars = s.toCharArray();
    //转换成char数组
    for (int i = 0; i <chars.length ; i++) {
        System.out.println(chars[i]);
    }
    //将字符串转换成小写
    String lowerCase = s.toLowerCase();
    System.out.println(lowerCase);
    //将字符串转换成大写
    String upperCase = s.toUpperCase();
    System.out.println(upperCase);

    由于String的不可变性,频繁操作String时会产生大量的临时变量,这时我们可以使用StringBuilder和StringBuffer,两个类的用户基本一致,在不需要线程安全时,建议使用StringBuilder。

    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.reverse();
    System.out.println(sb);
    //长度与容量
    System.out.println(sb.length()+ sb.capacity());

    4.3 Math 类

    Java 提供了Math来进行复杂的数学运算,我们记住一些常用的就行:

    //返回小于目标数的最大整数
    System.out.println(Math.floor(-1.57));
    //返回大于目标数的最小整数
    System.out.println(Math.ceil(1.57));
    //四舍五入
    System.out.println(Math.round(2.3));
    //取绝对值
    System.out.println(Math.abs(-4.6));
    //取最大数
    System.out.println(Math.max(1,3));

    4.4 Random

    Random类专门用于生产伪随机数,有两个构造器,一个已当前系统时间作为种子,一个已外部输入数字作为种子,常用的方法有:

    Random random = new Random();
    //生成一个int范围内的随机数
    System.out.println(random.nextInt());
    //生成0-30范围的随机数
    System.out.println(random.nextInt(30));
    //生成0.0-1.0 的随机数
    System.out.println(random.nextDouble());

    五、日期、时间类

    ava提供了Date和Calendar来处理日期和时间,但Date不仅不支持国际化,而且不同属性也使用了前后矛盾的偏移量,Java 8 又提供了全新的日期时间库。

    5.1 Date

    Date 现在在用的有两个构造器:

    • Date() :生成一个代表当前日期时间的date对象

    • Date(long date):指定的long型整数来生成一个Date对象

    Date 还在使用的方法也很少:

    Date date = new Date();
    Date date1 = new Date(System.currentTimeMillis()+100);
    //测试该日期是否在指定日期之后
    System.out.println(date.after(date1));
    //比较日期大小
    System.out.println(date.compareTo(date1));

    Date类设计的并不好,对日期的操作推荐使用Calendar。

    5.2 Calendar 类

    Calendar 类是一个抽象类,是所有日历的模板,提供了静态getInstance()方法获取Calendar对象,这个方法是通过获取TimeZone和Locale 来创建Calendar。Calendar 和Date都是表示日期的类,他们可以互相转换。

    Calendar calendar = Calendar.getInstance();
    Date date2 = calendar.getTime();
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date2);

    Calendar 类提供了大量访问、修改日期时间的方法,常用方法如下:

    //给指定的字段增加或者减去时间量,如果指定量超过最大值,则进位
    calendar.add(Calendar.YEAR,1);
    //获取指定的字段值
    System.out.println(calendar.get(Calendar.YEAR));
    System.out.println(calendar.get(Calendar.MONTH));
    System.out.println(calendar.get(Calendar.DATE));
    //设置日期值
    calendar.set(2003,10,2,10,50,10);
    //给指定的字段增加或者减去时间量,如果指定量超过最大值,不进位
    calendar.roll(Calendar.YEAR,13);

    5.3 Java 8新增的时间日期包

    Java 8 提供了java.time 包来处理日期和时间,常用的类:

    • Clock:获取指定时区的当前日期、时间。

    • Duration:代表持续时间,可以方便的获取一段时间。

    • Instant:代表具体时刻,可以精确到纳秒。

    • LocalDate:该类代表不带时区的日期。

    • LocalTime:该类代表不带时区的时间。

    • LocalDateTime:该类代表不带时区的日期、时间。

    • MonthDay:该类代表月日。

    • Year:代表年。

    • YearMonth:代表年月。

    这些类的方法比较简单,需要使用时再通过API文档查找。

    六、正则表达式

    正则表达式是强大的字符串处理工具,可以对字符串进行查找、提取、分隔、替换等操作。

    Java提供了Pattern和Matcher来使用正则表达式

    //将字符串编译成Pattern对象
            Pattern pattern = Pattern.compile("a*b");
            //使用Pattern创建Matcher对象
            Matcher matcher = pattern.matcher("aaaaab");
            System.out.println(matcher.matches());
            //只能使用一次,效率不高
            Pattern.matches("a*b", "aaabbb");
            String s = "XXX:13892329111,XXX:18922121231,XXX:13824322341";
            Matcher matcher1 = Pattern.compile("1\d{10}").matcher(s);
            //返回目标字符串中是否包含匹配的字串
            while (matcher1.find()) {
                //返回上一次匹配的字串
                System.out.println(matcher1.group());
            }

    七、日期、时间格式化器

    对于日期的展示,我们一般的会格式化处理,Java提供了几个类来进行日期格式化处理。

    7.1 SimpleDateFormat

    SimpleDateFormat 既可以将日期按照固定格式转成字符串,也可以将特殊日期字符串转成日期

    //将日期转换成固定格式
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = new Date();
    System.out.println(simpleDateFormat.format(date));
    //日期字符串
    String str = "14###三月##21";
    SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("y###MMM##d");
    //将日期字符串解析成日期,主要格式要匹配的上,不然会报错
    System.out.println(simpleDateFormat.format(simpleDateFormat1.parse(str)));

    7.2  DateTimeFormatter

    DateTimeFormatter 是Java 8提供的增强版的日期格式器类,功能很强大,DateTimeFormatter中包含了大量的静态化常量,这些静态化常量本身就是DateTimeFormatter实例

    我们可以通过常量来创建格式化器,也可以使用不同风格的枚举值来创建

    DateTimeFormatter[] formatters=new DateTimeFormatter[]{
            //常量创建
            DateTimeFormatter.ISO_DATE_TIME,
            DateTimeFormatter.ISO_LOCAL_DATE,
            DateTimeFormatter.ISO_DATE,
            //枚举值创建
            DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL,FormatStyle.MEDIUM),
            //模式字符串
            DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd")
    };
    LocalDateTime localDate = LocalDateTime.now();
    
    for (int i = 0; i <formatters.length ; i++) {
        //两种方式格式化日期
        System.out.println(formatters[i].format(localDate));
        System.out.println(localDate.format(formatters[i]));
    }

    DateTimeFormatter 也可以将字符串直接转成日期,用法与SimpleDateFormat 相同。

  • 相关阅读:
    JDK 5 ~ 10 新特性倾情整理!
    软件设计师-面向对象
    软件设计师-系统开发基础
    软件设计师-网络与信息安全
    软件设计师-数据库系统
    软件设计师-操作系统
    软件设计师-计算机系统知识
    DbParameter
    软件设计师-算法
    android studio快捷键
  • 原文地址:https://www.cnblogs.com/yuanqinnan/p/10757459.html
Copyright © 2020-2023  润新知