系统相关类
Java程序在不同操作系统上运行时,有可能需要取得平台相关的属性,或者调用平台命令来完成特定的功能。Java提供了System类和Runtime类来与程序运行的平台进行交互。
System类
System类包含几个有用的类字段和方法。 它不能被实例化。
System类提供的System包括标准输入(System.in),标准输出(System.out)和错误输出流(System.err); 访问外部定义的属性和环境变量; 一种加载文件和库的方法; 以及用于快速复制阵列的一部分的实用方法。
System类的常用方法:
方 法 | 描 述 |
---|---|
currentTimeMillis() | 返回以毫秒为单位的当前时间 |
exit(int status) | 终止当前正在运行的 Java 虚拟机 |
getProperties() | 确定当前的系统属性 |
getProperty(String key) | 获得指定键指示的系统属性 |
nanoTime() | 返回最准确的可用系统计时器的当前值,以毫微秒为单位 |
gc() | 运行垃圾回收器 |
currentTimeMillis():
获得系统当前时间的函数。
System.out.println(System.currentTimeMillis());
nanoTime():
与钟表所定义的时间,没有任何关系,它的作用就只有1个,计算代码的执行时间
public static void main(String[] args) {
long startTime = System.nanoTime();
int i = 0;
while(true) {
i ++;
if(i == 1000) {
break;
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(System.currentTimeMillis());
long endTime = System.nanoTime();
System.out.println("上述代码,总共耗时:"+(endTime-startTime));
}
exit(int status):
System.exit(0);//关闭虚拟机(慎用)。
getProperties():
得到系统的环境变量。
System.out.println(System.getProperties());
gc():
提醒垃圾回收期,可以回收垃圾了。
Runtime类
每个Java应用程序都有一个Runtime类的Runtime ,允许应用程序与运行应用程序的环境进行接口。 当前运行时可以从getRuntime方法获得。
应用程序无法创建自己的此类的实例。
字符串相关类
String类
String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。
String字符串,一旦确定,那么这个字符串,无论长度,还是内容,都不能改变。
创建String对象:
- 使用String对象的构造器显式创建:
String str = new String("loveaileefe");
- 通过用字符串常量直接给String类型变量赋值隐式创建:
String str = "loveaileefe";
String类中提供了大量的方法,用于字符串对象的操作,下面提供几种常用的方法:
public class Time3 {
public static void main(String[] args) {
String str = "张三-李四-王五-赵六";
- length():获得字符串的长度
System.out.println(str.length()); //打印结果:11
- charAt(int index)按照字符在字符串中,所在的位置获取对应的字符数据,取值范围是:0到length() -1
System.out.println(str.charAt(2)); //打印结果:-
- codePointAt(int index)按照字符在字符串中,所在的位置获取对应的字符数据的Ascll码值
System.out.println(str.codePointAt(2)); //打印结果:45
- compareTo(String anotherString) 按字典顺序比较两个字符串。
System.out.println(str.compareTo("bbcd")); //打印结果:24254
- concat(String str) 主要用户字符串拼接,不是在原有的字符串后面去追加,而是创建一个新的字符串
System.out.println(str.concat("e"));//打印结果:张三-李四-王五-赵六e
- contains(CharSequence s) 判断字符串中,是否存在某一个字符串
System.out.println(str.contains("cd")); ///打印结果:false
- contentEquals(CharSequence cs) 判断两个字符串内容是否相同
System.out.println(str.contentEquals("abc")); //打印结果:false
- 拆分字符串
String [] names = str.split("-");
System.out.println(Arrays.toString(names)); //打印结果:[张三, 李四, 王五, 赵六]
- ndexOf(“李四”)得到某些字符在字符串中,所出现首次位置下标
System.out.println(str.indexOf("李四")); //打印结果:3
- 得到某些字符在字符串中,所出现最后一次位置下标
System.out.println(str.lastIndexOf("赵六")); //打印结果:9
- replace(char oldChar, char newChar) 返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。
System.out.println(str.replace("李四", "二狗蛋")); //打印结果:张三-二狗蛋-王五-赵六
- 大小写转换
System.out.println("abcD".toUpperCase()); //打印结果:ABCD
System.out.println("abcD".toLowerCase()); //打印结果:abcd
- 将字符串转换为字符数组
char[] arrs = "abcD".toCharArray();
StringBuffer类
StringBuffer对象则代表一个内容可变的字符串。当一个StringBuffer被创建以后,通过StringBuffer提供的方法可以改变该字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
使用StringBuffer创建字符串对象,不能通过直接用字符串常量给StringBuffer类型的引用赋值的方式创建,只能通过使用StringBuffer的构造器创建。
StringBuffer str = new StringBuffer("loveaileefe");
**注:**StringBuffer实际上,就是前面的超级数组类的变换。
StringBuffer类操作字符串的很多方法与String类相同,但是StringBuffer主要偏重于对字符串的变化,下面提供几种几种StringBuffer的常用方法:
StringBuffer buffer = new StringBuffer("abc第");
- 得到StringBuffer类中的字符数组的长度
System.out.println(buffer.capacity()); //打印结果:20
- 得到StringBuffer类中的字符数组中,已经存放的元素的个数
System.out.println(buffer.length()); //打印结果:4
- 向StringBuffer所定义的数组中的尾部,追加新的数据
System.out.println( buffer.append("edh")); //打印结果:abc第edh
- 转换为String
System.out.println(buffer.toString()); //打印结果:abc第
- 删除指定位置的数据(包头不包尾)
System.out.println(buffer.delete(1, 2)); //ac第
- 删除一个位的数据
buffer.deleteCharAt(3);
System.out.println(buffer.toString()); 打印结果:abc
- 在指定位置添加字符串
buffer.insert(2, "小可爱");
System.out.println(buffer.toString()); //打印结果:ab小可爱c第
- 替换指定位置的字符串(包头不包尾)
buffer.replace(1, 3, "爱你哟");
System.out.println(buffer.toString()); // 打印结果:a爱你哟第
- StringBuffer类中数组,倒序排列
buffer.reverse();
System.out.println(buffer.toString()); // 打印结果:第cba
- 使用新的字符,去替代某个下标所在的字符
char ch = '0';
buffer.setCharAt(2, ch);
System.out.println(buffer.toString()); // 打印结果:ab0第
- 截取从开始位置,到结束位置之间的字符串(包前不包后)
System.out.println(buffer.substring(1, 3)); // 打印结果: bc
StringBuilder类
StringBuilder和StringBuffer在很多方面是相同的,不同的地方是:StringBuffer方法是线程安全的,而StringBuilder则不是;而相对的StringBuilder要比StringBuffer的效率高。
日期相关类
Date类
Date类概述:类 Date 表示特定的瞬间,精确到毫秒。Date提供了很多的方法,但是很多都已经过时了(例如:getHours() ,getMinutes() …),下面提供一些没过时方法。
- 根据时间差,反向推测出当时的时间(两种方式:都行,推荐使用构造的方式,来逆向推测当时的时间)
Date date = new Date();
date.setTime(234212341234213L);
System.out.println(date);
Date date = new Date(234212341234213L);
System.out.println(date);
- 自行确定合适的时间输出格式
Date date = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
System.out.println(df.format(date)); //输出系统时间:
- Calendar类
Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方法calendar fields如YEAR , MONTH , DAY_OF_MONTH , HOUR ,等等,以及用于操纵该日历字段,如获取的日期下个星期。 时间上的瞬间可以用毫秒值表示,该值是从1970年1月1日00:00 00:00.000 GMT。
Calendar对象可以产生实现特定语言和日历风格的日期时间格式化所需的所有日历字段值。Calendar定义某些日历字段返回的值的范围及其含义。
Calendar提供了一种类方法getInstance ,用于获取此类型的一般有用的对象。 Calendar的getInstance方法返回一个Calendar对象,其日历字段已使用当前日期和时间进行初始化:
Calendar calendar= Calendar.getInstance();
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR)); //年
System.out.println(calendar.get(Calendar.MONTH)); //月(需注意这里月份是从0开始的,所以实际月份在打印的结果上加1)
System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); //一月中的第几天
System.out.println(calendar.get(Calendar.HOUR_OF_DAY)); //一天中的第几小时
System.out.println(calendar.get(Calendar.MINUTE)); //分
System.out.println(calendar.get(Calendar.SECOND)); //秒
- set(int field, int value) 将给定的日历字段设置为给定的值。
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,2000);
System.out.println(calendar.get(Calendar.YEAR)); //打印结果:2000
//-----------------------------------------------------------------------//
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH,22);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); //打印结果:22
- add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段。
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, -5000);
System.out.println(calendar.get(Calendar.YEAR)); //打印结果:2005
- roll(int field, boolean up) 在给定时间字段上添加或减少单个时间单位,而不改变较大的字段;roll(int field, int amount) 将指定(签名)金额添加到指定的日历字段,而不更改较大的字段。
DateFormat抽象类与SimpleDateFormat类
DateFormat是日期/时间格式化子类的抽象类,它以语言无关的方式格式化和分析日期或时间。
- 得到抽象类DateFormat的子类的日期处理实例
Date date = new Date();
DateFormat df = DateFormat.getDateInstance();
String str = df.format(date);
System.out.println(str);
- 得到抽象类DateFormat的子类的时间处理实例
Date date = new Date();
DateFormat df = DateFormat.getTimeInstance(DateFormat.FULL, Locale.CHINA);
String str = df.format(date);
System.out.println(str);
- 得到抽象类DateFormat的子类的日期/时间处理实例
Date date = new Date();
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL, Locale.CHINA);
String str = df.format(date);
System.out.println(str);
数学运算相关类
Math类
Math类是一个数学工具类,在Java语言中,常用的数学常数和数学方法都在该类内部,而且无论是常数还是方法都是static类型的,可以直接通过"Math.方法名()"进行调用。
下面将列举几个常用的数学方法:
- 求常量π和e:
System.out.println(Math.PI); //打印结果:3.141592653589793
System.out.println(Math.E); //打印结果:2.718281828459045
- abs: 返回一个double值的绝对值。 如果参数不为负,则返回参数。 如果参数为负,则返回参数的否定。 特殊情况:
①如果参数为正零或负零,结果为正零。
②如果论证是无限的,结果是正无穷大。
③如果参数是NaN,结果是NaN。
System.out.println(Math.abs(-1.2)); //打印结果:1.2
System.out.println(Math.abs(1.2)); //打印结果:1.2
System.out.println(Math.abs(0)); //打印结果:0
- ceil(double a) 返回大于或等于参数的最小(最接近负无穷大) double值,等于一个数学整数(即:进一取整)。
System.out.println(Math.ceil(3.45)); //打印结果:4.0
- floor(double a) 返回小于或等于参数的最大(最接近正无穷大) double值,等于一个数学整数(即:去一取证)。
System.out.println(Math.floor(3.45)); //打印结果:3.0
- rint(double a) 返回与参数最接近值的 double值,并且等于数学整数(离谁近就取谁,相等时取偶)。
System.out.println(Math.rint(3.45)); //打印结果:3.0
- round(double a) /round(float a) 四舍五入
System.out.println(Math.round(3.45)); // 打印结果:3.
- sin(double a) 返回角度的三角正弦。
System.out.println(Math.sin(0*Math.PI/180)); //打印结果:0.0
System.out.println(Math.sin(Math.PI/2)); //打印结果:1.0
- sqrt(double a) (平方根)返回的正确舍入正平方根 double值。
System.out.println(Math.sqrt(2)); //打印结果:1.4142135623730951
- max(double a, double b) 返回两个 double值中的较大值。
max(float a, float b) 返回两个 float的较大值。
max(int a, int b) 返回两个 int值中的较大值。
max(long a, long b) 返回两个 long的较大值。
System.out.println(Math.max(34, 43)); //打印结果:43
- min两数中的最大值
System.out.println(Math.max(34, 43)); //打印结果:34
随机数
在Java中,产生随机数的方法有三种:
- 通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字,我们可以把这个数字当作随机数。
- 通过Math类的静态方法random()返回一个0到1之间的double值。我们可以将这个值乘以一定的数,比如100,那么它就是一个100以内的随机数。
- 通过Random类来产生一个随机数。
在这三种方法中,Random类更为专业,功能更为强大。
一般在计算机中,在创建随机数生成器时,如果不带种子,系统会用系统时钟来作为种子。这样,每次运行产生的随机数都是不同的,没有规律可言。如果带了种子,每次运行产生的随机数都是相同的,便于重现,也便于其他人检验分析结果。
在Java的Random类中,针对不设种子和设种子,提供了两种形式的构造器,分别是Random()和Random(long seed)。Random()使用当前时间即System.currentTimeMillis()作为生成器的种子,而Random(long seed)使用指定的seed作为生成器的种子:
Random r = new Random();
Random r1 = new Random(10);
随机数生成器Random对象创建后,我们就可以通过调用该对象的不同的方法,随机生成不同类型的随机数。(下表为:Random类的主要方法。)
方法 | 作用 |
---|---|
boolean nextBoolean() | 返回下一个boolean类型随机数,生成true和false的值机率相等 |
double nextDouble() | 返回下一个double类型随机数,数值介于[0,1.0)之间。 |
int nextInt() | 返回下一个int类型随机数,该值介于int的区间,也就是-231到231-1之间。 |
int nextLong() | 返回下一个long类型随机数,该值介于long的区间 |
int nextInt(int n) | 返回下一个int类型随机数,该值介于[0,n)的区间。 |
void setSeed(long seed) | 设置Random对象中的种子数 |
**注意:这里中括号代表包含区间端点,小括号代表不包含区间端点**
包装类与自动装箱拆箱
Java中将这八种基本数据类型封装成类,称为包装类,分别对应如下:
基本数据类型 | 包装类 |
---|---|
boolean | Boolean |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
八种包装类实际上分为两种组:
- 一组是数值型的,包括Integer、Byte、Short、Long、Float、Double,这些类包装类都是Number类的子类,而Number类的父类是Object类;
- 另外一组是Character和Boolean类,这两个类的父类都是Object类。
在使用包装类时,必须注意:
- 所有的包装类都是final类型,不能创建它们的子类;
- 包装类是不可变类。一旦创建了一个包装类的对象,那么它所包含的基本类型数据就不能改变。
正则表达式
- 概述:
一种用于校验用户输入的功能较为强大的文本语言。所谓的正则表达式,是根据一组字符串中每个字符串所共有的特征,使用特定的符号来描述该组字符串的一种方法,正则表达式通常用来搜索、编辑或操纵文和数据
- 为什么需要使用“正则表达式"?
用来针对文本进行一些复杂处理,比如:获取一段匹配某些条件的文字……
- “正则表达式”的使用场所:
java, javascript、数据库中
创建正则表达式
一般来说,正则表达式由 普通字符 、 转移符号 、 标准字符集合 、 自定义字符集合 、 数量词 和选择符和分组(了解)组成。
-
普通字符:
字母,单词,数字,普通符号(, 。 ;_ 等) -
转移符号:
\t制表符 ; \n 换行 等; -
标准字符集合:
\b \B \w \W \s \S \d \D等
符号名 | 描述 |
---|---|
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b"可以匹配"never"中的"er”,但不能匹配"verb"中的"er" |
\B | 匹配非单词边界。“er\B"能匹配"verb"中的"er”,但不能匹配"never"中的"er" |
\w | 匹配包括下划线的任何单词字符。等价于"[A-Za-z0-9_ ]" |
\W | 匹配任何非单词字符。等价于"[^A-Za-z0-9_ ]" |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v ] |
\S | 匹配任何非空白字符。等价于[ ^\f\n\r\t\v ] |
\d | 匹配一个数字字符。等价于[0-9] |
\D | 匹配一个非数字字符。等价于[^0-9] |
- 自定义字符集合:
[ ] 自定义的字符集合,能够匹配方括号中的任意一个字符自定义的字符集合中,可以装普通字符、转义符号、还可以装标准字符集合、当转义符号在自定义字符集合中依旧是转义的含义,当标准字符集合在自定义字符集合中表示包含标准字符集合的内容。
但是有个例外,就是小数点。如果具有某些特殊含义的标点符号,被装入自定义的字符集合后,会被认为就是一个普通符号,没有任何其他的含义。
- 量词:
修饰正则表达式中子符号的匹配次数的符号,代表了前面的表达式出现的次数。
- *代表前面的子表达式出现的次数为0或者多次,等同于{0,};
- +代表前面的子表达式出现的次数为1或者多次,等同于{1,};
- {n}代表前面的子表达式出现的次数为n次;
- {n,m}代表前面的子表达式出现的次数为n到m次,如果m不写,那就无穷次;
- ?这个符号,一般跟随在上面的4个符号的后面,主要作用是:将贪婪模式转换为非贪婪模式(所谓贪婪模式,就是让我们子表达式尽可能的执行更多次;而非贪婪模式,就是让我们的表达式尽可能的执行最少的次数)
- 选择符和分组(了解):
- | 或的含义;
- ( )捕获组 它会从字符串中,捕获符合我们捕获符合我们条件的内容,并将内容丢入到内存中,以便下次使用, 但是这个如果过多,以及内容过大,将导致内存严重浪费,通常,我们都尽量推荐大家使用( (?: ) )。
- 其他特殊符号:
^在正则表达式中,一般有两种含义:
-
限定开头:
如果是在匹配文本输入的开始的时候,将会匹配后面紧跟的字符,用来限制开头 -
取反:
当这个字符出现在一个自定义字符集合模式的第一个字符时,表示取反,但是^出现在自定义字符集中,就表示普通的字符^。