《疯狂JAVA讲义》第6章 Java基础类库学习笔记

1.Scanner类

Scanner类主要提供了两个方法:

  • hasNextXxx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果只是判断是否包含下一个字符串,则直接使用hasNext()
  • nextXxx():获取下一个输入项

默认情况下,Scanner使用空白(包括空格、Tab空白、回车)作为多个输入项之间的分隔符。下面代码将只把回车作为分隔符:

Scanner sc = new Scanner(System.in);
sc.useDelimiter("\n");

Scanner还提供了两个方法来逐行读取。

  • boolean hasNextLine():返回输入源中是否还有下一行
  • String nextLine():返回输入源中下一行的字符串

另外,Scanner还可以读取文件输入,例如:

Scanner sc = new Scanner(new File("ScannerFileTest.java");

2.System类

System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类变量和类方法,允许直接通过System类来调用这些类变量和类方法

System类提供了代表标准输入、标准输出和错误输出的类变量,并提供了一些静态方法用于访问环境变量、系统属性的方法,还提供了加载文件和动态链接库的方法。下面程序通过System类来访问操作系统的环境变量和系统属性

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

System类还有两个获取系统当前时间的方法:currentTimeMillis()和nanoTime(),前者以毫秒作为单位,后者以纳秒作为单位。但这两个方法返回的时间粒度取决于底层操作系统。如果操作系统不支持,就不可能返回精确的毫秒数

除此之外,System类的in,out,err分别代表系统的标准输入,标准输出和错误输出流。并提供setIn(),setOut(),setErr()来改变系统的标准输入,标准输出和错误输出流。还提供了通知系统进行垃圾回收的gc()方法,以及通知系统进行资源清理的runFinalization()方法

3.Object类

  • protected void finalize:当系统中没有引用变量引用该对象时,垃圾回收器调用此方法来清理该对象的资源
  • Class<?> getClass():返回该对象的运行时类

自定义类实现克隆:

  1. 自定义类实现Cloneable接口。这是一个标记性的接口,实现该接口的对象可以实现“自我克隆”,接口里没有定义任何方法
  2. 自定义类实现自己的clone()方法
  3. 实现clone()方法时通过super.clone();调用Object实现的clone()方法来得到该对象的副本,并返回该副本。其中如果实例变量的类型时引用类型,Object的Clone机制也只是简单地复制这个引用变量

Object类提供的“自我克隆”机制十分高效。比如clone一个包含100个元素的int[]数组比静态copy方法快斤2倍

4.Objects类

Objects类是一个工具类,例如如果贸然调用toString()方法,则可能引发NullPointerExcetpion异常;但如果使用Objects类提供的toString(Object o)方法,就不会引发空指针异常。它还提供了一个requireNonNull()方法,当传入的参数为null时将会引发NullPointerException异常,该方法主要用来对方法形参进行输入校验

public Foo(Bar bar)
{
    this.bar = Objects.requireNonNull(bar);
}

5.String、StringBuffer和StringBuilder类

String类是不可变类,一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的

StringBuffer对象则代表一个字符序列可变的字符串,它提供append()、insert()、reverse()、setCharAt()、setLengtn()方法。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象

StringBuilder类和StringBuffer基本相似,而StringBuffer是线程安全的,性能略高。因此通常情况下应该优先考虑使用StringBuilder类

String类提供的构造器的特殊用途:
  • String():创建一个包含0个字符串序列的String对象
  • String(byte[] bytes,Charset charset):使用指定的字符集将指定的byte[]数组解码成一个新的String对象
  • String(char[] value, int offset, int count):将指定的字符数组从offset开始、长度为count的字符元素连缀成字符串
  • String(String original):根据字符串直接量来创建一个String对象。也就是说,新创建的String对象是该参数字符串的副本
  • String(StringBuffer buffer):根据StringBuffer对象来创建对应的String对象
  • String(StringBuilder builder):根据StringBuilder对象来创建对应的String对象

String还提供了大量方法来操作字符串:

  • char charAt(int index):获取字符串中指定位置的字符
  • int compareTo(String anotherString):比较两个字符串的大小。如果两个字符串的字符序列想到,则返回0;不相等时,从两个字符串的第0个字符开始比较,返回第一个不相等的字符差。另一种情况,较长的字符串前面部分恰巧时较短的字符串,则返回它们的长度差
  • String concat(String str):相当于“+”
  • boolean contentEquals(StringBuffer sb):包含的字符序列相同时返回true
  • static String copyValueOf(char[] data):将字符数组连缀成字符串,与String(char[] content)构造器的功能相同
  • static String copyValueOf(char[] data, int offset, int count):与构造器String(char[] value, int offset, int count)功能相同
  • boolean endsWith(String suffix):返回该String对象是否以suffix结尾
  • boolean equals(Object anObject):将该字符串与指定对象比较,如果二者包含的字符序列相等,则返回true
  • boolean equalsIgnoreCase(String str):同上,忽略大小写
  • byte[] getBytes():将该String对象转换成byte数组
  • void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):将字符串从srcBegin开始,到srcEnd结束的字符复制到dst字符数组中,其中dstBegin为目标字符数组的起始位置
  • int indexOf(int ch):找出ch字符在该字符串中第一次出现的位置
  • int indexOf(int ch,int fromIndex):找出ch字符在该字符串中从fromIndex开始后第一次出现的位置
  • int indexOf(String str):找出str子字符串在该字符串中第一次出现的位置
  • int indexOf(String str,int fromIndex):找出str子字符串在该字符串中从fromIndex开始后第一次出现的位置
  • int lastIndexOf(int ch):找出ch字符在该字符串最后一次出现的位置
  • String replace(char oldChar,char newChar):将字符串中第一个oldChar替换成newChar
  • boolean startsWith(String prefix):是否以prefix开始
  • String substring(int beginIndex):获取从beginIndex位置开始到结束的子字符串
  • char[] toCharArray():转换成char数组
  • String toLowerCase():将字符串转换成小写
  • String toUpperCase():将字符串转换成大写
  • static String valueOf(X x):一系列将基本类型值转换为String对象的方法

6.ThreadLocalRandom与Random

专门用于生成伪随机数,不是真正随机的。推荐使用当前时间作为Random对象的种子:

Random rand = new Random(System.currentTimeMillis());
ThreadLocalRandom rand = ThreadLocalRandom.current();
int val1 = rand.nextInt(4,20);

7.BigDecimal类

该类是为了防止浮点数精度丢失。推荐使用new BigDecimal(String val)构造器,或者通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象

如果觉得将double数值包装成BigDecimal对象烦琐,可以考虑以BigDecimal为基础定义一个工具类

8.Java 8 的日期、时间类

1.date类

  • Date():生成一个代表当前日期时间的Date对象。该构造器在底层调用System.currentTimeMillis()获得long整数作为日期参数
  • Date(long date):根据指定的long整数来生成一个Date对象。表示创建的Date对象和GMT 1970年1月1日00:00:00之间的时间差,以毫秒作为计时单位
  • boolean after(Date when):测试该日期是否在指定日期when之后
  • boolean before(Date when):测试该日期是否在指定日期when之前

9.Calender类

是一个抽象类,用来表示日历,是所有日历类的模版,本身不能直接实例化,程序只能创建Calendar子类的实例。但它提供了几个静态的getInstance()方法来获取Calendar对象,这些方法根据TimeZone,Locale类来获取特定的Calendar,如果不指定TimeZone、Locale,则使用默认的TimeZone、Locale来创建Calendar

  • void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量
  • int get(int field):返回指定日历字段的值
  • int getactualMaximum(int field):返回指定日历字段可能拥有的最大值。例如月,最大值为11
  • int getactualMinimum(int field):返回指定日历字段可能拥有的最小值。例如月,最小值为0
  • void roll(int field, int amount):与add()方法类似,区别在于加上amount后超过了该字段所能表示的最大范围时也不会像上一个字段进位
  • void set(int field, int value):将给定的日历字段设置为给定值
  • void set(int year, int month, int date):设置Calendar对象的年月日三个字段的值
add与roll的区别

add(int field, int amount)主要用于改变Calendar的特定字段的值。如果需要增加某字段的值,则让amount为正数;如果需要减少某字段的值,则让amount为负数即可。它有如下两条规则:

当被修改的字段超出它允许的范围时会发生进位

如果下一级字段也需要改变,那么该字段会修正到变化最小的值。例如:

Calendar cal = Calendar.getInstance();
cal.set(2003,7,31,0,0,0);//2003-8-31
//因为进位后月份改为2月,2月没有31日,自动变成29日
cal.add(MONTH,6);//2003-8-31 => 2004-2-29

roll处理的字段不会进位,但下一级字段的处理规则与add相似

Calendar的容错性
Calendar ca1 = Calendar.getInstance();
//结果是YEAR字段加1,MONTH字段为1(2月)
ca1.set(MONTH,13);
//关闭容错性
ca1.setLenient(false);
//导致运行时异常
ca1.set(MONTH,13);
set()方法延迟修改

set(f, value)方法将日历字段f更改为value。尽管f是立即更改的但该Calendar所代表的时间却不会立即更改,它只是使用内部成员变量表记录f字段的修改,只有下次调用get()、getTiem()、getTimeInMillis()、add()或roll()时才会重新计算日历时间

Calendar cal = Calendar.getInstance();
cal.set(2003,7,31);//2003-8-31
//将月份设为9,但9月31日不存在
//如果立即修改,系统将会把cal自动调整到10月1日
cal.set(MONTH,8);
//下面代码输出10月1日
//System.out.println(cal.getTime());
//设置DATE字段为5
cal.set(DATE,5);
System.out.println(cal.getTime());//输出2003-9-5

10.Java 8 新增的日期、时间包

  1. Clock:用于获取指定时区的当前日期、时间。可取代System类的currentTimeMillis()方法
  2. Duration:代表持续时间,可方便获取一段时间
  3. Instant:代表一个具体时刻,可精确到纳秒:
  • 静态的now()方法来获取当前时刻
  • 静态的now(Clock clock)方法来获取clock对应的时刻
  • 一系列minusXxx()、plusXxx()方法在当前时刻基础上减去、加上一段时间

11.Java 8 新增的日期、时间格式器

DateTimeFormatter相当于DateFormat和SimpleDateFormat的合体,不仅可以将日期、时间对象格式化成字符串,也可以将指定格式的字符串解析成日期、时间对象。在解析之前,必须先获取DateTimeFormatter对象

使用DateTimeFormatter解析字符串
public class NewFormatterParse
{
    public static void main(String[] args)
    {
        //定义一个人一格式的日期、时间字符串
        String str1 = "2014==04==12 01时06分09秒";
        //根据需要解析的日期、时间字符串定义解析所用的格式器
        DataTimeFormatter fomatter1 = DateTimeFormatter.ofPattern("yyyy==NN==dd HH时mm分ss秒");
        //执行解析
        LocalDateTime dt1 = LocalDateTime.parse(str1,fomatter1);
        System.out.println(dt1);//输出2014-04-12T01:06:09
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值