练习1:java高级1_02,上机练习
class APIStudy
{
public static void main(String args [])
{
if(args.length>0)
{
System.out.println("the first Demon is"+args[0]);
}
else
{
new APIStudy().call(new A());
}
}
public void call(A a)
{
a.say();
}
}
class A
{
void say()
{
System.out.println("Hello World");
}
}
练习2:String和StringBuffer的学习
1) 可以把StringBuffer转成String来使用String的类
2) String(byte[] bytes,int offset,int length)把字节数组的某部分转化成字符串
3) equalIgnorCase比较字符串内容时忽略大小写。
4) indexOf(int ch)查找字符串中某个字符出现的位置
5) intdexOf(char a,int i)在某个范围内查找字符出现的第一个位置
6) substring()截取字符串
读取字符串源代码:
package API;
import java.io.IOException;
public class ReadLine {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
byte [] buf=new byte[1024];
String strInfo=null;
int pos=0;
int ch=0;
System.out.println("please enter info:");
while(true)
{
try {
ch=System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
switch (ch) {
case '/r':
break;
case '/n':
strInfo=new String(buf,0,pos);
if(strInfo.equals("bye"))
{
return;
}else {
System.out.println(strInfo);
pos=0;
break;
}
default:
buf[pos++]=(byte)ch;
break;
}
}
}
}
练习3:java高级1_04,类型间转换
package API;
public class TestInteger {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
if(args.length==0)
{
args=new String[]{"3","3"};
int h=new Integer(args[0]).intValue();
int w=Integer.valueOf(args[1]).intValue();
for (int i = 0; i < h; i++) {
StringBuffer sb=new StringBuffer();
for (int j = 0; j < w; j++) {
sb.append('*');
}
System.out.println(sb.toString());
}
}
else {
System.out.println("请为主方法输入参数");
}
}
}
问题:该段代码在运行中不能正常运行
练习4:集合类
1) Vector和接口Enumeration的使用
源代码:
package API;
import java.io.IOException;
import java.util.*;
import com.sun.org.apache.bcel.internal.generic.NEW;
public class TestVector {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Vector vector=new Vector();
System.out.println("please enter number");
while (true) {
int b=0;
try {
b=System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (b=='/r'||b=='/n') {
break;
}else {
int num=b-'0';
vector.addElement(new Integer(num));
}
}
int sum=0;
Enumeration e=vector.elements();
while(e.hasMoreElements()) {
Integer integer=(Integer)e.nextElement();
sum+=integer;
}
System.out.println(sum);
}
}
2) ArrayList和Iterator接口的使用,用法同上,该接口不提供线程同步,但是效率比较高。
3) Collection、set和List的区别
Collection:为父类,内可以有重复元素和null,无顺序
Set:子类,无重复元素,只有一个null,无顺序
List:有顺序,可以有重复元素,多个null
4)Collections的排序方法
package API;
import java.util.*;
public class TestSort {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList a=new ArrayList();
a.add(1);
a.add(4);
a.add(3);
System.out.println(a.toString());
Collections.sort(a);
System.out.println(a.toString());
}
}
练习5:hashTable(Object key,Object value)的应用
1) 创建一个key的类,重写equals方法、hashiCode方法
package API;
import javax.security.auth.PrivateCredentialPermission;
public class MyKey {
public MyKey(String name,int age)
{
this.name=name;
this.age=age;
}
private String name;
private int age;
public boolean equals(Object object)
{
if(object instanceof MyKey)
{
MyKey objTemp=(MyKey)object;
if(name.equals(objTemp.name)&&age==objTemp.age)
{
return true;
}else {
return false;
}
}
else {
return false;
}
}
public int hashCode()
{
return name.hashCode()+age;
}
public String toString()
{
return name+","+age;
}
}
2) 存入对象,取出对象的key,测试在hashtabe中存取数据的过程
package API;
import javax.security.auth.PrivateCredentialPermission;
public class MyKey {
public MyKey(String name,int age)
{
this.name=name;
this.age=age;
}
private String name;
private int age;
public boolean equals(Object object)
{
if(object instanceof MyKey)
{
MyKey objTemp=(MyKey)object;
if(name.equals(objTemp.name)&&age==objTemp.age)
{
return true;
}else {
return false;
}
}
else {
return false;
}
}
public int hashCode()
{
return name.hashCode()+age;
}
public String toString()
{
return name+","+age;
}
}
问题1:重写equals和hashCode方法的作用?
答:因为key值不是基本数据类型,在要取出hashtable的值时,键值要进行对象比较,对象的比较就需要用户重写原来的比较方法。
问题2:去掉这两个方法,为什么还能正常取出hashtable中的对象。
答:因为取数据所用的key就是原来表中的key,内存中的地址应该是同一个
练习6:properties的应用,properties为hashtable的子类,键和值都是字符串类型的,通常用来操作文件中的字符串。
在文件中自动记录程序运行次数的源代码:
package API;
import java.util.*;
import java.io.*;
public class PropertiesFile {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Properties settings=new Properties();//定义properties对象
try {
settings.load(new FileInputStream("count.txt"));//向properties对象中读取文件
} catch (Exception e) {
// TODO Auto-generated catch block
settings.setProperty("count", String.valueOf(0));//如果文件不存在,则设置键值对‘count’,0为初始值
}
int c=Integer.parseInt(settings.getProperty("count"))+1;//读取文件内count信息,并加1
System.out.println("这是程序第"+c+"次运行");//在控制台中输出这是第几次运行
settings.setProperty("count",new Integer(c).toString());//把+1后的c存储回properties对象中
try {
settings.store(new FileOutputStream("count.txt"),"program is used");//把properties对象的信息存储到文件中,并存储该条目的标题为"program is used"
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
应用:收费软件设定的运行次数。
说明:所学新得在注释中
练习7:System和RunTime类
1) System.exit(int a)异常终止,a为非零数,正常终止a设0
2) System.currentTimeMills(),1970到现在的总共毫秒数,可以用来计算程序的运行时间。
3) System.getProperties获得系统属性
4) 使用runTime来用java虚拟机操作进程
Process p=null;
try {
p=Runtime.getRuntime().exec("notepad.exe TestProperties.java");//连接字符串左边为以文本方式打开文件的可执行程序,右边为要执行的文件
Thread.sleep(5000);//让主线程停5秒
p.destroy();//终止该进程
} catch (Exception e) {
}
练习8:与日期和时间有关的类
1) Calendar类
package API;
import java.util.*;
import javax.crypto.Cipher;
public class TestCalendar {
/**
* @param args
*/
public static void main(String[] args) {
Calendar c1=Calendar.getInstance();//通过Calendar的静态方法getInstance()实例化其对象
System.out.println(c1.get(c1.YEAR)+"年"
+c1.get(c1.MONTH)+"月"+c1.get(c1.DAY_OF_MONTH)+"日 "
+c1.get(c1.HOUR)+":"+c1.get(c1.MINUTE)+":"+c1.get(c1.SECOND));//获得当前的年月日时分秒
c1.add(c1.DAY_OF_YEAR, 315);//当前时间加315天
System.out.println(c1.get(c1.YEAR)+"年"+c1.get(c1.MONTH)+"月"
+c1.get(c1.DAY_OF_MONTH)+"日 "+
c1.get(c1.HOUR)+":"+c1.get(c1.MINUTE)+":"+c1.get(c1.SECOND));//获得计算后的日期,其中月份要正常显示的话要加1
}
}
2)用SimpleDateFormat方法,来转换输出的格式
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-mm-dd");//定义输入的日期格式
SimpleDateFormat sdf2=new SimpleDateFormat("yyyy年mm月dd日");//定义输出的日期格式
Date d1=null;
try {
d1 = sdf1.parse("2011-01-07");//输入一个字符串日期,转化为日期类型
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(sdf2.format(d1));//转换日期的输出格式,并输出
3)使用定时器控制程序的运行
class MyTimerTask extends TimerTask//定义一个类继承于TimeTask的子类
{ private Timer tm=null;//定义一个定时器属性
public MyTimerTask(Timer tm)
{
this.tm=tm; //输入定时器对象
}
public void run() { //重写run方法
try {
Runtime.getRuntime().exec("calc.exe");//调用打开计算器的进程
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tm.cancel();//关闭定时器
}
}
Timer t=new Timer();//定义一个定时器对象
t.schedule(new MyTimerTask(t), 30000);//30秒后执行任务
练习9:Math与Random类
1) Math类包含了所有用于几何和三角运算的方法
2) Randomshi一个伪随机数产生器,一般会用当前的时间做为伪随机数的种子。