java学习笔记 第二篇 核心技术(二)
第十四章 集合类
14.1 Collection 接口
14.2 List 集合
1.List接口,两个重要方法:
2.List接口的实现类
14.3 Set 集合
14.4 Map 集合
第十五章 I/O输入输出
15.1 输入输出流
15.2 File类
15.3文件输入输出流
15.3.1 FileInputStream与FileOutputStream类
15.3.2 FileReader类和FileWriter类
使用方法:
File file = new File("G:/word.txt");
char a[] = new char[1024];
FileReader reader= new FileReader(file);;
FileWriter fw = new FileWriter(file);
fw.write(a);
fw.close();
int len = reader.read(c);
System.out.println(new String(c,0,len));
reader.close();
15.4 带缓存的输入输出流
15.5 数据输入输出流
15.6 ZIP压缩输入输出流
第十六章 反射
◆16.1.Class类
getFields():获得类的public类型的属性(成员变量)。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。
getConstrutors():获得类的public类型的构造方法。
getConstrutor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
Field fields[]=classType.getDeclaredFields();
以上代码先调用Class类的getConstructor()方法获得一个Constructor对象,它代表默认的构造方法,然后调用Constructor对象的newInstance()方法构造一个实例。
for(int i=0; i Field field=fields[i];
String fieldName=field.getName();
String firstLetter=fieldName.substring(0,1).toUpperCase();
//获得和属性对应的getXXX()方法的名字 String getMethodName="get"+firstLetter+fieldName.substring(1);
//获得和属性对应的setXXX()方法的名字 String setMethodName="set"+firstLetter+fieldName.substring(1);
//获得和属性对应的getXXX()方法
Method getMethod=classType.getMethod(getMethodName,new Class[]{});
//获得和属性对应的setXXX()方法
Method setMethod=classType.getMethod(setMethodName,new Class[]{field.getType()});
//调用原对象的getXXX()方法
Object value=getMethod.invoke(object,new Object[]{});
System.out.println(fieldName+":"+value);
//调用复制对象的setXXX()方法
setMethod.invoke(objectCopy,new Object[]{value});}
◆16.2.Method类(访问方法)
invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回。
◆16.3.Array类
◆16.4.Annotation类型
1.Annotation功能可用于类、构造方法、成员变量、方法、参数等的声明中。该功能不影响程序运行,但会对编辑器的警告等辅助工具产生影响。16.4.2访问Annotation信息
第十七章 枚举类型与泛型
17.1 枚举类型
{ Sun,Mon,Tue,Wed,Thu,Fri,Sat}
该集合可定义为描述星期的枚举类型,该枚举类型共有七个元素,因而用枚举类型定义的枚举变量只能取集合中的某一元素值。由于枚举类型是导出数据类型,因此,必须先定义枚举类型,然后再用枚举类型定义枚举型变量。
2.语法:
enum <枚举类型名>
{ <枚举元素表> };
其中:关键词enum表示定义的是枚举类型,枚举类型名由标识符组成,而枚举元素表由枚举元素或枚举常量组成。例如:
enum weekdays
{ Sun,Mon,Tue,Wed,Thu,Fri,Sat };
3.用户可以将一个枚举类型看作一个类(但需在类内定义!),它继承于java.lang.Enum类,当定义一个枚举类型时,每一个枚举类型成员都可以看作是枚举类型的一个实例,这些枚举类型成员默认都被final、public、static所修饰,所以当使用枚举成员时直接使用枚举类型名称调用枚举类型成员即可。
4.枚举类型常用方法:
values(),将枚举类型的成员变量实例以数组的形式返回,也可通过该方法获取枚举类型的成员。
valueOf(),可以将普通字符串转换为枚举类型。
compareTo(),用于比较两个枚举类型对象定义时的顺序。
ordinal(),获取某个枚举对象的位置索引值。
5.在枚举类型中,可以添加构造方法,但是构造方法必须为private修饰符所修饰。
17.2 泛型
第十八章 多线程
1. 世间万物都可以同时完成多项工作,这种思想放在Java中被称为并发,而将并发完成的每一件事情称为线程。程序员在Java程序中可以执h行多个线程,每个线程完成一个功能,并与其他线程并发执行,这种机制称为多线程。
2. 进程:每个进程是一个包含有自身地址的程序,每个立执行的程序都称为进程,也就是正在执行的程序。
3.一个线程是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程。
18.1 实现线程的两种方式
1.继承Thread类
1.Thread类是Java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread实例。
2.Thread类中常用的构造方法:publicThread([String threadName]) //StringthreadName线程名称
3.完成线程真正功能的代码放在类的run()方法中,而Thread类中start()方法执h行线程,也就是调用run()方法。主方法线程启动由Java虚拟机负责,程序员负责启动自己的线程。
2. 实现Runnable接口
1.如果程序员需要继承其他类(非Thread类),而且还要是当前类实现多线程,由于Java不支持多继承,就只能通过Runnable接口实现。(实质上
Thread类就是实现了Runnable接口)
2.语法:publicclass Thread extends Object implements Runnable
3.实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。Thread类中有以下构造方法:
public Thread(Runnable r,[String name]) //此构造方法可以将Runnable实例与Thread实例相关联。
4.使用Runnable接口启动新线程的步骤:
建立Runnable对象;
使用参数为Runnable对象的构造方法创建Thread实例;
调用start()方法启动线程。
实例:
- package mythread;
- public class MyRunnable implements Runnable
- {
- public void run()
- {
- System.out.println(Thread.currentThread().getName());
- }
- public static void main(String[] args)
- {
- MyRunnable t1 = new MyRunnable();
- MyRunnable t2 = new MyRunnable();
- Thread thread1 = new Thread(t1, "MyThread1");
- Thread thread2 = new Thread(t2);
- thread2.setName("MyThread2");
- thread1.start();
- thread2.start();
- }
- }
18.2 线程的生命周期
线程包含7中状态:出生状态、就绪状态、运行状态、等待状态、休眠状态、阻塞状态和死亡状态。
18.3 操作线程的方法
1.线程的休眠(sleep())
sleep()方法需要一个参数用于指定该线程休眠的时间,以毫秒为单位
语法:Thread.sleep(2000);
2.线程的加入(join())
在A线程中插入B线程。当某个线程使用join()加入到另一个线程时,另一个线程会等待该线程研究完毕后再继续执行。
3.线程的中断(stop())
当前不建议使用stop()方法,提h倡在run()方法中使用无限循环的形式,然后使用一个布尔型标价控制循环的停止。
18.4 线程的优先级
Thread类中包含的成员变量代表了线程的某些优先级,如Thread.MIN_PRIORITY(常数1)、Thread.MAX_PRIORITY(常数10)、Thread.NORM_PRIORITY(常数5)【默认】
线程的优先级可以使用setPriority方法调整
18.5 线程同步
线程同步机*^制为了解决资源共享时,发生多个线程同一时间共享一个资源的情况。采用给定时间只允许一个线程访问共享,给共享资源上一道锁。
同步机hh制使用synchronized关键字。
1.同步块语法:
synchronized(Object){ 语句 }
2.同步方法语法:
synchronized voidf(){ }
第十九章 网络通信
19.1 网络程序设计基础
1.网络程序设计是指编写与其他计算机进行通信的程序。2.网路协议,规定了计算机之间连接的物理、机械(网卡与网线的连接规定)、电气(有效地电平范围)等特征及计算机之间的相互寻址规则、数据发送冲突的解决,长的数据如何分段传送与接收等。
3.TCP/IP协议栈中,有两个高级协议:“传输控制协议”(TCP)与“用户数据报协议”(UDP)
4.TCP协议以固接连线为基础的协议,数据传送可靠。.UDP是无连接通信协议,不保证可靠的数据传输。
5.一般一台计算机只有单一的连到网络的“物理连接”,这就是端口。网络程序设计中的端口(Port)并非真实的物理存在,而是假象的连接装置。端口被规定为一个在0~65535之间的整数。HTTP服务一般使用80端口。FTP服务使用21端口。
6.通常0~1023之间的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口数,避免冲突。
7.网络程序中套接字(socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插座,用来连接电器与电线。Java将套接字抽象化为类--Socket类。
Socket类的常用方法:
- public Socket(InetAddress address,int port) throws IOException
- public Socket(String host,int port) throws UnknowHostException,IOException
- public Socket(InetAddress address,int port,InetAddress localAddr,int localport) throws IOException
- public InetAddress getInetAddress()//返回套接字连接的主机地址
- public InetAddress getLocalAddress()//返回套接字绑定的本地地址
- public InputStream getInputStream()throws IOException//获得该套接字的输入流
- public int getLocalPort()//返回套接字绑定的本地端口
- public int getPort()//返回套接字连接的远程端口
- public OutputStream getOutputSteam()throws IOException//返回该套接字的输出流
- public int getSoTimeout()throws SocketException//返回该套接字最长等待时间
- public void setSoTimeout(int timeout)throws SocketException//设置该套接字最长等待时间
- public void shutdownInput()throws IOException//关闭输入流
- public void shutdownOutput()throws IOException//关闭输出流
- public void close()throws IOException//关闭套接字
19.2 TCP程序设计基础
19.2.1 InetAddress类
常用方法有:
getByName(String host) //获取与Host相对应的InetAddress对象
getHostAddress() //获取InetAddress对象所含的IP地址
getHostName() //获取此IP地址的主机名
getLocalHost() //返回本地主机的InetAddress对象
19.2.2 ServerSocket类
- public ServerSocket(int port) throws IOException
- public ServerSocket(int port,int backlog) throws IOException
- public ServerSocket(int port,int backlog,InetAddress bindAddr) throws IOException
- public Socket accept() throws IOException//监听并接受客户端Socket连接
- public InetAddress getInetAddress()//返回服务器套接字的本地地址
- public int getLocalPort()//返回套接字监听的端口
- public int getSoTimeout()throws SocketException//返回该套接字最长等待时间
- public void setSoTimeout(int timeout)throws SocketException//设置该套接字最长等待时间
- public void close()throws IOException//关闭套接字
19.2.3 TCP网络程序
19.3 UDP程序设计基础
UDP程序的步骤:
a.使用DatagramSocket(int port)创建数据包套接字,绑定到指定的端口
b.使用DatagramPacket(byte[] buf,int length)创建字节数组来接收数据包。
c.使用DatagramPacket类的receive()方法接收UDP包。
DatagramPacket类
DatagramSocket类
第二十章 数据库操作
2.数据库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合
20.1 SQL语言主要部分组成:
常用数据操纵语言:
1.select语句
2.insert语句
3.update语句
4.delete语句
20.2 JDBC
1.JDBC技术
2.JDBC驱动类型
1)JDBC-ODBC桥
把标准的JDBC调用转换成相应的ODBC调用,并通过ODBC库把它们发送给ODBC数据源。这种方式访问数据库,需要经过多层调用,效率比较低。访问Micros Access数据库,就只能通过这种方式来访问。
2)部分本地API Java驱动程序
利用JDBC API访问数据库时,JDBC驱动程序将调用请求转换为数据库厂商提供的本地API调用,数据库处理完请求将结果通过这些API返回,进而返回给JDBC驱动程序,JDBC驱动程序将结果转化为JDBC标准形式,再返回客户程序。
这种类型减少了ODBC的调用环节,极高了数据库访问的效率,并且能够充分利用厂商提供的本地API的功能。
3)JDBC网络纯Java驱动程序(首先)
这种驱动利用应用服务器作为中间件来访问数据库。应用服务器作为一个到多个数据库的网关,客户端通过它可以连接到不同的数据服务器。应用服务器都有自己的网络协议,Java客户程序通过JDBC驱动程序将JDBC调用发送给应用服务器,应用服务器使用本地驱动程序访问数据库,从而完成请求。
4)本地协议的纯Java驱动程序(首先)
客户程序通过网络直接与数据库进行通信。数据库访问效率最高。