??xml version="1.0" encoding="utf-8" standalone="yes"?>
code:
import java.util.*;
import java.nio.charset.*;
class CharsetTest
{
public static void main(String[] args)throws Exception
{
/*
Map m=Charset.availableCharsets();
Set names=m.keySet();
Iterator it =names.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
*/
Properties pps=System.getProperties();
//pps.list(System.out);
pps.put("file.encoding","ISO-8859-1");
int data;
byte[] buf=new byte[100];
int i=0;
while((data=System.in.read())!='q')
{
buf[i]=(byte)data;
i++;
}
String str=new String(buf,0,i);
//String strGBK=new String(str.getBytes("ISO-8859-1"),"GBK");
//System.out.println(strGBK);
System.out.println(str);
}
}
RandomAccessFile
RandomAccessFilecd时实CDataInput和DataOutput接口Q提供了Ҏ(gu)仉机存取的功能Q?br /> 利用q个cd以在文g的Q何位|读取或写入数据?br /> RandomAccessFilecL供了一个文件指针,用来标志要进行读写操作的下一位数据的位置?
code:
import java.io.*;
class RandomFileTest
{
public static void main(String[] args)throws Exception
{
Student s1 = new Student(1,"zhangsan",98.5);
Student s2 = new Student(2,"lisi",90.5);
Student s3 = new Student(3,"wangwu",78.5);
RandomAccessFile rsf=new RandomAccessFile("student.txt","rw"); //存取模式rw
s1.WriteStudent(rsf);
s2.WriteStudent(rsf);
s3.WriteStudent(rsf);
Student s =new Student();
rsf.seek(0); //把文件指针移到文仉
for(long i=0;i<rsf.length();i=rsf.getFilePointer())
{
s.ReadStudent(rsf);
System.out.println(s.num+":"+s.name+":"+s.score);
}
rsf.close();
}
}
class Student
{
int num;
String name;
double score;
Student()
{
}
Student(int num,String name,double score)
{
this.num=num;
this.name=name;
this.score=score;
}
public void WriteStudent(RandomAccessFile raf)throws Exception
{
raf.writeInt(num);
raf.writeUTF(name);
raf.writeDouble(score);
}
public void ReadStudent(RandomAccessFile raf)throws Exception
{
raf.readInt();
raf.readUTF();
raf.readDouble();
}
}
对象序列?/p>
.对象{换ؓ字节保存v来,q在日后q原q个对象Q这U机制叫做对象序列化?br /> .一个对象保存到怹存储讑֤上称为持l性?br /> .一个对象要惌够实现序列化Q必d现Serializable接口或Externalizable接口?br /> .当一个对象被序列化时Q只保存对象的非静态成员变量,不能保存M的成员变量和静态的
成员变量?br /> .如果一个对象的成员变量是一个对象,那么q个对象的数据成员也会被保存?br /> .如果一个可序列化的对象包含Ҏ(gu)个不可序列化的对象的引用Q那么整个序列化操作会p|Q?br /> q且会抛Z个NotSerializableException。我们可以将q个引用标记为transient,那么对象
仍然可以序列化?/p>
code:
import java.io.*;
class ObjectSerialTest
{
public static void main(String[] args)throws Exception
{
Employee e1 = new Employee("zhangsan",20,2800.50);
Employee e2 = new Employee("lisi",22,25000.50);
Employee e3 = new Employee("wangwu",23,12800.50);
Employee e4 = new Employee("blovesaga",22,3800.50);
FileOutputStream fos=new FileOutputStream("employee.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(e1);
oos.writeObject(e2);
oos.writeObject(e3);
oos.writeObject(e4);
oos.close();
FileInputStream fis = new FileInputStream("employee.txt");
ObjectInputStream ois =new ObjectInputStream(fis);
Employee e;
for(int i=0;i<4;i++)
{
e=(Employee)ois.readObject();
System.out.println(e.name+":"+e.age+":"+e.salary);
}
ois.close();
}
}
class Employee implements Serializable
{
String name;
int age;
double salary;
transient Thread t1 =new Thread();
Employee(String name,int age,double salary)
{
this.name=name;
this.age=age;
this.salary=salary;
}
//可以写private void readObject()Ҏ(gu)来控制我们自己想要实现的
private void writeObject(java.io.ObjectOutputStream oos)throws Exception
{
//例如我们自己写想要显C的序和那些需要显C?br /> oos.writeInt(age);
oos.writeUTF(name);
System.out.println("Write Object");
}
private void readObject(java.io.ObjectInputStream ois)throws Exception
{
//按照写入的顺序来d
age=ois.readInt();
name=ois.readUTF();
System.out.println("Read Object");
}
}
一个Filecȝ对象Q表CZ盘上的文g或目录?br /> FilecL供了与^台无关的Ҏ(gu)来对盘上的文g或目录进行操作?/p>
import java.io.*;
class FileTest
{
public static void main(String[] args) throws Exception
{
//File f = new File("1.txt");
//f.createNewFile(); 创徏文g
//f.mkdir(); 创徏文g?br /> //File f = new File("F:\\Java Develop\\1.txt");//使用l对路径
//f.createNewFile();
/*
*WINDOWSq_下有盘符QLINUX下是没有?br /> *考虑到JAVA语言的^台性,所有用分隔Wseperator/seperatorChar
*/
/*
File fDir = new File(File.separator);//创徏了当前的根目?br /> String strFile = "Java Develop"+File.separator+"1.txt";
File f = new File(fDir,strFile);
f.createNewFile();
//f.delete();
f.deleteOnExit();
Thread.sleep(3000);
*/
/*
for(int i=0;i<5;i++)
{
File.createTempFile("linshi",".tmp");
f.deleteOnExit();
}
Thread.sleep(3000);
*/
File fDir = new File(File.separator);
String strFile ="Java Develop"+File.separator;
File f = new File(fDir,strFile);
//文gqo?br /> String[] names = f.list(new FilenameFilter()
{
public boolean accept(File dir,String name)
{
return name.indexOf(".java")!=-1;
}
});
for(int i=0;i<names.length;i++)
{
System.out.println(names[i]);
}
}
}
式I/0
?Stream)是字节的源或目的?br /> 两种基本的流? 输入?Input Stream)和输出流(Output Stream)。从从中d一pd字节?br /> 对象UCؓ输入。而能向其中写入一pd字节的对象称出流?/p>
的分类
节点? 从特定的地方d的流c,例如Q磁盘或一块内存区域?br /> qo? 使用节点作ؓ输入或输出。过滤流使用的是一个已l存在的输入或输出连接创建的?br /> (如下?
InputStream(一个抽象的基类)
.三个基本的读写方?br /> abstract int read(): d一个字节数据,q返回到数据Q如果返?1Q表CC输入的
末尾?br /> int read(byte[] b): 数据读入一个字节数l,同时q回实际d的字节数。如果返?1Q?br /> 表示d了输入流的末?br /> int read(byte[] b,int off,int len): 数据读入一个字节数l,同时q回是实际读取的?br /> 节数。如果返?1Q表CC输入的末尾。off指定在数lb中存?br /> 数据的v始偏UM|;len指定d的最大字节数?br /> 其他的方?br /> long-skip(long n): 在输入流中蟩qn个字节,q返回实际蟩q的字节数?br /> int available(): q回在不发生d的情况下Q可d的字节数?br /> void close(): 关闭输入,释放和这个流相关的系l资源?br /> void mark(int reqdlimit): 在输入流的当前位|放|一个标讎ͼ如果d的字节数多余
readlimit讄的|则流忽略q个标记?br /> void reset(): q回C一个标记?br /> boolean markSupported(): 试当前是否支持mark和resetҎ(gu)。如果支持返回trueQ反之false?/p>
java.io包中的InputStream的类层次 (下图)
OutputStream
三个基本的写Ҏ(gu)
abstract void write(int b): 往输出中写入一个字?br /> void write(byte[] b): 往输出中写入数组b中的所有字?br /> void writte(byte[] b,int off,int len): 往输出中写入数组b中从偏移量off开始的len?br /> 字节的数?br /> 其它Ҏ(gu)
void flush(): h输出,强制~冲Z的输出字节被写出
void close(): 关闭输出,释放和这个流相关的系l资?/p>
java.io包中OutputStream的类层次(如下?
基本的流c?/p>
FileInputStream和FileOutputStream
节点,用于从文件中d或往文g中写入字节流。如果在构造FileOutputStreamӞ文g已经
存在Q则覆盖q个文g?br />
BufferedInputStream和BufferedOutputStream
qo,需要用已l存在的节点来构造,提供带缓冲的dQ提高了d的效率?/p>
DataInputStream和DataOutputStream
qo,需要用已l存在的节点来构?提供了读写Java中的基本数据cd的功能?/p>
PipedInputStream和PipedOutputStream
道,用于U程间的通信。一个线E的PipedInputStream对象从另一个线E的PipedOutputStream
对象d输入。要使管道流有用Q必d时构造管道输入流和管道输出流?/p>
code:
import java.io.*;
class StreamTest
{
public static void main(String[] args)throws Exception
{
/*
int data;
while((data=System.in.read())!=-1) //从标准设备读取数?br /> {
System.out.write(data);//从标准设备输出数?br /> }
*/
//输出写数据,只需要关闭尾端的就可以了,因ؓfosq接Cbos
FileOutputStream fos = new FileOutputStream("1.txt");
//fos.write("());
//fos.close();
BufferedOutputStream bos = new BufferedOutputStream(fos);
//bos.write("http//www.baidu.com".getBytes());
//bos.flush();
//bos.close();
DataOutputStream dos=new DataOutputStream(bos); //q接Cbos和fis
byte b=3;
int i=78;
char ch='a';
float f=4.5f;
dos.writeByte(b);
dos.writeInt(i);
dos.writeChar(ch);
dos.writeFloat(f);
dos.close(); //必须调用flush()或者close()不然不会写入盘
//输入读数据
FileInputStream fis=new FileInputStream("1.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
//byte[] buf=new byte[100];
//int len=fis.read(buf);
//int len=bis.read(buf);
//System.out.println(new String(buf,0,len));
//fis.close();
//bis.close();
//注意d的顺序要和写的顺序一?br /> DataInputStream dis = new DataInputStream(bis);
System.out.println(dis.readByte());
System.out.println(dis.readInt());
System.out.println(dis.readChar());
System.out.println(dis.readFloat());
dis.close();
}
}
道输入/输出?code:
import java.io.*;
class PipedStreamTest
{
public static void main(String[] args)
{
PipedOutputStream pos=new PipedOutputStream();
PipedInputStream pis=new PipedInputStream();
//q接
try
{
pos.connect(pis);
new Producer(pos).start();
new Consumer(pis).start();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class Producer extends Thread
{
private PipedOutputStream pos;
public Producer(PipedOutputStream pos)
{
this.pos=pos;
}
public void run()
{
try
{
pos.write("hello,welcome!".getBytes());
pos.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class Consumer extends Thread
{
private PipedInputStream pis;
Consumer(PipedInputStream pis)
{
this.pis=pis;
}
public void run()
{
try
{
byte[] buf=new byte[100];
int len=pis.read(buf);
System.out.println(new String(buf,0,len));
pis.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
=================================================================================
Java I/O库的设计原则
Java的I/O库提供了一个称做链接的机制Q可以将一个流与另一个流首尾相接QŞ成一个流道的链接?br /> q种机制实际上是一U被U做为Decorator(装饰)的设计模式的应用?br />
通过的链接Q可以动态的增加的功能Q而这些功能的增加是通过l合一些流的基本功能而动
态获取的?/p>
我们要获取一个I/O对象Q往往需要生多个I/O对象Q这也是Java I/O库不大容易掌握的原因Q?br /> 但在I/O库中的Decorator模式的运用,l我们提供了实现上的灉|性?/p>
I/O的链接?如下)
Reader和Writer
JavaE序语言使用Unicode来表C字W串和字W?br /> Reader和Writerq两个抽象类主要用来d字符?/p>
java.io包中Reader的类层次(如下?
java.io包中Writer的类层次(如下?
code:
import java.io.*;
class StreamTest
{
public static void main(String[] args)throws Exception
{
/*
FileOutputStream fos = new FileOutputStream("1.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
BufferedWriter bw = new BufferedWriter(osw);
bw.write(" bw.close();
FileInputStream fis = new FileInputStream("1.txt");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
System.out.println(br.readLine());
br.close();
*/
//InputStreamReader/OutputStreamWriter是一个中间过度类,q接字符和字W串
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String strLine;
while((strLine=br.readLine())!=null)
{
System.out.println(strLine);
}
br.close();
}
}
字符集的~码
ASCII(American Standard Code for Information Interchange,国信息互换标准代码),是基
于常用的英文字符的一套电(sh)脑编码系l。我们知道英文中l常使用的字W,数字W号被计机
处理旉是以二进制编码的形式出现(bit)二进制数对应。其最高位?Q相应的十进制数?-127
如,数字1Q有一些制表符和其他符L成。ASCII是现金最通用的单字节~码pȝ?/p>
GB2312Q?GB2312码是中华人民共和国国家汉字信息交换用~码Q全U《信息交换用汉字~码?br /> W集-基本集》。主要用于给每一个中文字W指定相应的数字Q也是q行~码。一个中文字W?br /> 用两个字节的数字来表C,Z和ASCII码有所区别Q将中文字符每一个字节的最高位|都?
来表C?/p>
GBKQؓ了对更多的字W进行编码,国家又发布了新的~码pȝGBKQGBK的K是“扩展”的汉语
拼音的第一个字母)。在新的~码pȝ里,除了完全兼容GB2312外,q对J体中文Q一些不常用
的汉字和许多W号q行了编码?/p>
ISO-8859-1Q是西方国家所使用的字W编码集Q是一U单字节的字W集Q而英文实际上只用了其
中数字小?28的部分?/p>
Unicode: q是一U通用的字W集Q对所有语a的文字进行统一~码Q对每一个字W都采用2个字?br /> 来表C,对于英文字符采取前面加?”字节的{略实现{长兼容。如"a"的ASCII码ؓ0x61,
UNICODE׃ؓ0x00,0x61?/p>
UTF-8: Elight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符?
UCS是所有其他字W集标准的一个超?。一?位的ASCII码|对应的UTF码是一个字节,如果
字符?x0000Q或?x0080?x007f之间Q对应的UTF码是两个字节Q如果字W在0x0800?xffff
之间Q对应的UTF码是三个字节?br />
所谓框架就是一个类库的集合。集合框架就是一个用来表C和操作集合的统一框架Q包含了实现
集合的接口和cR?br />
集合框架中的接口
.Collection: 集合层次中的Ҏ(gu)口,JDK没有提供q个接口直接的实现类?br /> .Set: 不能包含重复的元素。SortedSet是一个按照升序排列元素的Set?br /> .List: 是一个有序的集合Q可以包含重复的元素。提供了按照索引讉K的方式?br /> .Map: 包含了key-value寏VMap不能包含重复的key。SortedMap是一个按照升序排列key的Map?br />
集合框架中的实现c?br />
实线表示l承c,虚线表示实现cR?br /> (囑֦?
.ArrayList: 我们可以其看做是能够自动增长容量的数组?br /> .利用ArrayList的toArray()q回一个数l?br /> .Arrays.asList()q回一个列表?br /> .q代?Iterator)l我们提供了一U通用的方式来讉K集合中的元素?/p>
注意: 从集合类中获取一个数l?toArray(),从数l获取列表利用Arrays.asList()
例子:
import java.util.*;
class ArrayListTest
{
public static void printElement(Collection c)
{
Iterator it = c.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
public static void main(String[] args)
{
ArrayList a = new ArrayList();
/*
a.add("abc");
a.add("def");
a.add("hjk");
*/
a.add(new Point(1,1));
a.add(new Point(2,2));
a.add(new Point(3,3));
/*
Object[] o;
o=a.toArray(); //集合类转换为数l?br /> for(int i=0;i<o.length;i++)
{
System.out.println(o[i]);
}
List b = new ArrayList();
b=Arrays.asList(o);
System.out.println(b);
for(int i=0;i<a.size();i++)
{
System.out.println(a.get(i));
}
System.out.println(a);
System.out.println(a);
*/
/*
Iterator it = a.iterator();
如果要删除元素,必须先调用nextҎ(gu)
it.next();
it.remove();
while(it.hasNext())
{
System.out.println(it.next());
}
*/
//q代器的作用: 提供一l通用的访问方?br /> printElement(a);
}
}
class Point
{
int x, y;
Point(int x, int y)
{
this.x=x;
this.y=y;
}
public String toString()
{
return "x="+x+","+"y="+y;
}
}
Collectionsc?/p>
.排序: Collections.sort(); [区别与Arrays.sort()]
(1) 自然排序(natural ordering);
(2) 实现比较?Comparator)接口?br /> .取最大和最的元素: Collections.max(),Collections.min();
.在已排序的List中搜索指定的元素: Collections.binarySearch()?/p>
代码CZ:
import java.util.*;
class ArrayListTest
{
public static void printElement(Collection c)
{
Iterator it = c.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
public static void main(String[] args)
{
/*
ArrayList a = new ArrayList();
a.add("abc");
a.add("def");
a.add("hjk");
a.add(new Point(1,1));
a.add(new Point(2,2));
a.add(new Point(3,3));
Object[] o;
o=a.toArray(); //集合类转换为数l?br /> for(int i=0;i<o.length;i++)
{
System.out.println(o[i]);
}
List b = new ArrayList();
b=Arrays.asList(o);
System.out.println(b);
for(int i=0;i<a.size();i++)
{
System.out.println(a.get(i));
}
System.out.println(a);
System.out.println(a);
*/
/*
Iterator it = a.iterator();
如果要删除元素,必须先调用nextҎ(gu)
it.next();
it.remove();
while(it.hasNext())
{
System.out.println(it.next());
}
*/
//q代器的作用: 提供一l通用的访问方?br /> //printElement(a);
Student s1 = new Student(1,"zhangsan");
Student s2 = new Student(2,"lisi");
Student s3 = new Student(3,"wangwu");
Student s4 = new Student(3,"blovesaga");
ArrayList a = new ArrayList();
a.add(s1);
a.add(s2);
a.add(s3);
a.add(s4);
//Collections.sort(a);
Collections.sort(a,new Student.StudentComparator());
printElement(a);
}
}
class Point
{
int x, y;
Point(int x, int y)
{
this.x=x;
this.y=y;
}
public String toString()
{
return "x="+x+","+"y="+y;
}
}
class Student implements Comparable
{
int num;
String name;
//实现比较器,它L和我们的一个类相关,用内部类
static class StudentComparator implements Comparator //Z调用方便声明为静态的
{
public int compare(Object o1,Object o2)
{
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int result=s1.num > s2.num ? 1: (s1.num==s2.num ? 0 : -1);
if(result==0)
{
return s1.name.compareTo(s2.name);
}
return result;
}
}
Student(int num,String name)
{
this.num=num;
this.name=name;
}
public int compareTo(Object o)
{
Student s=(Student)o;
return num > s.num ? 1 :( (num==s.num) ? 0 : -1);
}
public String toString()
{
return +num+":"+name;
}
}
* E序Q进E和U程
E序: 是指计算机指令的集合Q它以文件的形式存储在磁盘上?br />q程: 是一个程序在其自w的地址I间中的一ơ执行活动?/p>
q程是资源的甌Q调度和独立q行的单位,因此Q它使用pȝ中的q行资源Q而程序不能申?br />pȝ资源Q不能被pȝ调度Q也不能作ؓ独立q行的单位,因此Q它不站用系l的q行资源?/p>
U程: 是进E中一个单一的连接控制流E。一个进E可以有多个U程?/p>
U程又称量q程Q它和进E一h有独立的执行控制,由操作系l负责调度,区别在于U程
没有独立的存储空_而是和所属进E中的其它线E共享一个存储空_q得线E间的通信q?br />较进E简单?br /> * Java对多U程的支?br />Java在语aU提供了对多U程E序设计的支持?br />实现U程E序的两U方?
(1)从Threadcȝ承;
(2)实现Runnable接口?/p>
Javaq行时系l实C一个用于调度线E执行的U程调度器,用于定某一时刻由哪一个线E在
CPU上运行?br />在java技术中Q线E通常是抢占式的而不需要时间片分配q程(分配l每个线E相{的CPU旉?br />q程)。抢占式调度模型是许多U程处于可以q行状态({待状态)Q但实际上只有一个线E在
q行。该U程一直运行到它终止进入可q行状态({待状态)Q或者另一个具有更高优U的U程
变成可运行状态。在后一U情况下Q低优先U的U程被高优先U的U程抢占Q高优先U的U程获得
q行的机会?br />JavaU程调度器支持不同优先U程的抢占方式,但其本n不支持相同优先U程的时间片轮换?br />Javaq行时系l所在的操作pȝQ例?windows2000Q支持时间片的轮换,则线E调度器支?br />相同优先U线E的旉片轮换?/p>
用多U程技术模拟一个售系l?br />实现代码如下:
class TicketSystem
{
public static void main(String[] args)
{
SellTicket st = new SellTicket();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
}
}
class SellTicket implements Runnable
{
int tickets=100;
Object o = new Object();
public void run()
{
while(true)
{
/*
synchronized(o) //同步块在关键字后得加个对?L的对象都可以)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+
"sell tickets"+tickets);
tickets--;
}
}
*/
sell();
}
}
public synchronized void sell() //同步Ҏ(gu)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+
"sell tickets"+tickets);
tickets--;
}
}
}
* U程的同?br /> The code segments within a program that access the same object from separate,concurrent
thread are called "critical sections"?br /> 同步的两U方式:同步块和同步Ҏ(gu)
没一个对象都有一个监视器(monitor),或者叫做琐?br /> 同步Ҏ(gu)利用的是this所代表的对象的琐?br /> 每个class也有一个琐Q是q个class所对应的Class对象的琐?br />完整CZ:
class TicketSystem
{
public static void main(String[] args)
{
SellTicket st = new SellTicket();
new Thread(st).start();
/*
*写一个try{}catch{}块让main()Ҏ(gu)所在的U程?U?br /> *主要是想要线E优先启?br /> */
try
{
Thread.sleep(1);
}
catch(Exception e)
{
e.printStackTrace();
}
st.b=true;
new Thread(st).start();
//new Thread(st).start();
//new Thread(st).start();
}
}
class SellTicket implements Runnable
{
int tickets=100;
Object obj = new Object();
boolean b=false;
public void run()
{
if(b==false)
{
while(true)
sell();
}
else
{
while(true)
{
synchronized(this) //同步块在关键字后得加个对?L的对象都可以)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("obj:"+Thread.currentThread().getName()+
" sell tickets"+tickets);
tickets--;
}
}
// sell();
}
}
}
public synchronized void sell() //同步Ҏ(gu)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("sell():"+Thread.currentThread().getName()+
"sell tickets"+tickets);
tickets--;
}
}
}
* U程的死?br /> 哲学家进的问题
一帮哲学家在一赯,但是每个人都只有1支筷子,大家都在{待别h拿出一支筷子让自己
先吃Q然后再把自q拿出去,但是大家都不愿意拿出自己的筷子?br /> U程1琐住了对象A的监视器Q等待对象B的监视器Q线E?锁住了对象B的监视器Q等待对象A?br /> 监视器,造成了死琐?/p>
CZ代码:
class TicketSystem
{
public static void main(String[] args)
{
SellTicket st = new SellTicket();
new Thread(st).start();
/*
*写一个try{}catch{}块让main()Ҏ(gu)所在的U程?U?br /> *主要是想要线E优先启?br /> */
try
{
Thread.sleep(1);
}
catch(Exception e)
{
e.printStackTrace();
}
st.b=true;
new Thread(st).start();
//new Thread(st).start();
//new Thread(st).start();
}
}
class SellTicket implements Runnable
{
int tickets=100;
Object obj = new Object();
boolean b=false;
public void run()
{
if(b==false)
{
while(true)
sell();
}
else
{
while(true)
{
synchronized(obj) //同步块在关键字后得加个对?L的对象都可以)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
synchronized(this)
{
if(tickets>0)
{
System.out.println("obj:"+Thread.currentThread().getName()+
" sell tickets"+tickets);
tickets--;
}
}
}
}
}
}
public synchronized void sell() //同步Ҏ(gu)
{
synchronized(obj)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("sell():"+Thread.currentThread().getName()+
"sell tickets"+tickets);
tickets--;
}
}
}
}
* wait,notify,notifyAll
每个对象除了有一个琐之外Q还有一个等待队?wait set),当一个对象刚刚创建的时候,?br /> 的等待队列是I的?br /> 我们应该在当前线E锁住对象的琐后Q去调用该对象的waitҎ(gu)?br /> 当调用对象的notifyҎ(gu)Ӟ从该对象的{待队列中删除一个Q意的U程Q这个线E将再次
成ؓ可运行的U程?br /> 当调用对象的notifyAllҎ(gu)Ӟ从该对象的{待队列中删除所有等待的U程Q这些线E将
成ؓ可运行的U程?br /> wait和notify重要用于producer-consumerq种关系中?br /> 代码CZ:
class Test
{
public static void main(String[] args)
{
Queque q = new Queque();
Procedur p = new Procedur(q);
Consumer c = new Consumer(q);
p.start();
c.start();
}
}
class Procedur extends Thread //生?br />{
Queque q;
Procedur(Queque q)
{
this.q=q;
}
public void run()
{
for(int i=0;i<10;i++)
{
q.put(i);
System.out.println("Procedur put"+ i);
}
}
}
class Consumer extends Thread //消费?br />{
Queque q;
Consumer(Queque q)
{
this.q=q;
}
public void run()
{
while(true)
{
System.out.println("Consumer get"+q.get());
}
}
}
class Queque //攄数据
{
int value;
boolean bFull=false;
public synchronized void put(int i)
{
if(!bFull)
{
value=i;
bFull=true;
notify();
}
try
{
wait();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public synchronized int get()
{
if(!bFull)
{
try
{
wait();
}
catch(Exception e)
{
e.printStackTrace();
}
}
bFull=false;
notify();
return value;
}
}
U程的状态图
|
| new Thread
| yield sleep,wait,suspend,I/Od
\|/ start |------------------------------------>|
New----->Runnable| |Not Runnable
\ |<------------------------------------| /
\ sleepl束,notify,resume,I/O操作完成 /
\ /
\ /
\ /
\ /
\ runҎ(gu)退出 ? /
\stopҎ(gu)调用 /
\ /
\ /
\ / stopҎ(gu)调用
\ /
\ /
\ /
\ /
\ /
\ /
\ ______ _____/
| Dead |
|____________|
U程的终?br />
讄一个flag变量?br /> l合interrupt()Ҏ(gu)?br /> code:
class TestThread
{
public static void main(String[] args)
{
Thread1 t1=new Thread1();
t1.start();
int index=0;
while(true)
{
if(index++==500)
{
t1.stopThread();
break;
}
System.out.println(Thread.currentThread().getName());
}
}
}
class Thread1 extends Thread
{
private boolean bStop=false;
public void run()
{
while(!bStop)
{
System.out.println(getName());
}
}
public void stopThread()
{
bStop=true;
}
}
------------->>设计模式<<-------------
1> 在我们进行程序设计时,逐渐形成了一些典型问题和问题解决Ҏ(gu),q就是Y件模式?br />2> 每一个模式描qC一个在我们E序设计中经常发生的问题,以及该问题的解决Ҏ(gu)?br />3> 当我们碰到模式所描述的问题,可以直接用相应的解x法去解决q个问题,q就是设计模式?br /><$>单例(Singleton)模式
1> 一个类只有一个实例,而且自行实例化ƈ像整个系l提供这个实例,q个cȝ为单例类?br />2> 单例cȝ一个重要特点就是类的构造方法是U有?从而避免了外部用利用构造方法直接创建多个实例?br /> ?RuntimecR?/p>
单例cȝ实现:(code)
class Singleton
{
private static final Singleton st=new Singleton();
private Singleton()
{
}
public static Singleton getInstance()
{
return st;
}
}
class Test
{
public static void main(String[] args)
{
int i=3;
Integer in=new Integer(i);
int j=in.intValue();
System.out.println(j);
String str=in.toString(); //把Integer对象转换为Stringcd
System.out.println("str="+str);
String str1="123";
System.out.println(Integer.valueOf(str1)); //把Stringcd转换为Integercd
boolean b1=false;
Boolean b=new Boolean(b1);
String s1=b.toString();
System.out.println(s1);
String s2="NO";
System.out.println(Boolean.valueOf(s2));
}
}
*****************Class*********************
1> 在Java中,每个class都有一个相应的Class对象。也是_当我们编写一个类Q编译完成后,在生?br /> ?class文g?׃产生一个Class对象Q用于表C个类的类型信息?br />2> 获取Class实例的方法有三种:
<1>利用对象调用getClass()Ҏ(gu)获得该对象的Class实例?br /> <2>使用Classcȝ静态方法forName(),用类的名字获取一个Class的是实例?br /> <3>q用.class的方式来获取Class实例Q对于基本数据类型的装c,q可以用.TYPE来获取相应的
基本数据cd的Class实例?br /> <4>在运行期_如果我们要生某个类的对象,JAVA虚拟?JVM)会检查该cd的Class对象是否?br /> 加蝲Q如果没有加?JVM会根据类的名U找?class文gq加载它。一旦某个类型的Class对象?br /> l被加蝲到内存,可以用它来产生该类型所有的对象?br /> <5>newInstance()调用cM~省的构造方法?好处是我们在不知道类的名字的情况下去创造一个实例)
import java.lang.reflect.*; //子包必须手动导入
class ClassTest
{
public static void main(String[] args)//throws Exception
{
/*
Point pt=new Point();
Class c1=pt.getClass();//利用对象调用getClass()Ҏ(gu)获得该对象的Class实例
System.out.println(c1.getName());
Class c2=Class.forName("Point");//使用Classcȝ静态方法forName(),用类的名字获取一个Class的是实例
System.out.println(c2.getName());
Class c3=Point.class;//q用.class的方式来获取Class实例
System.out.println(c3.getName());
Class c4=Integer.TYPE;//装cȝ.TYPE来获取相应的基本数据cd的Class实例?br /> System.out.println(c4.getName());
*/
/*
System.out.println("before new Point()");
new Point();
System.out.println("after new Point()");
Class.forName("Line");
*/
/*
if(args.length!=1)
{
return;
}
try
{
Class c=Class.forName(args[0]);
Point pt=(Point)c.newInstance();
pt.output();
}
catch(Exception e)
{
e.printStackTrace();
}
*/
if(args.length!=1)
{
return;
}
try
{
Class c=Class.forName(args[0]);
Constructor[] cons=c.getDeclaredConstructors();
/*
for(int i=0;i<cons.length;i++)
{
System.out.println(cons[i]);
}
Method[] ms=c.getDeclaredMethods();
for(int i=0;i<ms.length;i++)
{
System.out.println(ms[i]);
}*/
Class[] params=cons[0].getParameterTypes();
Object[] paramValues=new Object[params.length];
for(int i=0;i<params.length;i++)
{
if(params[i].isPrimitive())
{
paramValues[i]=new Integer(i+3);
}
}
Object o=cons[0].newInstance(paramValues);
Method[] ms=c.getDeclaredMethods();
ms[0].invoke(o,null);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class Point
{
static
{
System.out.println("Loading Point");
}
int x,y;
void output()
{
System.out.println("x="+x+","+"y="+y);
}
Point(int x,int y)
{
this.x=x;
this.y=y;
}
}
class Line
{
static
{
System.out.println("Loading Line");
}
}
1> 在Java中所有的数组都有一个缺省的属性lengthQ用于获取数l元素的个数?br />2> 数组的复? System.arraycopy()?br />3> 数组的排? Arrays.sort()?br />4> 在已排序的数l中查找某个元素QArrays.binarySearch()?br />具体的看看下面的2个例?
code1:
class ArrayTest
{
public static void main(String[] args)
{
/*数组的copy
int[] num1=new int[]{1,2,3};
int[] num2=new int[3];
System.arraycopy(num1,0,num2,0,num1.length);
for(int i=0;i<num2.length;i++)
{
System.out.println(num2[i]);
}
*/
//引用cd的数lcopy
Point[] pts1=new Point[]{new Point(1,1),new Point(2,2),new Point(3,3)};
Point[] pts2=new Point[3];
System.arraycopy(pts1,0,pts2,0,pts1.length);
for(int i=0;i<pts2.length;i++)
{
System.out.println("x="+pts2[i].x+","+"y="+pts2[i].y);
}
/*
*因ؓ引用cd传递的是引用的拯Q所以我们修改pts2数组的第二个点的坐标Q?br /> *当我们打印pts1数组的第一个点的坐标时Q它的坐标点已经被修改ؓ(5,5)?br /> pts2[1].x=5;
pts2[1].y=5;
System.out.println("x="+pts1[1].x+","+"y="+pts1[1].y);
*/
}
}
class Point
{
int x, y;
Point(int x,int y)
{
this.x=x;
this.y=y;
}
}
code2:
import java.util.*;
class TestArray
{
public static void main(String[] args)
{
/*
int[] num=new int[]{3,2,1};
Arrays.sort(num);
for(int i=0;i<num.length;i++)
{
System.out.println(num[i]);
}
int index=Arrays.binarySearch(num,3);
System.out.println("index="+index);
System.out.println("Element="+num[index]);
*/
Student[] ss=new Student[]{new Student("zhangshan",1),
new Student("lisi",2),
new Student("wangwu",3),
new Student("mybole",3)};
Arrays.sort(ss);
for(int i=0;i<ss.length;i++)
{
System.out.println(ss[i]);
}
int index=Arrays.binarySearch(ss,new Student("lisi",2));
System.out.println("name="+ss[index].name+","+"index="+index);
}
}
class Student implements Comparable
{
String name;
int num;
Student(String name,int num)
{
this.name=name;
this.num=num;
}
public String toString()
{
return "name="+name+","+"number="+num;
}
public int compareTo(Object o) //对于Object[]排序要求实现Comparable接口
{
Student s=(Student)o;
//return num>s.num ? 1 :(num==s.num ? 0 : -1);
int result=num>s.num ? 1 :(num==s.num ? 0 : -1);//按名字排?br /> if(0==result)
{
result=name.compareTo(s.name);
}
return result;
}
}
class Fish extends Animal
{
Fish()
{
System.out.println("Fish construct");
}
void breathe() //override method breathe()
{
System.out.println("Fish bubble");
}
}
class DoMain
{
static void fn(Animal an)
{
an.breathe();
}
public static void main(String[] args)
{
//Animal an=new Animal();
Fish fh=new Fish();
Animal an;
an=fh;
DoMain.fn(an);
}
}
F:\Java Develop>java DoMain
Animal breathe!
Animal breathe!
(q说明派生类l承了父cȝ所有方法和成员变量.)
Ҏ(gu)的覆?override)
在子cM定义一个与父类同名,q回cd,参数cd均相同的一个方?UCؓҎ(gu)的覆?Ҏ(gu)的覆盖发生在子类与父cM?
code:
class Animal
{
int height,weight;
void eat()
{
System.out.println("Animal eat!");
}
void sleep()
{
System.out.println("Animal sleep!");
}
void breathe()
{
System.out.println("Animal breathe!");
}
}
class Fish extends Animal
{
int weight,height; //隐藏了父cȝweight,height;
void breathe() //override method breathe()
{
super.breathe(); //用super调用父类的构造方?br /> System.out.println("Fish bubble");
}
}
class DoMain
{
public static void main(String[] args)
{
// Animal an=new Animal();
Fish fn=new Fish();
an.breathe();
fn.breathe();
fn.height=30;
fn.weight=20;
}
}
输出l果:
F:\Java Develop>javac Animal.java
F:\Java Develop>java DoMain
Animal breathe!
Fish bubble
Ҏ(gu)变量super
* 使用Ҏ(gu)变量super提供对父cȝ讉K
* 可以使用super讉K父类被子c隐藏的变量或覆盖的Ҏ(gu)
* 每个子类构造方法的W一条语句都是隐含的调用super,如果父类没有q种形式的构造函数就会报?
code:
class Animal
{
int height,weight;
Animal()
{
System.out.println("Animal construct");
}
void eat()
{
System.out.println("Animal eat!");
}
void sleep()
{
System.out.println("Animal sleep!");
}
void breathe()
{
System.out.println("Animal breathe!");
}
}
class Fish extends Animal
{
Fish()
{
System.out.println("Fish construct");
}
void breathe() //override method breathe()
{
System.out.println("Fish bubble");
}
}
class DoMain
{
public static void main(String[] args)
{
//Animal an=new Animal();
Fish fn=new Fish();
//an.breathe();
//fn.breathe();
//fn.height=30;
//fn.weight=20;
}
}
输出l果:
F:\Java Develop>javac Animal.java
F:\Java Develop>java DoMain
Animal construct
Fish construct