1、 基本数据类型的对象包装类
基本数据类型(不具有对象特性) 包装类
boolean Boolean
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
将字符串转换成整数的编程举例:
在屏幕上打印一个星号组成的矩形,矩形的宽度和高度通过启动程序时传递给main方法的参数指定,并比较下面两段代码的运行效率:(结果差别不大,左边比右边的效率高)
String sb = new String(); StringBuffer sb = new StringBuffer();
for(int j = 0;j<w;j++) for(int j = 0;j<w;j++)
{ {
sb = sb + ‘*’; //创建新对象后被覆盖 sb.append(‘*’);//每次调用不创建新对象
} }
左边,每一次运行先将sb转换为StringBuffer,再将星号追加到StringBuffer当中,新的结果再调用tostring方法,转换成String对象,接着,在第二次循环时又要重复刚才的过程,也要执行这条语句“sb + ‘*’”,这条语句每次执行后都会形成新的String对象,然后让sb指向这个新的String对象;
右边,每次循环,调用的都还是在循环外面创建的StringBuffer对象,在循环里面没有产生新的StringBuffer对象,没有创建任何对象,所以它(sb.append(‘*’))的运行效率要比左边语句(sb + ‘*’)的运行效率要高
2、 集合类
集合类用于存储一组对象,其中的每个对象称之为元素,经常会用到的有Vector、Enumeration、ArrayList、Collection、Iterator、Set、List等集合类和接口。
5.1Vector类与Enumeration接口,存在于Java.util包中。
Vector类是java语言提供的高级存储结构,可用于保存一系列的对象,java语言没有动态数组,Vector类提供一种跟动态数组相近的功能,如果要想将若干对象保存在一个数组结构中,但不能预先确定要保存对象的数目时,Vector类是一个不错的选择
编程举例:将键盘上输入的一个数字序列中的每位数字存储在Vector对象中,然后在屏幕上打印出每位数字相加的结果,例如,输入32,打印5;输入1234,打印10.
编程举例:将输入的数字序列各个位数相加并打印显示出来;
import java.util.*; //Vector类与Enumeration接口,都存在于Java.util包中
public class TestVector {
public static void main(String[] args) {
// TODO: Add your code here
Vector v = new Vector(); //定义Vector对象,以便后面往里面存数据,可以存储各种类型数据;
System.out.println("please enter number:");
int b = 0; //方法中定义变量必须初始化;
while(true) //连续读取多个字符
{
try
{
b = System.in.read(); //读取的内容放到整数变量b中,读取的内容需要判断
}
catch(Exception e){e.printStackTrace();}
if(b=='/r' || b =='/n')
break;
else
{
int num = b-'0';//如果将1存到b中,则b实际存的是字符1在内存中的ASCII值,就是49,,想得到实际的整数1,需要减去‘0’('0'=48);
v.addElement(new Integer(num));//将num用Integer包装对象后,装入到Vector对象V中,使用方法addElement;
}
}
int sum = 0; //数据全部存储到Vector中后,用sum存储所有数据相加后的结果;
Enumeration e = v.elements();//必须调用elements()方法取出Vector类中所有的数据,其返回一个Enumeration实例对象。
//e.nextElement()该方法可以逐一取出Enumeration对象中存储的整数元素;返回指示器正在指向的那个元素对象,返回object对象,然后指示器会下一个;
//e.hasMoreElements()返回FALSE,就说明这个指示器指向空对象,没有对象返回;返回True
while(e.hasMoreElements())
{
Integer intObj = (Integer)e.nextElement();
sum += intObj.intValue();//intValue取出对象中所包装的元素;
}
System.out.println(sum);
}
}
5.2Collection接口与Iterator接口,Collection接口的实现类和Vector类似,方法名不同
改写上例:用ArrayList和Iterator改写上面的例子
important Java.util.*;
pulic class TestVector{
public static void main(String [] args){
ArrayList v = new ArrayList();//实现Collection接口;不考虑线程通信同步时效率高;
System.out.println(“please enter number:”);
int b = 0;
while(true)
{
try
{
int b = System.in.read();
}
catch(Exception e){e.printStackTrace();}
if(b==’/r’ || b ==’/n’)
break;
else
{
int num = b –‘0’;//得到数字字符对应的整数;
v.addElement(new integer(num));
}
}
int sum = 0;
Iterator e = v.iterator();
while(e.hasNext())
{
Integer intObj = (Integer)e.next();
sum += intObj.intValue();
}
System.out.println(sum);
}
两种类的方法和作用都一样。
Vector类中所有的方法都是线程同步的,如果用两个线程并发的去访问Vector对象,这是安全的,但是即使只有一个线程访问Vector对象时,仍然存在这个同步监视器检测的情况,这就需要额外的开销,程序的运行效率将会降低;ArrayList类中的所有方法是不同步的,如果程序中不存在多线程安全的问题,使用ArrayList运行效率要比使用Vector的运行效率要高些。如果程序中存在多线程安全的问题,使用ArrayList将需要编程人员自己对访问ArrayList对象的程序代码进行同步输入,而使用Vector类不需要这样做。
5.3Collection、Set、List接口区别(后二者为前者的子类):
Collection接口中各个元素对象之间无指定顺序,允许有重复元素和多个Null元素对象;
Set各个元素对象之间无指定顺序,不允许有重复元素,最多允许有一个Null元素对象;
List各个元素对象之间有指定顺序,允许有重复元素和多个Null元素对象;
对ArrayList对象排序:
ArrayList al = new ArrayList();
al.add(new Integer(1));
al.add(new Integer(3));
al.add(new Integer(2));
System.out.println(al.toString());//调用toString方法转换为字符串;
Clolections.sort(al);// Clolections都是静态方法,只是提供方法,操作集合对象,进行排序;
System.out.println(al.toString());
3、 Hashtable与Properties类
6.1Hashtable不仅可以像Vector一样动态存储一系列的对象,而且对存储的每一个对象(称为值)都要安排另一个对象(称为关键字)与之相关联。向Hashtable中存储数据,如下:
Hashtable number = new Hashtable();
number.put(“one”,new Integer(1));put方法结束one关键字对象和1值
number.put(“two”,new Integer(2));
number.put(“three”,new Integer(3));
检索关键字
Integer n = (Integer)number.get(“two”);
if(n!=null)
{
System.out.println(“two =”+n);
}
用作关键字的类必须覆盖Object.hashCode方法和Object.equals方法。
该两个方法其实是为Hashtable get方法准备的,不是为自己调用使用的,如果不自定义代码覆盖这两个方法,get方法就只能取到空;
6.2Properties类
Properties类是Hashtable的子类;
增加了将Hashtable对象中的关键字和值保存到文件和从文件中读取关键字和值到Hashtable对象中的方法
如果要调用Properties.store方法存储Properties对象中的内容,每个属性的关键字和值都必须是String类型,查看JDK文档
编程举例:使用Properties把程序的启动运行次数记录在某个文件中,每次运行时打印它的运行次数。
import java.util.Properties;
import java.io.*;
public class PropertiesFile {
public static void main(String[] args) {
// TODO: Add your code here
long startTime = System.currentTimeMillis();
Properties settings = new Properties();
try
{
settings.load(new FileInputStream("count.txt"));//需要新产生实例对象;
}
catch(Exception e)
{
settings.setProperty("count",String.valueOf(0));//实际是调用底下的new Integer(c).toString()方法将整数转换为字符串的
}
//settings.get("count");
int c = Integer.parseInt(settings.getProperty("count"))+1;
System.out.println("这是第"+ c +"次运行" );
//settings.put("count",new Integer(c).toString());可以接受非字符串的字符参数,还是用下面的好
settings.setProperty("count",new Integer(c).toString());
try
{
settings.store(new FileOutputStream("count.txt"),"Program is used:");
}
catch(Exception e)
{
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.print("total running time:" + (endTime-startTime));
}
}
4、 System类与Runtime类
7.1System类
-exit方法,结束java虚拟机的运行,如果是因为程序发生了异常,我们想结束其运行,我们传递非0值作为参数;如果是用户正常运行,我们想终止java虚拟机操作,应该传递一个0作为参数;
-currentTimeMillis方法,是返回到1970年1月1日0点0分0秒起至当前时刻以毫秒为单位的一个值,一个浪琴的大数字;根据这个数值来推断时间;使用这个方法可以检测运行一段程序所用的时间;
-Java虚拟机的系统属性
java –DAAA=b –DBBB=a MyClass
-getProperties和setProperties方法,返回参数是Property实例对象;
编写程序打印当前虚拟机中所有系统属性
7.2Runtime类
-Runtime.getRuntime静态方法
编写实例:在Java程序中启动一个Windows记事本程序的运行实例,并在该运行实例中打开这个java程序的源文件,启动的记事本程序5秒钟后被关闭;
5、 与日期和时间有关的类
-最常用的几个类:Date、DateFormat类和Calender
8.1Calendar类:
-Calendar.add方法;
-Calendar.get方法,获取值;
-Calendar.set方法用以修改Calendar中已经存储的值;
-Calendar.getInstance静态方法:Calendar类是个抽象基类,它需要通过Calendar.getInstance方法来返回一个Calendar类型,也即是其子类的一个实例对象;
-GregorianCalendar子类 是JDK中目前唯一提供的Calendar的一个子类;
编写应用程序计算出距当前日期时间315天后的日期时间,并用“****年**月**日**小时:**分:**秒”的格式输出。
Date类 在某些情况函数调用的就是Dat类,就只能用Date类,而不能用Calendar类,程序中调用的函数方法的参数为Date的就只能用Date;
java.text.DateFormat与java.text.SimpleDateFormat(格式为本地化字符串)子类,位于Java.text.SimpleDateFormat包中
编写实例:将“2002-03-15”格式的日期字符串换成“2002年03月15日”的格式
import java.util.*;
import java.text.SimpleDateFormat;
public class TestCalendar {
public static void main(String[] args) {
// TODO: Add your code here
Calendar cl = Calendar.getInstance();
System.out.println(cl.get(Calendar.YEAR)+ "年" +cl.get(cl.MONTH)+ "月"+ //类名和实力对象名调用常量都行;
cl.get(Calendar.DAY_OF_MONTH)+ "日" +cl.get(cl.HOUR)+ ":"+
cl.get(Calendar.MINUTE)+ ":" + cl.get(cl.SECOND));
cl.add(cl.DAY_OF_YEAR,315);
System.out.println(cl.get(Calendar.YEAR)+ "年" +cl.get(cl.MONTH)+ "月"+ //类名和实力对象名调用常量都行;
cl.get(Calendar.DAY_OF_MONTH)+ "日" +cl.get(cl.HOUR)+ ":"+
cl.get(Calendar.MINUTE)+ ":" + cl.get(cl.SECOND));
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
try
{
Date d = sdf1.parse("2002-03-15");
System.out.println(sdf2.format(d));
}
catch(Exception e)
{
e.printStackTrace();
}
//daemo
class MyTimerTask extends TimerTask
{
private Timer tm = null;
public MyTimerTask (Timer tm)
{
this.tm = tm;
}
public void run()
{
try
{
Runtime.getRuntime().exec("calc.exe");
}
catch(Exception e)
{
e.printStackTrace();
}
tm.cancel();
}
}
Timer tm = new Timer();
tm.schedule(new MyTimerTask(tm)
,30000);
//new Thread(new MyTimerTask()).start();
}
}
6、 Timer与TimerTask类
schedule方法主要有如下几种重载形式:
schedule(TimerTask task,long delay)//隔多长时间以后执行task类中代码
schedule(TimerTask task,Date time) //什么时间开始执行task类中代码
schedule(TimerTask task,long delay,long period) //隔多长时间以后开始定期执行task类中代码
schedule(TimerTask task,Date fistTime,long period) //从什么时间开始定期执行task类中代码
TimerTask类实现了Runnable接口,要执行的任务由它里面实现的run方法来完成。
7、 Math与Random类
Math类包含了所有用于几何和三角运算的方法;
Random类是一个伪随机数(按某种规则)产生器;random不带参数的构造函数使用当前时刻来初始化random类,通过这种方式传递给random类对象的参数每次是不一样的,
8、 学习API的方法
有了某一领域的专业知识,再参看一些范例程序,才能更容易掌握和理解一些新的API类;
不要看什么Java API大全之类的书籍,掌握本章介绍的类为主;
结交一些程序员朋友,或上一些技术论坛;
多掌握处理问题的原理、问题处理过程和方法,有实际具体的需求后,查阅JDK相关帮助文档才是可行的;
不能纸上谈兵,要敢于思考实践;
思考与实践:
1、简述一下你是如何理解API的?
API是我们使用应用程序的助手工具,提简化了我们使用工具的方法,只需知道怎么调用,而不必了解内部具体原理,类似使用照相机一样,我们没必要花时间去了解照相机内部的组成结构,照样可以操作使用其照相功能。
2、当你要接着以前保存的一个工程继续工作时,应该用JcreatorPro打开工程主目录下哪个文件?
双击jcw工作区文件打开,在工作区视图中找到以前保存的工程点击打开。