Javaday20(正则表达式、字符缓冲、数学api、随机api、Java日期api、jdk8新增日期类型、Java国际化支持)
一、正则表达式
- 在编写程序的时候,往往对某些字符串的规则有特定的逻辑要求;
- 例如,邮件地址,手机号码,身份证号码,都可能使用字符串表示,而这些字符串都有着自己的逻辑要求;
- 正则表达式(regular expression)就是用来描述字符串逻辑规则的工具;
- 正则表达式本身也是个字符串,不过这些字符串是使用系列“元字符”组成;
- 所谓“元字符”就是预先定义的,有特殊意义的字符;例如\d用来匹配一个数字; \w用来匹配字母或数字或下划线或汉字等;
- 很多语言多对正则表达式提供了支持,例如JavaScript、Java等;
不同语言中使用正则表达式时,正则表达式的具体编写规则会有些小的差别,但是大体相同;
二、字符缓冲
- Java语言中的有一个StringBuffer类,称为字符串缓冲区;所表示的也是一个字符序列;
- 这个类型必须用new创建对象,和String相反,它是可变的类;
- StringBuffer sbf1=new StringBuffer ("Etc");
- StringBuffer sbf2=new StringBuffer (" Java");
- sbf1.append(sbf2);
- System.out.println(sbf1);
- 输出结果为:Etc Java
- 证明:StringBuffer是一个可变的字符串类
- Java语言中的还有一个StringBuilder类,与StringBuffer兼容,但是不保证线程同步;
- 多线程编程在后续章节学习,此处只记住这个特征即可;
- 三个类的区别
- String类是不可变的,对象一旦被创建,就不能被修改;可以使用=直接赋值,此时使用常量池;也可以使用new创建,不使用常量池;
- StringBuffer是可变的,对象创建后,可以修改;必须使用new关键字;
- StringBuilder是不同步的,在单线程情况下使用比StringBuffer高效;必须使用new关键字;
三、数学api
- Math类位于java.lang包中,是一个final类,不能被继承;
- Math类中所有方法都是static方法,可以直接使用类名Math调用;
- Math中定义了大量与数学运算有关的方法,包括求绝对值、三角函数、平方根等;
- 部分方法如下:
- Java中整数最大范围是long型,64位,如果需要使用超过long范围的大整数,可以使用BigInteger类;
- BigInteger位于java.math包中,定义了一系列的数学运算方法,调用这些方法可以进行计算,不能使用运算符计算;
- java.math包中还有一个类叫BigDecimal,虽然和整数无关,我们也在此一起学习;
- BigDecimal是用来针对浮点型进行精确运算的;
四、随机api
- Math类中的random方法可以产生随机数,上节演示过。然而,该方法只能生成[0.0,1.0)范围的double值;很多时候,可能需要生成不同类型不同范围的随机值;
- java.util包中的Random类可以用来生成不同类型的随机值,功能更为强大;
- Random类创建对象两种方式:
- UUID是通用唯一识别码 (Universally Unique Identifier)的缩写,是唯一的机器生成的标识符;
- UUID都不能是人工生成的,这样风险太高;
- UUID是16字节128位长的数字,通常以36字节的字符串表示,示例如下:3F2504E0-4F89-11D3-9A0C-0305E82C3301
- 通常在分布式系统中用来生成唯一ID
- UUID具有多个版本,每个版本的算法不同;
- UUID Version 1:基于时间的UUID
- 通过计算当前时间戳、随机数和机器MAC地址得到。
- UUID Version 2:DCE安全的UUID
- 和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。
- UUID Version 3:基于名字的UUID(MD5)
- 通过计算名字和名字空间的MD5散列值得到。
- UUID Version 4:随机UUID
- 根据随机数,或者伪随机数生成UUID。
- UUID Version 5:基于名字的UUID(SHA1)
- 和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。
六、Java日期对象api
- java.util.Date类表示时间,不过由于对国际化支持有限,所以JDK1.1之后推荐使用java.util.Calendar类;
- java.util.Date类中很多构造方法和方法已经过时(Deprecated),不推荐使用,此处只学习两个没过时的构造方法;
- JDK1.1版本开始,增加Calendar类,建议使用Calendar类代替Date类;
- Calendar是抽象类,不能直接使用new创建对象;
- Calendar类中定义了获得实例的方法:
//使用默认时区和语言环境获得日历对象
Calendar calendar1=Calendar.getInstance();
//使用指定时区和语言环境获得日历对象
Calendar calendar2=Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles"),Locale.CHINA);
- 在实际编程中,往往一些时间内容都是通过用户输入获得,得到的是字符串,需要解析成日期时间类型进行处理;
- SimpleDateFormat类不仅能够格式化时间,还能解析时间字符串;
七、jdk8新增日期类型
八、Java国际化支持
- 所谓国际化(internationalization,简称i18n)指的是一个应用程序能够支持多种语言,根据客户的语言环境返回不同语言的界面;
- 要实现国际化,简单地说,就是要为应用程序准备几套不同语言版本的资源文件,这些资源文件按照命名规范放置在不同的目录下,应用程序能够根据客户的语言环境自动匹配使用不同版本的资源文件;
- “国际化信息”也被称为“本地化信息”,要确定一个特点类型的“本地化信息”,起码需要确定 “语言类型”和“国家/地区的类型”;
- Java.util.Locale是表示语言和国家/地区信息的本地化类,是Java创建国际化应用的基础。
- 如果应用系统中某些信息需要支持国际化功能,则必须为希望支持的不同本地化类型分别提供对应的资源文件,并以规范的方式进行命名;
- 国际化资源文件的命名规范规定资源名称采用以下的方式进行命名:
<资源名>_<语言代码>_<国家/地区代码>.properties
- 其中,语言代码和国家/地区代码都是可选的;
- <资源名>.properties命名的国际化资源文件是默认的资源文件,即某个本地化类型在系统中找不到对应的资源文件,就采用这个默认的资源文件;
- properties资源文件对内容有严格要求,只能是ASCII码。例如,当我们编写中文内容时,就要想办法把中文进行转换;
- 对属性文件(即*.properties文件)的处理,Java API中有两个类可以实现,即Properties类及ResourceBundle类;
- 如果不考虑国际化,只读取属性内容,一般使用Properties类即可;
- 考虑到国际化,往往使用ResourceBundle