一、JAVA System类概述
1.概述:
System 类是一个抽象类,所有的字段和方法都是静态的,即不能被实例化。其中包含一些有用的类字段和方法,它不能被实例化。在 System 类提供的设施中,有三个静态的变量in、out、err,分别对应标准输入、标准输出和错误输出流;有对外部定义的属性和环境变量的访问的方法;加载文件和库的方法;还有快速复制数组的一部分的实用方法。因此,System.in、System.out、System.err实际上表示三个对象,这也就是为什么可以用System.out.println("Hello World!")的原因。
2.API预览
arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
clearProperty(String key) 移除指定键指示的系统属性。
currentTimeMillis() 返回以毫秒为单位的当前时间。
exit(int status) 终止当前正在运行的 Java 虚拟机。
gc() 运行垃圾回收器。
getenv() 返回一个不能修改的当前系统环境的字符串映射视图。
getenv(String name) 获得指定的环境变量值。
getProperties() 确定当前的系统属性。
getProperty(String key) 获得指定键指示的系统属性。
getProperty(String key, String def) 获得用指定键描述的系统属性。
getSecurityManager() 获得系统安全接口。
identityHashCode(Object x) 返回给定对象的哈希码,该代码与默认的方法
hashCode() 返回的代码一样,无论给定对象的类是否重写 hashCode()。
inheritedChannel() 返回从创建此 Java 虚拟机的实体中继承的信道。
load(String filename) 从作为动态库的本地文件系统中以指定的文件名加载代码文件。
loadLibrary(String libname) 加载由 libname 参数指定的系统库。
mapLibraryName(String libname) 将一个库名称映射到特定于平台的、表示本机库的字符串中。
nanoTime() 返回最准确的可用系统计时器的当前值,以毫微秒为单位。
runFinalization() 运行处于挂起终止状态的所有对象的终止方法。
runFinalizersOnExit(boolean value) 已过时。 该方法具有固有的不安全性。它可能对正在使用的对象调用终结方法,而其他线程同时正在操作这些对象,从而导致不正确的行为或死锁。
setErr(PrintStream err) 重新分配“标准”错误输出流。
setIn(InputStream in) 重新分配“标准”输入流。
setOut(PrintStream out) 重新分配“标准”输出流。
setProperties(Properties props) 将系统属性设置为 Properties 参数。
static String setProperty(String key, String value) 设置指定键指示的系统属性。
setSecurityManager(SecurityManager s) 设置系统安全性。
3.一些常见应用
1、使用currentTimeMillis()纪录程序执行的时间。
2、arraycopy()复制数组。
3、使用getProperties() 确定当前的系统属性。
4、getenv() 获取系统环境变量。
5、exit()终止当前正在运行的 Java 虚拟机。
6、gc()运行垃圾回收器。
二 、JAVA Runtime类
Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接,该类也不能被实例化。 一般不能实例化一个Runtime对象,它的大多数方法属性都是非静态的,但有一个静态的方法返回本类型的对象,该方法是static Runtime getRuntime()。这种设计模式称为单例模式,以保证该对象在内存中的唯一性。一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。
当Applet和其他不被信任的代码调用任何Runtime方法时,常常会引起SecurityException异常。
1.概述
Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。 一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。
2.API预览
addShutdownHook(Thread hook) 注册新的虚拟机来关闭挂钩。
availableProcessors() 向 Java 虚拟机返回可用处理器的数目。
exec(String command) 在单独的进程中执行指定的字符串命令。
exec(String[] cmdarray) 在单独的进程中执行指定命令和变量。
exec(String[] cmdarray, String[] envp) 在指定环境的独立进程中执行指定命令和变量。
exec(String[] cmdarray, String[] envp, File dir) 在指定环境和工作目录的独立进程中执行指定的命令和变量。
exec(String command, String[] envp) 在指定环境的单独进程中执行指定的字符串命令。
exec(String command, String[] envp, File dir) 在有指定环境和工作目录的独立进程中执行指定的字符串命令。
exit(int status) 通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。
freeMemory() 返回 Java 虚拟机中的空闲内存量。
gc() 运行垃圾回收器。
InputStream getLocalizedInputStream(InputStream in) 已过时。 从 JDK 1.1 开始,将本地编码字节流转换为 Unicode 字符流的首选方法是使用 InputStreamReader 和 BufferedReader 类。
OutputStream getLocalizedOutputStream(OutputStream out) 已过时。 从 JDK 1.1 开始,将 Unicode 字符流转换为本地编码字节流的首选方法是使用 OutputStreamWriter、BufferedWriter 和 PrintWriter 类。
getRuntime() 返回与当前 Java 应用程序相关的运行时对象。
halt(int status) 强行终止目前正在运行的 Java 虚拟机。
load(String filename) 加载作为动态库的指定文件名。
loadLibrary(String libname) 加载具有指定库名的动态库。
maxMemory() 返回 Java 虚拟机试图使用的最大内存量。
removeShutdownHook(Thread hook) 取消注册某个先前已注册的虚拟机关闭挂钩。
runFinalization() 运行挂起 finalization 的所有对象的终止方法。
runFinalizersOnExit(value) 已过时。 此方法本身具有不安全性。它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,从而导致不正确的行为或死锁。
totalMemory() 返回 Java 虚拟机中的内存总量。
traceInstructions(on) 启用/禁用指令跟踪。
traceMethodCalls(on) 启用/禁用方法调用跟踪。
3.常见的应用
(1)、内存管理:
Java提供了无用单元自动收集机制。通过totalMemory()和freeMemory()方法可以知道对象的堆内存有多大,还剩多少。
Java会周期性的回收垃圾对象(未使用的对象),以便释放内存空间。
但是如果想先于收集器的下一次指定周期来收集废弃的对象,可以通过调用gc()方法来根据需要运行无用单元收集器。
一个很好的试验方法是先调用gc()方法,然后调用freeMemory()方法来查看基本的内存使用情况,接着执行代码,然后再次调用freeMemory()方法看看分配了多少内存。
下面的程序演示了这个构想。
class MemoryDemo{ public static void main(String args[]){ Runtime r = Runtime.getRuntime(); long mem1,mem2; Integer someints[] = new Integer[1000]; System.out.println("Total memory is :" + r.totalMemory()); mem1 = r.freeMemory(); System.out.println("Initial free is : " + mem1); r.gc(); mem1 = r.freeMemory(); System.out.println("Free memory after garbage collection : " + mem1);//allocate integers for(int i=0; i<1000; i++) someints[i] = new Integer(i); mem2 = r.freeMemory(); System.out.println("Free memory after allocation : " + mem2); System.out.println("Memory used by allocation : " +(mem1-mem2));//discard Intergers for(int i=0; i<1000; i++) someints[i] = null; r.gc(); //request garbage collection mem2 = r.freeMemory(); System.out.println("Free memory after collecting " + "discarded integers : " + mem2); } }
(2)、执行其他程序
在安全的环境中,可以在多任务操作系统中使用Java去执行其他特别大的进程(也就是程序)。ecec()方法有几种形式命名想要运行的程序和它的输入参数。ecec()方法返回一个Process对象,可以使用这个对象控制Java程序与新运行的进程进行交互。ecec()方法本质是依赖于环境。
三 、JAVA Date、DateFormat日期 Calender日历类
具体类(和抽象类相对)java.util.Date
抽象类java.text.DateFormat 和它的一个具体子类,ava.text.SimpleDateFormat
抽象类java.util.Calendar 和它的一个具体子类,java.util.GregorianCalendar
具体类可以被实例化, 但是抽象类却不能. 你首先必须实现抽象类的一个具体子类。
Date类:
Date类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1月1日00:00:00这一刻之前或者是之后经历的毫秒数。
Date类常用的两个构造函数:
Date()无参数的构造函数创建的对象可以获取本地当前时间。
Date(long time)使用一个从GMT(格林尼治标准时间)1970年, 1月1日00:00:00这一刻之前或者是之后经历的毫秒数创建一个Date对象。
Date示例:
Date date = new Date(); System.out.println(date.getTime()); //1228061164796 System.out.println(date.toString()); //Mon Dec 01 00:06:04 CST 2008 日期数据的定制格式:
(DateFormat类、SimpleDateFormat类) 为了定制日期数据的输出格式,我们可以使用DateFormat的子类SimpleDateFormat。
SimpleDateFormat有个常用构造方法: public SimpleDateFormat(String pattern) //pattern指定输出格式
pattern中可以有如下格式符:
y,yy:用2位数字表示的"年"替换。
yyyy:用4位数字表示的"年"替换。
M,MM:用2位数字表示的"月"替换。
MMM:用汉字表示的"月"替换。
d,dd:用2位数字表示的"日"替换。
H,HH:用2位数字表示的"时"替换。
m,mm:用2位数字表示的"分"替换。
s,ss:用2位数字表示的"秒"替换。
E:用"星期"替换 pattern中的普通ASCII字符,必须用单引号“'”字符括起来,
如: pattern="'time':yyyy-MM-dd";
用SimpleDateFormat对象调用如下方法可以定制某时间输出格式:
public String format(Date date)
Calendar类:
使用Date类可以创建日期/时间对象,使用DateFormat类,SimpleDateFormat类可以对Date对象进行格式化。
使用Calendar类可以设置和获取日期/时间数据的特定部分。
Calendar类是抽象类不能实例化对象,但是可以使用Calendar类的static方法getInstance(),可以初始化一个日历对象。
如:Calendar calendar = Calendar.getInstance();
然后可以使用该calendar对象可以调用方法,如:(当year取负数时表示公元前)
public final void set(int year, int month, int date)
public final void set(int year, int month, int date, int hourOfDay, int minute)
public final void set(int year, int month, int date, int hourOfDay, int minute, int second)
Calendar类对象调用如下方法可以获取有关年份,月份,小时,星期等信息,参数field的有效值由Calendar的静态常量指定
public int get(int field)
实例:
calendar.get(Calendar.MONTH); //返回一个整数,如果该整数是0表示一月,11表示12月 Calendar对象调用如下方法可以把时间表示为毫秒:
public long getTimeInMillis() Calendar使用实例:
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
String 年 = String.valueOf(calendar.get(YEAR)),
月 = String.valueOf(calendar.get(MONTH)+1),
日 = String.valueOf(calendar.get(DAY_OF_MONTH)),
星期 = String.valueOf(calendar.get(DAY_OF_WEEK)-1);
int hour = calendar.get(HOUR_OF_DAY),
minute = calendar.get(MINUTE),
second = calendar.get(SECOND);
System.out.println("现在的时间是:");
System.out.println(年+"年"+月+"月"+日+"日"+"星期"+星期);
System.out.println(hour+"时"+minute+"分"+second+"秒");
calendar.set(2004,7,8); //将日历翻到2004年8月8日,注意7表示八月
long time2004 = calendar.getTimeInMillis();
calendar.set(2008,7,8); //将日历翻到2008年8月8日
long time2008 = calendar.getTimeInMillis();
long 相隔天数 = (time2008-time2004)/(1000*60*60*24);
System.out.println("2008年8月8日和2004年8月8日相隔"+相隔天数+"天");
输出结果:
现在的时间是: 2008年12月1日星期1 14时41分45秒 2008年8月8日和2004年8月8日相隔1461天
四 JAVA Math类
常用值与函数:
Math.PI 记录的圆周率
Math.E 记录e的常量
Math中还有一些类似的常量,都是一些工程数学常用量。
Math.abs 求绝对值
Math.sin 正弦函数 Math.asin 反正弦函数
Math.cos 余弦函数 Math.acos 反余弦函数
Math.tan 正切函数 Math.atan 反正切函数 Math.atan2 商的反正切函数
Math.toDegrees 弧度转化为角度 Math.toRadians 角度转化为弧度
Math.ceil 得到不小于某数的最大整数
Math.floor 得到不大于某数的最大整数
Math.IEEEremainder 求余
Math.max 求两数中最大
Math.min 求两数中最小
Math.sqrt 求开方
Math.pow 求某数的任意次方, 抛出ArithmeticException处理溢出异常
Math.exp 求e的任意次方
Math.log10 以10为底的对数
Math.log 自然对数
Math.rint 求距离某数最近的整数(可能比某数大,也可能比它小)
Math.round 同上,返回int型或者long型(上一个函数返回double型)
Math.random 返回0,1之间的一个随机数
用法实例:
double s=Math.sqrt(7);
double x=Math.pow(2,3) //计算2的3次方
下面是一个生成0-99不重复的100个随机数的例子:
package com.ItHeima.WeekAct; import java.util.ArrayList; /**
* 生成0-99的100个随机数,要求不重复
* @author 支胜勇
*
*/
public class GenerateRandomDemo { /***
* 生成随机数
*/
public static void generateRandom(){ //定义一个用来存放随机数的泛型数组
ArrayList<String> randomArr=new ArrayList<String>(); while(randomArr.size()<100){//判断已生成的随机数是否已有100个,如果没有则继续生成 int intRandom=(int)(Math.random()*100);//生成100以内的一个随机数 if(randomArr.contains(intRandom+";")){//判断生成的随机数是否重复,如果重复,则继续下一次循环
continue;
}else{//如果不重复,随即数组中
randomArr.add(intRandom+";");
System.out.print(intRandom+";");
}
}
} public static void main(String args[]){ //调用生成随机数的方法
generateRandom();
} }