1、Java基础教案第六章 API常用类一. Java SE API应用程序编程接口二. java.lang包运用Java进行编程的基础类,该包中的类由编译器自动导入。 1.主要常用类 (1)Object类 所有Java类的基类,如果在类的声明中未明确使用extends关键字指定父类,则默认为继承自Object类。 toString():返回代表该对象值的字符串。返回字符串格式为:类的全限定名对象哈希码的十六进制整数值。 问题:什么是对象哈希码?实现原理? 答:是对象在JVM虚拟出来的内存地址,而不是实际物理内存的地址。 equals(Object obj):测试其它某个对象是否与此对象“相等”。
2、Objet类中是通过判断两个对象变量是否指向同一块内存区域。 hashCode():返回该对象的哈希码值。 建议:在自定义类中重写toString()和equals()方法,在重写equals()方法时,建议重写hashCode()方法,因为在某些场合需要比较两个对象是否为相同的对象时,会调用到这两个方法。 问题:重写toString()、equals()、hashCode()方法? 2.基本包装类型 Java对所有的基本类型都提供了对应的包装类,所有基本数据类型都能很方便的和对应的包装类相互转换。 String转成Integer Integer integer = new Integer(s
3、tr); Integer integer = Integer.valueOf(str); /问题:此方式与new运算符的区别? Integer转成String String str = Integer.toString(); Integer转成int int i = Integer.intValue(); int转换成Integer Integer integer = new Integer(i); Integer integer = Integer.valueOf(i); String转成int int i = Integer.parseInt(str); 把int转成String Stri
4、ng str = String.valueOf(i); String str = i+; 3.自动装箱、拆箱 装箱:将基本数据类型包装为对应的包装类对象。 拆箱:将包装类对象转换成对应的基本数据类型。 注意:java编译器在编译时期会根据源代码的语法来决定是否进行装箱或拆箱。 4.枚举类型(此部分需要详细学) 枚举类型是指由一组固定的常量组成合法值的类型。 5.数学函数类 java.lang.Math类是final类,并且它的所有成员变量和成员方法都是静态的。 6.静态导入 在JDK5.0以上版本,使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他
5、们的类名。 import static java.lang.Math.*; 问题:静态导入的原理? 7.System System类代表系统,与Math类相似之处,也定义成final的,构造器也定义成了私有的,所有的属性和方法都是static的。 获取标准输入、输出和错误输出流:in/out/err属性 获取当前时间值:currentTimeMillis():该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。实例:计算程序运行需要的时间long start = System. currentTimeMill
6、is(); for(int i = 0;i 文本)、解析(文本-日期)日期/时间。 6.java.text.NumberFormat 类 NumberFormat类用来格式化和解析数值。 7.大数字操作 Java语言支持大数字的操作。在java.math包中提供了两个专门的类:BigInteger和BigDecimal类。第七章 多线程一. 线程概述各个程序看起来是在同一时间内执行多个任务。每个任务通常称之为一个线程。这种能同时执行多个线程的程序称之为多线程程序。二. 进程和线程的区别1. 进程 进程是指每个独立程序在计算机上的一次执行活动。2. 线程 线程就是一个程序内部的一条执行路径。如果
7、一个程序中可以在同一时间内执行多个线程,就说这个程序是支持多线程的。3. 线程和进程的区别 在操作系统中同时运行多个程序叫多进程,在同一应用程序中,多条执行路径并发执行叫多线程。l 每个进程有独立的代码和数据空间,进程间的切换开销大。l 同一进程内的多个线程共享相同的代码和数据空间,每个线程有独立的运行栈和程序计数器,线程间的切换开销小。三. 多线程应用l 程序需要同时执行两个或多个任务。l 程序需要实现一些需要等待上一个任务完成时才能继续下一个任务的执行,如用户输入、文件读写操作、网络操作、搜索等。l 需要一些后台运行的程序时。四. 创建和启动线程1. 创建新线程(1)继承Thread类重写
8、run()方法class MyThread extends Thread public void run() Thread thread2 = new MyThread();(2)实现Runnable接口,实现run()方法。class MyRunner implements Runnable public void run() Thread thread1 = new Thread(new MyRunner();2.启动线程thread1.start();thread2.start();3.线程运行原理分析主线程先执行,然后启动子线程,新线程并不会立刻得到执行,而是统一由JVM根据时间片来调
9、度,调度到哪个线程就由哪个线程执行片刻。多次运行,每次的输出结果都不可能相同,说明JVM调度线程的执行顺序是随机的。JVM划分时间片间隔的机制是依托于操作系统的时间片调度机制。Windows操作系统:基于优先级的抢占式线程调度。Linux操作系统:抢占式内核和实时机制。五. 线程的生命周期1. 新线程当创建Thread类实例时,此实例则处于“新建”状态。当一个线程处于新建状态时,它的线程体中的代码并未得到JVM的执行。2. 可运行的线程当一个线程被阻塞或处于等待状态时,它暂时处于停止,不会执行线程体内的代码。3. 被阻塞和等待状态下的线程阻塞、等待、超时示例:模拟下载文件(TextWaitAn
10、dNotify.java)示例public class DownLoadDemo private class DownLoadFile extends ThreadString fileName = Java基础与案例详解,JavaEE整合开发,Oracle11g权威指南,Android内核剖析,Android移动开发技术,JQuery权威指南;boolean flag = false;Overridepublic void run() tryThread.sleep(3000);catch(InterruptedException ex)ex.printStackTrace();downlo
11、ad();public synchronized void download()DateFormat format = new SimpleDateFormat(yyyy-MM-dd);for(int i=0;i0?rnd:1)+5;/System.out.println(随机数:+rnd);if(rnd5)trySystem.out.println(+format.format(new Date()+Thread.currentThread().getName()+fileNamei+网络超时);wait(6000);catch(InterruptedException ex)ex.prin
12、tStackTrace();elsetrySystem.out.println(+format.format(new Date()+Thread.currentThread().getName()+fileNamei+文件下载用时:+rnd+毫秒);notifyAll();catch(Exception ex)ex.printStackTrace();public static void main(String args) DownLoadDemo demo = new DownLoadDemo();demo.new DownLoadFile().start();demo.new DownLo
13、adFile().start();4.被终止的线程run()方法执行完毕自然终止。未捕获到的异常事件终止了run()方法。六. 线程睡眠在线程体中调用sleep()方法会使当前线程进入睡眠状态,调用sleep()方法时需要传入一个毫秒数作为当前线程睡眠的时间,线程睡眠相应的时间后便会苏醒,重新进入可运行状态。线程睡眠并不会让线程释放它所持有的同步锁,而且在这期间也不会阻碍其他线程的运行。Threed.sleep(100);线程唤醒可以将沉睡或阻塞的线程唤醒。线程唤醒可以使执行了sleep操作的线程或执行了wait操作或者join操作的线程唤醒。线程沉睡要指定沉睡的时间,如果对该线程执行inte
14、rrupt操作,线程可以提早继续运行。示例:谁唤醒了我(TextSleepAndInterrupt.java)七. 线程让步 Threed.yield()方法让当前运行的线程放弃其所占用的CPU时间片,以便让其他线程运行,用线程让步的目的是让线程能适当地轮转,但并不能保证达到此效果。因为即使当前线程放弃时间片,还有可能再次被Java虚拟机(JVM)选中。 yield只是让出cpu的占有权,但是当前线程仍处在可执行状态,调用yield后会先检测是否有相同优先级的处于可执行状态,如果有则把cpu的执行权交给此线程,否则继续运行当前线程,也就是说yield只是让同等优先级的线程有执行的机会,调用yi
15、eld后当前线程可能不受影响继续运行。public class TextThreadYield / 操作线程让步的类private Vector vector = new Vector();/ 创建向量集合private DateFormat dateFormat = new SimpleDateFormat(HH-mm-ss:SSSS);/ 创建日期格式private boolean isFlag = false;private class Yield extends Thread /让步接收文件类public Yield() this.setName(接收文件);/设置线程名称this.s
16、etDaemon(true);/ 如果SendFile线程结束,则该线程自动结束public void run() while (!isFlag) / 标识为真进行循环try Thread.sleep(100);/ 休眠 catch (InterruptedException e) /捕获唤醒异常System.out.println(唤醒异常:+e.getMessage();if (vector.size() = 0) /判断向量集合大小System.out.println(dateFormat.format(new Date()+ t向量集合中没有文件,执行yield操作);Thread.y
17、ield();/调用线程让步 else String ss = (String) vector.remove(0);/移队文件获得对象System.out.println(dateFormat.format(new Date()+t取到文件,名为 + ss);private class SendFile extends Thread /发送文件类private String files = new String 新闻文件, 国内旅游向导, 山水名画欣赏, 发家致富说明 ;public SendFile() this.setName(发送文件);public void run() try for
18、 (int i = 0; i files.length; i+) /循环使线程休眠Thread.sleep(201);/线程休眠vector.add(filesi);/添加文件Thread.sleep(100);/线程休眠 catch (InterruptedException e) /捕获唤醒异常System.out.println(唤醒异常:+e.getMessage();public static void main(String args)/java程序主入口处TextThreadYield text=new TextThreadYield();/实例化对象text.new Yield().s