lesson6:
1.数组的复制:System.arraycopy();
2.数组排序:Arrays.sort();对于对象数组,要实现Comparable接口,实现compareTo()方法;
3.数组搜索:Arrays.binarySearch(num1,3);但要先排序;
4.基本数据类型有对应的封装类,所有封装类都是只读类,有与String相互转换的方法;
5.java中,每个类都有一个对应的class对象;获取class实例的方法:
(1)用getClasses();(2)forName();(3).class;对于封装类型可以.TYPE,Class c5=Integer.TYPE;
6.class对象的newInstance()调用缺省的构造方法;缺省的构造方法是公有;
7.反射机制:通过类名得到类的方法和成员,并进行动态处理;
public static void main(String[] args)
{
if(args.length !=1)
{
return;
}
try
{
Class c = Class.forName(args[0]);
Constructor[] cons= c.getDeclaredConstructors();
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();
}
}
运行:javac Test.java;java Test Point;其中Test主类名,Point是一个普通的类;
8.Runtime类和Process类;Runtime可以执行命令语句如 编译文件:exec("javac Test.java");
Process进程,得到输入流;Runtime是个单例模式的的一个例子;
9.单例模式:构造方法为私有;公有静态的得到实例的方法;私有静态的实例对象成员;
深入学习设计模式参考书:《java与模式》,阎宏,电子工业出版社;
lesson7:
1.线程实现方式:Thread和Runnalbe
2.Java中,线程通常是抢占式的而不需要时间片分配进程。
3.内部类可以变相代替外部类实现接口;例如:
class MyThread //implements Runnable
{
int index =0;
private class InnerThread extends Thread
{
public void run()
{
while(true)
System.out.println("thread:"+Thread.currentThread().getName()+":"+index++);
}
}
Thread getThread()
{
return new InnerThread();
}
}
4.线程的同步,对临界区实施保护,允许同一时刻只有一个线程访问;
每一个对象都有一个监视器,或叫锁;
每个class也有一个锁,是这个class所对应的class对象的锁;
实现同步方式:
(1)同步块;synchronized(Object){};其利用的是监听对象Object所代表的对象锁;
(2)同步方法;其利用的是this所代表的对象锁;
5.mian方法与其他线程启动关系
注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。
主线程:JVM调用程序mian()所产生的线程。
后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。
前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程.
Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。
每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。
线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级
6.线程的死锁:线程1锁住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的监视器,就造成了死锁;
7.wait,notify是Object对象的方法,每一个对象除了有一个锁之外,还有一个等待队列(wait set),当一个对象刚创建的时候,他的队列是空的;wait,notify,主要用于生产者--消费关系中;
8.wait()方法只能在同步方法中使用synchronized;
9.线程终止,interrupt();
10.线程在一定条件下,状态会发生变化。线程变化的状态转换如下:
1)、新建状态(New):新创建了一个线程对象。
2)、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3)、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4)、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5)、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
11.守护线程是一类特殊的线程,它和普通线程的区别在于它并不是应用程序的核心部分,当一个应用程序的所有非守护线程终止运行时,即使仍然有守护线程在运行,应用程序也将终止,反之,只要有一个非守护线程在运行,应用程序就不会终止。守护线程一般被用于在后台为其它线程提供服务
例如,熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。
如果未指明是否守护线程,则被创建的线程和创建它的线程具有相同的daemon属性。也就是说守护线程创建的线程如果未特别指定,则是守护线程,用户线程创建的线程如果未特别指定,则是用户线程。
12.当所有的用户线程(非守护线程)都结束时,守护线程就结束,即使mian线程结束,还有非守护线程在运行,守护线程也不会结束;
lesson8:
1.Set接口不能包含重复的元素;List是一个有序的集合,可以包含重的元素;Map不能有重复key;
2.利用ArrayList的toArray()返回一个数组;Arrays.asList(数组)返回一个列表;
3.Iterator;remove();//删除上一返回的元素;;实现Collection接口的类都有iterator()方法;
4.Collections类,在java.lang包中,对比Collection接口;排序:Collections.sort(List);自然排序,升序方式;Collections.sort(al,Collections.reverseOrder()),反序排列;compareTo(Object);自己与比较对象,大于是返回1,等于返回0,小于-1;
5.LinkedList是采用双向循环链表实现的;
6.队列是限定所有的插入只能在表的一端进行,而所有的删除都在表的另一端;先进先出;
7.插入删除操作多的是用LinkedList类,随机访问数据多是用ArrayList类;
8.自己定义的对象加到HashSet时,必须重写对象的hashCode()和equals()方法;
9.TreeSet是靠TreeMap来实现的;需要排序功能是才用TreeSet,一般都用HashSet
10.HashMap,put()方法来增加元素,List中是add();TreeMap, 需要排序功能时才用;
11.Vector:同步的,效率低;可以用非同步的ArrayList()代替;
Collections.synchronizeList(List);也可以实现同步;
Hashtable:同步的,可以用非同步HashMap代替Hashtable
Collections.synchronizeMap(Map);也可以实现同步;
Stack:同步的,用LinkedList
12.Properties,可以用来读取配置文件信息;实例如下:
public static void main(String[] args)
{
// Properties p = System.getProperties();
// p.list(System.out);
Properties p = new Properties();
try
{
p.load(new FileInputStream("tiger.ini"));
Enumeration enums= p.propertyNames();
while(enums.hasMoreElements())
{
String strKey=(String)enums.nextElement();
String strValue = p.getProperty(strKey);
System.out.println(strKey+":"+strValue);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
lesson9:
I/O操作
1.流(Stream)是字节的源或目的;输入流(读出内容)和输出流(写入内容);
节点流:从特定的地方读写的流类, 例如:磁盘或是一块内存区域;
过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的;
2.InputStream三个读方法:
abstract int read();读一个字节的数据并返回,为整型;
int read(byte[]);将数据读入一个数组同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾
int read(byte[] b,int off,int len);off是指定数组b中存放数据的起始偏移位置;
len指定读取的最大字节数;
3.OutputStream三个基本的写方法:
abstract void write(int b):往输出流中写入一个字节;
void write(byte[] b):往输出流中写入数组b中的所有字节;
void write(byte[] b,int off,int len):往输出流中写入数组b中从偏移量off开始的len个字节的数据。
其他:
void flush():刷新输出流,强制缓冲区中的输出字节被写出;
void close():关闭输出流,释放和这个流相关的系统资源;
4.基本的流类:
FileOutputStream和FileInputStream:
节点流;用于从文件中读取或写入字节流;
BufferedInputStream和BufferedOutputStream:
过滤流,需要使用已经存在的节点流来构造,带缓冲的读写流;由已存在的InputStream或OutputStream构造
DataInputSteam 和 DataOutputStream:
过滤流,需要使用已经存在的节点流来构造;提供了读写java中的基本数据类型功能;
PipedInputStream和PipedOutputStream:
管道流,用于线程间的通讯。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。
5.java I/O库的设计原则,链接机制,装饰模式(Decorator)的使用;
6.Reader和Writer,对字符流的读写;java语言使用Unicode来表示字符串和字符,Unicode中16位表示一个字符;
7.字符集的编码:
ASCII(美国信息互换标准代码),每一个ASCII码与一个8位二进制数对应,ASCII码是单字节编码系统;有128个ASCII码,其最高位为0,另有128个扩展的ASCII码,最高位都是1,由一些制表符和其它符号组成;
GB2312:(中华人民共和国国家汉字信息交换用编码),给每一个中文字符指定相应的数字,也就是进行编码;
一个中文字符用两个字节的数字来表示,为了和ASCII码区别,将中文字符每一个字节的最高位置都用1表示
GBK:为了对更多的字符进行编码,国家发布的新的编码;除了完全兼容GB2312外,还对繁体字,一些不常用的汉字和许多符号进行了编码;
ISO-8859-1:是西方国家所使用的字符编码集,是一种单字节的字符集,而英文实际只用了其中数字小于128的部分;
Unicode:这是一种通用的字符集,对所有语言的文字进行了统一编码,对每一个字符都用2个字节来表示,对与英文字符采用前面加“0”字节的策略来实现等长兼容;
UTF-8:通用字符集,一个7位的ASCII码值,对应的UTF码是一个字节;根据字符码的不同,对应分别为一,二,三个字节;
8.对象序列化:将对象转行为字节流保存起来,并在以后还原这个对象;
一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口;
序列化时只保存非静态成员变量,不能保存任何的成员方法和静态成员变量;
对象序列化和反序列化时外部可以调用对象的私有的writeObject,readObject,这是特例;
lesson10:
AWT
1.布局管理器
BorderLayout;
FlowLayout;
GridLayout;
CardLayout;
GridBagLayout;
2.AWT事件
事件监听器:实现了监听器接口类;
一个监听器对象是一个实现了专门监听接口的实例;
lesson12:
网络编程:
1.ISO七层参考模型:下层向上层提供服务;
表,
应,(Telent,Ftp,Http,DNS,SMTP,POP3 --邮局协议)
会,
传,(TCP,UDP)
网,(网际协议IP,Internet互联网控制报文协议ICMP,Internet组管理协议IGMP)
数,
物;
2.TCP/IP模型:
应用层,
传输层,
网络层,
网络接口
3.基于TCP的SOCKET编程:
server端:
ServerSocket(int port);
serverSocket.accept();//阻塞,就是等待客户端的请求;
socket.getOutputStream(),socket.getInputStream;
socket.close();
Client端:
Socket(InetAddress,port);
socket.getOutputStream(),socket.getInputStream;
socket.close();
4.基于UDP的SOCKET编程:
接收者(server)先启动;
接收者(server)端:
DatagramSocket(int port);
DatagreamPacket(byte[],buf,int length);
DatagramSocket.receive(DatagramPacket p);
DatagramSocket.close();
发送端:client;
DatagramSocket();//不指定端口
DatagreamPacket(byte[],buf,int length,InetAddress,int port);
DatagramSocket.send(DatagramPacket p);
DatagramSocket.close();
5.URL与URI
URL是指向万维网中的一中资源;URL是一种特殊的URI;打开到达资源的一个字符串;
URI通用资源标识符;进行分析;
6.读取图片文件应该按字节读取(字节流方式);文本文件可以按行读取(字符流方式),也可以按字节流的方式;