l Object类
若一个类在声明时若不包含类关键字extends,系统就会认为该类直接继承object类,object类包含了所有Java类的公共属性和方法,这些属性和方法在任何类中均可以直接使用。Object类主要的方法如下:
方法 | 功能描述 |
Public Boolean equals(object obj) | 比较两个类变量所指向的是否为同一对象,是 则返回true |
Public final Class getclass() | 获取当前对象所属类的信息,返回class对象 |
Public String toString() | 将调用toString()方法的对象转换成字符串 |
Protected Object clone() | 生成当前对象的一个备份,并返回这个副本 |
Public int hashcode() | 返回该对象的散列代码值 |
Public final void notify() | 唤醒在此对象监视器上等待的单个线程 |
Public final void notifyAll() | 唤醒在此对象监视器上等待的所有线程 |
Public final void wait() | 导致当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法 |
Protected void finalize() | 当垃圾回收器确定不存在对象的更多引用时,由对象的垃圾回收器调用此方法 |
Object类的equals()方法采用的是“==”运算比较,也就是只有两个引用变量指向同一对象时才相等。即对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回TRUE。
Object 类的toString()方法是返回对象的描述信息,在object类中该方法返回对象的类名及对象引用地址
getClass()方法返回调用该方法所属的类
l Math类
Java.lang包中的Math类也称为数学类,是工具类,它在解决与数学有关一些问题时起着非常重要的作用,math类涉及如sin,cos,exp,abs等,这些方法可直接通过类名调用。Math类还提供了Math.PI(圆周率)和Math.E自然对数的底数),两个静态数字常量:E和PI
java.lang.Math类具有以下特点:
(1)该类是final的不能被继承
(2)类中的方法和属性全部是静态,不允许在类的外部创建Math类的对象。因此,只能使用Math类的方法而不能对其做任何更改。
方法 | 功能描述 |
Public static type abs(type i) | 求i的绝对值,type可以是int,long,float,double |
Public static double ceil(double d) | 不小于d的最小整数(返回值为double型) |
Public static double floor(double d) | 不大于d的最大整数(返回值为double型) |
Public static type max(type i1,type i2) | 求i1和i2的最大数,type可以是int,long,float,double |
Public static type min(type i1,type i2) | 求i1和i2的最小数,type可以是int,long,float,double |
Public static double random() | 产生0~1的随机数(不含0和1) |
Public static int round(float f) | 求最靠近f的整数 |
Public static long round(double d) | 求最靠近d的长整数 |
Public static double sqrt(double a) | 求平发根 |
Public static double sin(double d) | 求d的sin值(另有求其他三角函数的方法如cos,tan,atan) |
Public static double exp(double x) | 求e(自然对数的底数)的x次幂 |
Public static double log(double x) | 求自然对数 |
Public static double pow(double a,double b) | 求a的b次幂 |
l System类
System类中的所有成员都是静态且final的,若要引用这些变量和方法时,直接使用System类名做前缀就可以了。如System.in和System.out
1.System类常用方法
exit()方法是终止当前正在运行的Java虚拟机,status是状态码,根据Java规则,status非0表示异常终止:public static void exit(int status)
arraycopy()方法可以从一个数组复制到另一个数组,将源数组src[]中从指定位置srcpos开始的length个元素复制到目的数组dest[]的指定位置destpos,type可以是boolean,byte,char,short,int,long,float,double或object,其定义如下:
Public static void arraycopy(type src[],int srcpos,type dest[],int destpos,int length)
gc()方法可帮助开发人员主动对垃圾内存进行回收,调用gc()方法暗示着Java虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用内存,当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间,定义如下:public static void gc()
currentTimeMillis()返回以毫秒为单位的当前时间,具体而言,是当前时间协调世界时间1970年1月1日午夜之前的时间差(以毫秒为单位测量),注意,当返回值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大,例如许多操作系统以几十毫秒为单位测量时间,定义如下:
Public static long currentTimeMillis()
nanoTime()方法与currentTimeMillis()有点类似,它返回最准确的可用系统计时器的当前值,以毫微秒为单位,通常情况下,它只能用于测量已过的时间,与系统或钟表时间的其他任何时间概念无关,返回值表示从某一固定但任意的时间算起的毫微秒数(或许从以后算起,所以该值可能为负),此方法提供毫微秒的精度,但不是必要的毫微秒的准确度,它对于值的更改频率没有做出保证,定义如下:
Public static long nanoTime()
System类中的三个静态变量: System类最有用的一个功能就是标准输入流和标准输出流,标准输入流用于读取数据,标准输出流用于打印数据, System类的所有变量和成员方法都是静态的,这意味着不必生成 System类的一个实例,就可以调用其成员方法。
System类包含三个静态变量:
Public static final InputStream in
Public static final PrintStream out
Public static final PrintStream err
这些变量是InputStream和PrintStream类的实例,它为stdin,stdout和stderr的交互提供了read(),print(),println()等成员方法,通常,stdin是指键盘,stdout是指终端,而stderr在默认时是指屏幕
System.out可以在屏幕上显示文字,这个流已经打开着并准备好接收输出数据,它能够显示屏幕输出或主机环境叙述的其他输出设备上熟悉的语句如下:
System.out.println(data)
这里println方法属于流类PrintStream的方法,不是System的方法
System.in可以做键盘输入或其他设备的输入
System.err的语法和System.out类似,不需要提供参数就输出错误信息,但是也可以用来输出用户指定的其他信息,包括变量的值,这可能在程序测试时有用。
l Runtime类
Runtime类封装了Java命令本身所启动的实例进程,也就是封装了Java虚拟机进程。一个Java虚拟机对应一个Runtime实例对象,runtime类中的许多方法和system类中的方法重复,不能直接创建runtime实例对象,也就是不能通过new来创建,只能通过Runtime.getRuntime()静态方法来获得Runtime实例对象的引用。
Java虚拟机本身就是windows上的一个进程,这个进程中可以启动其他的windows程序。通过这种方式启动的Windows程序实例就称为子进程,Java虚拟机调用Runtime的exec()方法就可以启动这个子进程,其返回值就是代表子进程的process对象,该方法最常用的定义如下:
Public process exec(string command)
Runtime类其他最常用的方法还包括freeMemory()和totalMemory(),前者返回Java虚拟机的空闲内存量,以字节为单位,后者返回Java虚拟机中的内存总量,以字节为单位,此方法返回的值可能随时间的变化而变化,这取决于主机环境,调用gc()方法可能导致freeMemory()返回值增加,两个方法定义如下:
Public long freeMemory()
Public long totalMemory()
l Java.util包
在Java.util包中,常用的类包括日期类(bate),日历类(calendar),它们可用来产生和获取日期及时间,随机数类(Random)用于产生各种类型的随机数,无序集合,有序集合,非重复集合,映射集合等类来表示相应的数据结构。
l Date类
Date类是JDK 1.0中唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK 1.1版本开始,推荐使用calendar类进行时间和日期处理,由于Date类覆盖了toString,所以可以直接输出Date类型的对象,显示结果类似如下:
星期几 月份 日 时:分:秒 CST 年份
l Calendar类
在处理日期和时间时,系统推荐使用calendar类进行实现,在设计上,calendar类功能比date类强大,且在实现方式上也更复杂一些,calendar类是一个抽象类,在实际使用时实现特定的子类对象,创建对象的过程对程序猿透明,只需使用getInstance()方法创建即可。
1.获取当前时间
如:calendar c=calendar.getInstance();
String s=String.format(“当前时间:%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS”,c);
System.out.println(s);
由于calendar类是抽象类且其构造函数为protected的,所以无法使用calendar类构造方法来创建对象,API中提供了getInstance()方法来创建对象,该方法获得的calendar对象就代表当前系统时间(可用毫秒值表示,它是距历元(1970年1月1日的00:00:00:000)的偏移量),由于calendar类toString类实现没有Date类那么直观,所以直接输出calendar 类对象的意义不大。
2.获得指定时间的calendar类
使用calendar类代表特定的时间,需要首先创建一个calendar对象,然后用set()方法来设定该对象的年月日参数来完成,set()方法声明如下:
//year表示实际的年份,month则为实际的月份减一,date表示实际的日期
Public final void set(int year,int month,int date);
如果只设定某个字段,例如日期的值,则可以使用如下set()方法:
Public void set (int filed,int value)
在该方法中,参数filed代表设置的字段的类型,常见类型如下:
Calendar.YEAR----年份
Calendar.MONTH-----月份
Calendar.DATE------日期
Calendar.DAY_OF_MONTH------日期,和上面完全相同
Calendar.HOUR----12小时制的小时数
Calendar.HOUR_OF_DAY-----24小时制的小时数
Calendar.MINUTE------分钟
Calendar.SECOND-----秒
Calendar.DAY_OF_WEEK-----星期几
后续的参数value代表设置成的值
3.获得calendar类中的信息
使用calendar类中的get()方法可以获得calendar对象中对应的信息,声明如下:
public int get (int field)
其中参数field代表需要获得的字段说明和上面的set方面保持一致,需要说明的是获得的月份为实际月份值减一
4.其他方法说明
(1)add()方法在calendar对象中的某个字段上增加或减少一定的数值,其声明如下:
//增加时amount为正表示增加,amount为负表示减少,field取值见前面描述
Public abstract void add(int field,int amount);
(2)after()方法判断当前日期对象,是否在when对象的后面,如果在 when对象的后面则返回TRUE,否则返回FALSE,其声明如下:
Public boolean after(object when)
//boolean b=当前日期对象.after(when对象)
另外一个类似的方法是before,该方法是判断当前日期对象是否位于另一个日期对象之前
(3)getTime()方法将calendar类型的对象转换为对应的date类对象,两者代表相同的时间点,类似的方法是setTime,该方法的作用是将date对象转换为对应的calendar对象,声明如下:
Public final Date getTime()
Public final void setTime(Date date)
5.calendar对象和相对时间之间的互转
使用calendar类中的getTimeInMillis()方法可以将calendar对象转换为相对时间(相对于格林尼治时间的偏移量,以毫秒为单位),在将相对时间转换为calendar对象时,首先创建一个calendar对象,然后在使用calendar类的setTimeInMillis()方法设置时间即可,这两个方法声明如下:
//返回此calendar的时间值,以毫秒为单位
Public long getTimeInMillis()
//用给定的long值设置此calendar的当前时间值
Public void setTimeInMillis(long millis)
l Random类
Java.util包中专门提供了一个和随机处理有关的类,这个类就是Random类,随机数字生成的相关方法都包含在该类的内部
Random类中实现的随机算法都是伪随机的,在进行随机时,随机算法的起源数字便是种子,在种子数基础上进行一定的变换,从而产生需要的随机数字,在实际的项目开发过程中,经常需要产生一些随机数值。
TIPS:相同种子的Random对象,相同次数生成的随机数字是完全相同的,即两个种子相同的Random对象,第一次与第二次或多次生成的随机数字完全相同,这点在生成多个随机数字时需要特别注意。
下面介绍Random类的使用,以及如何生成指定区间的随机数字以及实现程序中要求的几率。
(1)Rnadom对象生成
Random类包含两个构造方法,声名如下:
Public Random()//使用一个和当前系统时间对应的相对时间有关的数字作为种子,然后使用这个种子数构造Random对象
Public Random(long seed)
(2)Random类中常用方法
Random类中方法生成的随机数都是均匀分布的,也就是说区间内部的数字生成几率是均等的。
方法 | 功能描述
|
Boolean nextBoolean() | 生成一个随机的Boolean值,生成TRUE和FALSE概率均为50% |
Double nextDouble() | 生成一个随机的double值,数值介于[0,1.0)之间 |
Int nextInt() | 生成一个随机的int值,该值介于int的区间,也就是-2^31~2^31-1,如果需要生成指定区间的int值,则需进行一定的数学变换 |
Int nextInt() | 生成一个随机的int值,该值介于[0,n)的区间 |
Void setSeed(long seed) | 重新设置Random对象中的种子数,设置完种子后的Random对象和相同种子,使用new关键字创建出的Random对象相同 |
(3)相同种子的Random对象问题
相同种子的Random对象,相同次数生成的随机数是完全相同的
(4)关于Math类中的random方法
其实在Math类中也有一个random方法,该random方法的工作是生成一个[0,1.0)区间的随机小数,通过math类的源代码可以发现math类中的random方法就是直接调用random类中的nextDouble方法实现的,只是random方法的调用比较简单,所以很多程序猿都习惯使用math类的random方法来生成随机数字。
l 无序集合:collection接口和collections类
Collection是一个接口,而collections是一个类,它们均属于Java.util包,collection是集合接口树的根,它定义了集合操作的通用API,对collection接口的某些实现类允许存在重复的元素,而另一些则不允许,某些是有序的,某些是无序的
Collection是集合操作的实用类,它封装了实现collection接口的类中很多算法,如同步排序,逆序,搜索等
l 有序集合:List接口和ArrayList,LinkedList和Vector类
List表示一种有序的集合,但其中的元素可以重复,但其中的元素可以重复,定义如下:
Public interface List extends collection{
object get(int index);//返回集合中索引为index的对象
Object set(int index,object element);//将集合中索引为index的对象设置为
Element
Void add(int index,object element);//将element插入到索引为index的对象
前 面
Object remove (int index);//将集合中索引为index的对象删除掉
Abstract boolean addAll(int index,collection c);//将集合c插入到索引为index
的对象
Int indexOf(object o);//返回对象o在集合中的从前往后查找到的第一次出
现 的索引位置
Int lastIndexOf(object o);//返回对象o在集合中从后往前查找到的第一次出
现的索引位置
ListIterator listIterator();//返回集合的迭代器
ListIterator listIterator(int index);
}
1.ArrayList类
ArrayList类采用可变大小的”数组“实现List接口,并提供了访问数组大小的方法,ArrayList对象会随着元素的增加其容量自动扩大,在这三种List实现类中,该类效率最高也最常用。
ArrayList类在Java.util包中,一开始ArrayList,的大小为0,每次加入一个值,数组大小将增加1.
2.LlinkedList类
LlinkedList类采用链表结构实现了List接口,并提供了在List开头和结尾进行get,remove和insert操作,以便实现堆栈,队列或双端队列
LlinkedList数据结构是一种双向的连式结构,一个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素,和数组的顺序存储结构相比,插入和删除比较方便,但速度会慢一点
3.Vector类
Vector采用可变体积的数组实现List接口,可通过索引序号所包含的元素进行访问,Vector实现了可扩展的对象数组,使用向量没有数组的范围限制,可以不断添加元素,但向量中不能存放基本数据类型的数据,加入的数据均为对象,Vector类提供了实现可增长数组的功能,随着更多元素加入其中,数组变得更大,删除一些元素,数据变得更小
向量变量声明如下:
Vector<向量元素的数据类型> 变量名;
如:Vector<string> v;
Vector有三个构造函数,定义如下:
//Vector运行时创建一个初始的存储容量,initalcapacity,存储容量是以capacityIncrement变量的增量增长,初始的存储容量和capacityIncrement可以在Vector构造函数中定义:
Public vector(int initalCapacity,int capacityIncrement);
//只创建初始存储容量initalCapacity
Public vector (int initalCapacity);
//不指定初始的存储容量,也不指定增量单位
Public vector();
Vector类提供的访问方法支持类似数组的运算和与Vector大小相关的运算,类似数组的运算包括在向量中增加,删除和插入元素,他们也允许测试向量的内容和检索指定的元素,与大小相关的运算允许判定字节大小和向量中元素的数目,方法声明如下:
//把对象obj组件加到向量尾部,同时向量大小加1,向量容量比以前大1
Public void addElement(Object obj);
//把向量中的obj对象移走
Public boolean removeElement(Object obj);
//将向量中索引为index的对象移走
Public void removeElementAt(int index);
//把向量中的所有对象移走,向量大小为0
Public void removeElements();
//将obj对象插入到向量中索引为index的元素前面
Public void insertElementAt(Object obj,int index);
l 非重复集合:set接口和HashSet,TreeSet及LinkedHashSet类
Set接口表示的集合不能包含重复的元素,定义如下:
Public interface set extends collection{
Int size();//返回元素个数
Boolean isEmpty();//判断集合是否为空
Boolean contains(Object element);//集合中是否包含element对象
Boolean add(Object element);//将element对象添加到集合尾部
Boolean remove(Object element);//将element对象从集合r移除
Iterator iterator();//返回一个迭代器
实现set接口的常用类包括HashSet,TreeSet和LinkedHashSet。HashSet采用Hash表示实现set接口,一个HashSet对象中的元素存储在Hash表中,元素数量较大时,其访问效率比线性表快,TreeSet采用有序树的结构存储集合中的元素,TreeSet对象中元素按升序排序,LinkedHashSet采用hash表和链表结合的结构存储集合中的元素,既能保证集合中元素的顺序,又具有较高的存取效率。
l 映射集合:Map接口和TreeMap类
Map集合把键值映射到某个值,一个键值最多只能映射一个值,Map接口方法主要实现以下三类操作:
(1)基本操作:包括向Map添加值对,通过键获取对应的值或删除该键值对,测试Map中是否含有个键或某个值,返回Map包含的元素个数
(2)批操作:向当前Map添加另一个Map和清空当前Map的操作
(3)集合视图:包括获取当前Map中键的集合,值的集合以及所有行的键-值对等。
Map接口定义如下:
Public interface Map{
Object put(object key,object value);
Object get (object key);
Object remove(object key);
Boolean containskey(object key);
Boolean containsvalue(object value);
Int size();
Boolean isempty();
//整体批操作
Void putAll(Map t);
Void clear();
//集合视图
Public set keyset();
Public collection values();
}
实现Map接口的类包括:
HashMap,Hashtable,TreeMap,WeekHashMap,IdentifyhashMap五个类。
TreeMap与TreeSet相似,是一种有序树的结构实现了Map的子接口sortedMap,该类按键的升序排列元素。
l For循环简化写法在集合,数组中的应用
1.for循环传统写法:
//遍历数组的传统方式
Int []integers={1,2,3,4};
For(int j=0;j<integers.length;j++)
{
Int i=integers[j];
System.out.println(i);
}
//遍历collection对象
String [] strings={“a”,”b”,”c”,”d”};
Collection stringlist=java.util.aslist(strings);
For(Iterator itr=stringlist.iterator();itr.hasNext();)
{
Object str=itr.next();
System.out.println(str);
}
2.for循环的简化写法
基本格式:for(循环变量类型 循环变量名称:要被遍历的对象)
循环体;
//遍历数组
Int []integers={1,2,3,4};
For(int i: integers)
{
System.out.println(i);
}
//被编译器自动编译为:
Int []integers={1,2,3,4};
For(int 变量名1=0:变量名1< integers.length;变量名1++)
{
System.out.println(integers[变量名1]);
}
//遍历collection对象
String [] strings={“a”,”b”,”c”,”d”};
Collection stringlist=java.util.aslist(strings);
For(object str:list)
{
System.out.println(str);
}
//被编译器自动编译为:
String [] strings={“a”,”b”,”c”,”d”};
Collection stringlist=java.util.aslist(strings);
For(Iterator 变量名2=list.iterator();变量名2.hasNext();)
{
Object str=变量名2.next();
System.out.println(str);
}
3.防止在循环体里修改循环变量
在循环变量类型前面加上一个final修饰符,则在循环体里对变量赋值会导致编译错误,这样可以有效杜绝在循环体里修改循环变量的操作了
如:
Int []integers={1,2,3,4};
For( final int i: integers)
{
i=i/2;
}//编译出错
这里只是禁止了对循环变量进行重新赋值,给循环变量的属性赋值,或者调用者能让循环变量内容变化的方法,是不被禁止的,如下例
Random []randoms=new Random[]{new Random(1),new Random(2),new Random(3);}
For(final Random r:randoms){
R.setseed(4);
System.out.println(r.nextlong());
}
4.类型相容问题
为保证循环变量在每次循环开始时被安全赋值,JDK1.5以上对循环变量的类型有一定的限制,在这些限制下,循环变量的类型可以有这样一些选择
(1)循环变量的类型可以是要被遍历的对象中的元素的类型相同,如用int型的循环变量来遍历一个int[]型数组,用object型循环变量来遍历一个collection等。
(2)循环变量的类型可以是要被遍历的对象中的元素的上级类型,如用int型的循环变量来遍历一个byte[]型数组,用object型的循环变量来遍历一个collection<string>(全部元素都是string的collection)等。
(3)循环变量的类型可以是要被遍历的对象中的元素的类型之间存在能自动转换的关系,所以用integer型的循环变量来遍历一个int[]型的数组,或用byte型的循环变量来遍历一个collection<byte>也是可行的。
注意:这里说的元素的类型是由要被遍历的对象决定的,如果它是一个object[]型的数组,那么元素类型就是object,即使里面装的是string对象也是如此。
(4)可以限定元素类型的collection
JDK1.5以后,引入了泛型编程之后,便可用Collection<T>来表示全部元素类型为T的Collection。