疯狂Java讲义——第七章 基础类库

使用Scanner类可以很方便的获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文件、输入流、字符串中解析出基本类型值和字符串值。Scanner类提供了多个构造器,不同的构造器可以接受文件、输入流、字符串作为数据源,用于从文件、输入流、字符串中解析数据。

System.in:代表标准输入,就是键盘输入。

Scanner提供了两个方法来扫描输入:
hasNextXxx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果只是判断是否包含下一个字符串,则直接使用hasNext()。

nextXxx():获取下一个输入项。

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

Scanner的读取操作可能被阻塞来等待信息的输入。如果输入源没有结束,Scanner又读不到更多的输入项时(尤其键盘输入时比较常见),Scanner的hasNext()和next()方法都有可能阻塞,hasNext()方法是否阻塞与和其相关的next()方法是否阻塞无关。

Scanner提供了两个简单的方法来逐行读取。

boolean hasNextLine():返回输入行是否还有下一行。

String nextLine():返回输源中下一行的字符串。

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

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如WindowsDOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

System类的主要方法:

System.getenv():获取系统所有的环境变量

System.getProperties():获取系统的所有属性

System.getProperty():输出特定的系统属性

System类还提供了通知系统进行垃圾回收的gc()方法,以及通知系统进行资源清理的runFinalization方法。

System类还有两个获取系统当前时间的方法:currentTimeMillis()和nanoTime(),它们都返回一个long型整数。

currentTimeMillis():返回当前时间与UTL1970年1月1日午夜的时间差,以毫秒计算。

currentTimeMillis():返回当前时间与UTL1970年1月1日午夜的时间差,以纳秒计算。

System类的in、out、和err分别代表系统的标准输入(通常是键盘)、标准输入(通常是显示器)和错误输入流,并提供了setIn()、setOut和setErr()方法来改变系统的标准输入、标准输入和标准错误输入流。

System类还提供了一个identityHashCode(Object x)方法,该方法返回指定对象的精确hashCode()值,也就是根据该对象的地址计算得到的hashCode值。当某个类的hashCode()方法被重写后,该类实例的hashCode()方法就不能唯一标识该对象;但通过identityHashCode()方法返回的hashCode值,依然是根据该对象的地址计算的得到的hashCode值。所以,如果两个对象的identityHashCode值相同,则两个对象绝对是同一对象。

String类重写了hashCode()方法——改为根据字符串序列计算hashCode值,因为s1和s2的字符串序列相同,所以他们的hashCode()方法返回值相同。

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

Runtime类里访问JVM相关信息的方法:

availableProfessors():处理器数量

freeMemory():空闲内存数

totalMemory():总内存数

maxMemotry():可用最大内存数

Runtime类可以直接单独启动一个进程来运行操作系统的命令。

exec("需要运行的程序"):启动进程来运行操作系统的命令。

Object类:

当定义一个类时没有使用extends关键字为他显式指定父类,则该类默认继承Object父类。

Object类的常用方法:

boolean equals(Object obj):判断指定对象与该对象是否相等。此处的相等标准是,两个对象是同一个对象。所以一般都会重写Object类的equals()方法

protected void finalize():当系统中没有引用变量引用到该对象时,垃圾回收期调用此方法来清理该对象

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

int hashCode():返回该对象的hashCode值。在默认情况下,Object类的hashCode()方法根据该对象的地址来计算。但很多类都重写了Object类的hashCode()方法,不再根据地址来计算其hashCode()方法值

String toString():返回该对象的字符串表示,当程序使用System.out.println()方法输出一个对象,或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的toString()方法返回该对象的字符串表示,但是很多类都重写了Object类的toString()方法,用于返回可以表述该对象信息的字符串。

Java还提供一个protected修饰的clone()方法,该方法用于帮助其他对象来实现自我克隆,所谓自我克隆就是得到一个当前对象的副本,而且两者之间完全隔离

自定义实现克隆的步骤:

1、自定义类实现Cloneable接口。这是一个标记性接口,实现该接口的对象可以实现“自我克隆”,接口里没有定义任何方法。

2、自定义类实现自己的clone()方法。

3、实现克隆方法时通过super.clone();调用Object实现的clone()方法来得到该对象的副本,并返回该副本。

Object类的克隆方法是一种潜克隆,它只克隆该对象所有成员值,不会对引用类型的变量所引用的对象进行克隆。如果开发者需要对对象进行深克隆,则需要开发自己的递归克隆,保证所有引用类型的变量值所引用的对象都被复制了

Java7新增的Objects类

它提供了一些工具方法来操作对象,这些工具方法大多时“空指针”安全的。比如你不确定一个引用变量是否为null,如果贸然的调用该变量的toString方法,则可能引发空指针异常;但如果使用Objects类的toString(Object o)方法,就不会引发空指针异常,当o为null时,程序将返回一个null字符

Java为工具类的命名习惯时添加一个字母s,比如操作数组的工具类时Arrays,操作集合的工具类是Collections。

Objects提供的requireNonNull()方法,当传入的参数不为null时,该方法返回参数本身,否则将会引发空指针异常。该方法主要对方法形参进行输入校验

String类是不可变类,即一旦一个String对象被创建之后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

StringBuffer对象则代表一个字符串序列可变的的字符串,当一个StringBuffer被创建之后,通过StringBuffer提供的方法可以改变这个字符串对象的序列。一旦StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。

StringBuffer跟StringBuilder基本相似,不同的是StringBuffer是线程安全的,StringBuilder没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用StringBuilder类。

String、StringBuffer、StringBuild都实现了CharSequence接口,因此CharSequence可认为是一个字符串协议的接口。

char charAt(int index):获取字符串中指定位置的字符。字符串是从0开始。

int compareTo(String anotherString):比较两个字符串的大小,如果两个字符串的字符序列相等,则返回0,不相等时,从两个字符串第0个字符开始比较,返回第一个不相等的字符差。另一种情况,较长字符串的前面部分恰好时较短的字符串,则返回他们的长度差。

String concat(String str):将String对象与str连接在一起。与Java提供的字符串连接运算符“+”的功能相同。

boolean contentEquals(StringBuffer sb):将String对象与StringBuffer对象进行比较,当它们包含的字符串序列相同时返回true

boolean endsWith(String suffix):返回该String对象是否以suffix结尾。

void gerChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):该方法将字符串中从srcBegin开始,srcEnd结束的字符复制到dst字符数组中,其中dstBegin为目标字符数组的起始复制位置。复制之后原先的字符数组的数据被替换

int indexOf(String str,int fromIndex):找出str字符串在该字符串中从fromIndex开始后的第一次出现的位置。

boolean startsWith(String prefix,int toffset):该String对象从toffset位置算起,是否以prefix开始

boolean startsWith(String prefix):对象是否以prefix开始。

String toLowerCase():将字符串转换成小写。

String toUpperCase():将字符串转换成大写。

StringBuilder、StringBuffer有两个属性:length和capatity,其中length属性表示其包含的字符序列的长度,与String对象的length不同,StringBuffer和StringBuilder的length是可以改变的,可以通过length()、setLength(int len)方法来访问和修改其字符序列的长度。capacity属性表示容量,capacity通常比length大。

append(String str):追加字符串str。

insert(int i,string s):在字符串的i位置插入字符串s。

replace(int i,int i2,String str):把字符串从i开始到i2结束中的字符串替换为str。

delete(int i ,int i2):将字符串第i个字符开始,i2结束中间的字符串删除

reverse():将字符串反转。

Math类是一个工具类,它的构造器被定义成private的,因此无法创建Math类的对象,Math类中的所有方法都是类方法,可以直接通过类名来调用它们。Math类除了大量静态方法之外,还提供了两个变量:PI和E,正如它们名字所暗示的,它们的值分别等于π和e。

Random类专门用于生成伪随机数,它有两个构造器:一个构造器使用默认种子(以当前时间作为种子),另一个构造器需要程序员显性传入一个long型的种子。

TreadLocalRandom类时Random类的增强版。在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有更好的线程安全。

Random使用一个48位的种子,如果这个类的两个实例是用同一个种子创建的,对他们以同样的顺序调用方法,则它们会产生相同的数字序列。也就是说,Random产生的数字并不是真正随机的,而是一种伪随机。为了避免两个Random对象产生相同的数字序列,通常推荐使用当前时间作为Random对象的种子

为了精确计算、计算浮点数,Java提供了BigDecimal类,该类提供了大量的构造器用于创建BigDecimal对象,包括把所有的基本数值型变量转换成一个BigDecimal对象,也包括利用数字字符串、数字字符数组来创建BigDecimal对象。

BigDecimal(double val)该构造器有一定的不可预知性,BigDecimal(String val)构造器的结果是预知的,通常更建议优先使用基于String的构造器

如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该double浮点数作为构造器的参数创建BigDecimal对象,而是应该通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。

subtract:减去、multiply:乘法、divide:除法

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

Calendar类是一个抽象类,他是所有日历类的模版,并提供了一些所有日历通用的方法,但它本身不能实例化,程序只能创建Calendar子类的实例,Java本身提供一个GregorianCalendar类,它代表通常所说的公历。

Calendar与Data都是表示日期的工具类,它们可以直接自由转换。

Calendar.MONTH字段代表月份,月份的起始值不是1,而是0,所以要设置8月时,用7而不是8。

上面程序使用了静态导入,它导入了Calendar类里的所有类变量,所以上面程序可以直接使用Calendar类的YEAR、MONTH、DATE等变量。

add(int field,int amount)主要用于改变Calender的特定字段的值,如果需要增加某个字段的值,则让amount为正数;如果需要减少某字段的值,则让amount为负数即可。当被修改的字段超出它允许的范围时,会发生进位,即上一级字段也会增大。如果下一级字段也需要改变,那么该字段会修正到变化最小值。

roll()的规则与add()的的处理规则不同:当被修改的字段超出它允许的范围,上一级字段不会增大,下一级字段的处理与add()相似。

setLenient用于设置Calendar容错性,Calendar默认支持较好的容错性,通过setLenient可以关闭Calendar的容错性,让它进行更严格的检查。

set(f,value)方法将日历字段f更改为value,此外他还设置了一个内部成员变量,以指示日历字段f已经被修改。尽管日历字段f时立即更改的,但Calendar所代表的时间却不会立即修改,直到下次调用get()、getTime()、getTimeInMillis()、add()、或roll()时才会重新计算日历的时间。这被称为set()方法的延迟修改。

String类里提供了几个特殊方法:
boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。

String replaceAll(String regex , String replacement):将该字符串中所有匹配regex的字串替换成replacement。

String[] split(String regex):以regex作为分隔符,把该字符串分割成多个字串

Pattern对象时正则表达式编译后在内存中的表现形式,因此,正则表达式字符串必须先被编译为Pattern对象,然后在利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可以共享同一个Pattern对象。

Pattern类是不可变类,可供多个并发线程安全使用。

通过Matcher类的find()和group()方法可以从目标字符串中一次取出特定字串(匹配正则表达式的字串)。find方法依次查找字符串中与Pattern匹配的子串,一旦找到对应的子串,下次调用find方法时将接着向下找。

start()和end()方法主要用于确定子串在目标字符串中的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值