作者:gqk;
本节目标:
1、 掌握 StringBuffer 的使用
2、 掌握正则表达式、大数操作、日期格式化、Random 类的使用
3、 理解 System、Runtime、Process、Math、Calendar 类的使用
StringBuffer(重点):
在程序中可以使用 String表示一个字符串的操作,但是 String本身有如下特点:
两 种 声明的方式,而且比较的时候靠equals()比较内容 ·
一个字符串的内容声明之后则不可改变 实际上 String最要命的一个问题就是内容无法改变,但是这种功能在实际的开发中又不可能避免掉,此时就可以依靠 StringBuffer 类来完成这种功能。当字符串的内容需要被改变的时候就使用 StringBuffer。
StringBuffer 是 java.lang提供的一个开发包,类的定义如下:
如果现在需要将一个 StringBuffer 的类型变成 String的话,则必须依靠 toString()方法完成
根据 StringBuffer 的特点实际上就可以发现,对于需要经常改变内容的字符串肯定要使用 StringBuffer,而相反,如果 某些内容不需要随时改变的话,那么使用 String就够了。
1、 字符串反转 · 方法:public StringBuffer reverse()
2、 字符串替换 · 在 String类中依靠replaceAll()方法完成替换 · 方法:public StringBuffer replace(int start,int end,String str)
Runtime(理解)
Runtime 表示的是运行时的状态对象,即:每当有一个 JVM 进程产生的时候都会自动生成一个 Runtime 类的对象。 但是在此类的定义中发现并没有构造方法的声明,很明显构造方法被私有化了,那么一旦构造方法被私有化,则内部一定 会存在一个方法,可以取得本类的实例化对象:public static Runtime getRuntime()。
取得系统信息
在 Runtime 类中定义了如下的三个方法,这些方法可以取得系统的内存使用情况:
总 共可以使用的内存:public long totalMemory()
取得最大可用的内存:public long maxMemory()
取得当前空余的内存:public long freeMemory()
package com.xkrj.gqk;
public class HelloWorld {
public static void main(String[] args) {
Runtime run = Runtime.getRuntime();
run.gc();
System.out.println("最大的内存空间:"+run.maxMemory());
System.out.println("总共可以使用的空间:"+run.totalMemory());
System.out.println("当前的空余空间:"+run.freeMemory());
String str = "";
for (int i = 0; i < 10000; i++) {//产生垃圾
str+=i;
}
System.out.println("===========产生垃圾后==========");
System.out.println("最大的内存空间:"+run.maxMemory());
System.out.println("总共可以使用的空间:"+run.totalMemory());
System.out.println("当前的空余空间:"+run.freeMemory());
}
}
由于本程序中产生大量的垃圾,所以当操作完成之后,freeMemory()的空间明显减少。
在 Java 中对于垃圾收集实际上存在两种形式: ·
手工回收:public void gc() ·
自动回收:由系统完成
System 类(理解)
System.out.println()代码一直在使用着,根据之前学习到的知识,可以发现,System 肯定是一个类,而 out 是一个静 态属性,而 println()是 out 对象所提供的一个方法。
package com.xkrj.gqk;
public class HelloWorld {
public static void main(String[] args) {
long beginTime = System.currentTimeMillis();
String str = "";
for (int i = 0; i < 10000; i++) {//产生垃圾
str+=i;
}
long endTime = System.currentTimeMillis();
System.out.println("===========产生垃圾后==========");
System.out.println("花费的时间为:"+(endTime-beginTime));
}
}
垃圾回收与对象生命周期(重点)
在 System 类中定义了如下的方法:public static void gc()。
当调用此方法的时候实际上就等同于调用了 Runtime 类中提供的 gc()方法,两个是一样的。
package com.xkrj.gqk;
public class HelloWorld {
public static void main(String[] args) {
Person p = new Person();
p = null;
System.gc();
}
}
class Person{
public Person(){
System.out.println("我出生了......");
}
@Override
protected void finalize() throws Throwable {
System.out.println("我完了,我被回收了......");
}
}
一般一个对象都要经历以下的生命周期:
加载 初始化 使用 回收 卸载
Math 类
Math 类本身表示的是数学的操作类,里面提供了各种各样的数学操作方法
方法:public static long round(double a),四舍五入
这个四舍五入是将小数点之后的内容全部进行了省略,那么如果要想进行准确的四舍五入的话,最早的做法是通过 BigDecimal 类完成的,这个类也称为大数操作类
大数操作类
现在如果假设有两个数字非常的大,那么如果进行相乘的话,则肯定数字的会更大,此时,传统的数据类型已经无 法装下了(Infinity 无穷大)
package com.xkrj.gqk;
public class HelloWorld {
public static void main(String[] args) {
double d1 = Double.MAX_VALUE;
double d2 = Double.MAX_VALUE;
System.out.println(d1 * d2);
}
}
所以在Java 中为了解决这种大数的操作,提供了两个类:BigInteger、BigDecimal
大整数操作类:BigInteger
package com.xkrj.gqk;
import java.math.BigInteger;
public class HelloWorld {
public static void main(String[] args) {
BigInteger bi1 = new BigInteger(Long.MAX_VALUE+"");
BigInteger bi2 = new BigInteger(Long.MAX_VALUE+"");
System.out.println("加法:"+bi1.add(bi2));
System.out.println("减法:" + bi1.subtract(bi2));
System.out.println("乘法:" + bi1.multiply(bi2));
System.out.println("除法:" + bi1.multiply(new BigInteger("333")));
BigInteger res[] = bi1.divideAndRemainder(new BigInteger("333")) ;
System.out.println("整数部分:" + res[0]) ;
System.out.println("小数部分:" + res[1]) ;
}
}
随机数
在 java.util.Random 类中主要的功能是用于产生随机数的。
产生 10 个数字,都不大于 100
package com.xkrj.gqk;
import java.util.Random;
public class HelloWorld {
public static void main(String[] args) {
Random r = new Random();
for (int i = 0; i < 10; i++) {
System.out.println(r.nextInt(10));
}
}
}
日期操作(重点)
Date 类
java.util.Date 类是一个专门取得日期的操作类,本身的使用非常的简单,直接实例化对象输出即可。
获得系统当前的时间
package com.xkrj.gqk;
import java.util.Date;
public class HelloWorld {
public static void main(String[] args) {
System.out.println(new Date());
}
}
确实是取得了一个日期,但是这个日期的格式并不符合于中国的习惯。
Calendar 类
Calendar 类是采用手工的方式取得日期,可以通过此类精确到毫秒,此类的定义如下:
public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable
这个类本身是一个抽象类,抽象类要想实例化肯定使用子类:GregorianCalendar
package com.xkrj.gqk;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class HelloWorld {
public static void main(String[] args) {
Calendar calender = new GregorianCalendar();
System.out.println("年:"+calender.get(Calendar.YEAR));
System.out.println("月:"+(calender.get(Calendar.MONTH)+1));
System.out.println("日:"+calender.get(Calendar.DATE));
System.out.println("时:"+calender.get(Calendar.HOUR_OF_DAY));
System.out.println("分:"+calender.get(Calendar.MINUTE));
System.out.println("秒:"+calender.get(Calendar.SECOND));
System.out.println("毫秒:"+calender.get(Calendar.MILLISECOND));
}
}
作业: //封装获取 xxxx年xx月xx日 xx时xx分xx秒的方法;
SimpleDateFormat 类(绝对重点)可以对时间进行格式化,也可以和Date和字符串之间转换
Date 本身提供的数据已经属于一个完整的日期时间了,但是其显示的效果并不完整,所以如果现在需要将显示的日 期进行格式化的话,就可以通过 java.text.SimpleDateFormat 类完成功能。 但是如果要进行格式化的话,有一点必须注意的是,需要指定一个格式化日期的模板: ·
年 ( yyyy)、 月 ( MM)、日(dd)、 时 ( HH)、 分 ( mm)、 秒 ( ss)、 毫秒(SSS)
package com.xkrj.gqk;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloWorld {
public static void main(String[] args) throws ParseException {
String str = "2018-08-08";
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sf.parse(str);
System.out.println(date);
System.out.println(sf.format(date));
}
}
Arrays 类(操作数组的类)
package com.xkrj.gqk;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class HelloWorld {
public static void main(String[] args) throws ParseException {
int temp[] = { 50, 45, 8, 9, 1, 23, 4, 5, 23, 21, 324 };
Arrays.sort(temp); //数组的排序
System.out.println(Arrays.toString(temp));
Arrays.fill(temp, 2); //将指定的int型数据分配给temp的每个元素
System.out.println(Arrays.toString(temp));
}
}
但是在这个类的sort()方法中有一个以下的排序操作:public static void sort(Object[] a)
对数组对象进行排序
package com.xkrj.gqk;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class Person {
private String name;
private int age;
public static void main(String[] args) throws ParseException {
Person per[] = { new Person("张三", 20), new Person("李四", 19), new Person("王五", 23) };
Arrays.sort(per);
for (int i = 0; i < per.length; i++) {
System.out.println(per[i]);
}
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
报错:
此时提示的是一个类转换异常:Person 类的对象不能向 Comparable 转换。
比较器(绝对重点)
Comparable(重点)
Comparable 接口中只存在了一个 compareTo()的方法,此方法的主要功能是编写比较规则的,此方法返回一个 int 型 的数据,此值会返回三种结果:
· 0:两个对象相等
· 1:大于
· -1:小于
如果要使用 Arrays.sort()进行排序的话,则肯定要在对象所在的类中进行编写比较器的操作。
package com.xkrj.gqk;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class Person implements Comparable {
private String name;
private int age;
public static void main(String[] args) throws ParseException {
Person per[] = { new Person("张三", 20), new Person("李四", 19), new Person("王五", 23) };
Arrays.sort(per);
for (int i = 0; i < per.length; i++) {
System.out.println(per[i]);
}
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person o) {
if(this.age>o.age){
return 1;
}else if(this.age
return -1;
}else{
return 0;
}
}
}