一名java培训生的学习笔记(基础部分2).docx
-
资源ID:1877730
资源大小:2MB
全文页数:75页
- 资源格式: DOCX
下载积分:16金币
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
一名java培训生的学习笔记(基础部分2).docx
第十三章 2007年6月17日 星期日授课教师:学生: 第一节 HashMap类常见的方法及其用法public class Test public static void main(String args) /创建5个Bean的对象b1-b5并对它们进行初始化Bean b1=new Bean();b1.setAge(23);b1.setName("Bob");Bean b2=new Bean();b2.setAge(23);b2.setName("Bob");Bean b3=new Bean();Bean b4=new Bean();b4.setAge(30);b4.setName("Jack");Bean b5=new Bean();b5.setAge(29);b5.setName("wang");HashMap h=new HashMap();/创建HashMap类型对象h;/并调用put方法,将它们取个key名(外号),加入到Map中h.put("1",b1);h.put("2",b2);h.put("3",b3);h.put("4",b4);h.put("5",b5);h.remove("3");/调用remove()方法,将key值为"3"的元素移除HashMapSystem.out.println(h.size();/输出Map中的元素数Bean temp=(Bean)h.get("5");/将key值为"5"的元素取出来,并恢复其Bean身份,并其引用返回给tempSystem.out.println(temp.getAge();System.out.println(temp.getName();/输出key值为"5"的属性值第二节 equals方法和hashCode方法的重写在处理两个对象之间关系时,有时会需要判断两个对象是否相等,如果他们的引用指向的是同一个对象,那么它们是相等的。如Object中的equals方法。如果它们指向的是同一类型的不同对象,但是他们的属性值是相等的,也就是说它们的内容是相等的,那么我们就需要重写equals方法,例如:String中的equals方法就是Object中的equals方法的重写。如果我们自己定义一个类,需要将自己写的类型的两个对象equals。那么我们就需要在该类中重写Object中的equals方法。重写完equals方法后还需要重写hashCode方法。因为当我们用Hash容器(如HashMap、HashSet)装载这些对象时,例如,将一个对象用add方法加入Set时,会产生一个HashCode,当我们又创建一个同类型内容相同的对象时,又变成另外一个HashCode了,它们在容器中的HashCode是随机的生成的,那么你就无法取得该对象了。如果我们要判断容器中是否装进了某种类型的对象,那么就需要重写hashCode方法,因为equals方法返回true的对象,它们的hashCode是相同的,重写hashCode方法就是让计算机在同一HashCode中寻找,否则计算机出于Hash容器的高效性考虑,不会去在已经存放该对象的hashCode中寻找,当然也就找不到了。重写equals方法和hashCodepublic class Money /创建名叫Money这个类public int value = 0;/定义int型数据成员value,并初始化为0。public Money()/创建无参数的构造方法public Money(int i)/带有参数的构造方法value = i;public boolean equals(Object obj)/重写时需要注意重写的方法定义的要求if (obj=null)/判断形参的是否为空。如果是,返回false return false;if(this=obj)/判断形参对象与调用该方法的当前对象是否指向同一对象,如果是返回true.return true;if(!(obj instanceof Money)/判断形参对象是否是Money的实例,如果不是,返回false.return false;Money mo=(Money)obj;/将形参引用恢复成该对象的身份。if(mo.value!=this.value)/如果他们的内容不相等,返回false return false;return ture;如果都不是上面的情况返回truepublic int hashcode()/重写hashcode方法,使它们的hashcode保持一致return value;我们在eclipse中测试一下:如果我们不重写hashCode方法。那么输出的将会是flase如果我们将每个对象都存放在同一hashCode中,那样查找的效率就会很低,但是我们还可以利用String中的hashCode的算法,去重新写hashCode方法。public int hashCode()String str=String.valueOf(value);/将整型的value转化为String型的strreturn str.hashCode();/用String中的hashCode的算法,返回hashCode第十四章 2007年6月18日 星期一授课教师:学生: 第一节 如何创建一个文件对象有三种方式:1、File myfile=new File(“d:/java/a.txt”);2、File myfile1=new File(“d:/java”, a.txt”);3、File myfile2=new File(“myfile1”, b.txt”);File类中常见的方法举例说明:import java.io.File;import java.io.IOException;/导入java.io包中的File和 IOException两个类public class FileName public static void main(String args)File f1=new File("d:/java111");/创建一个文件对象f1f1.mkdir();/创建该文件对象的目录File f=new File("d:/whjhg.txt");/创建一个文件对象fFile ff=new File(f1,"www.txt");/创建一个文件对象ff,利用File中的构造方法,将其目录设置为f1所指向的路径/将文件名设置为www.txt。try /处理创建文件时可能出现的异常/如果两个文件不存在则创建这2个文件ff.createNewFile();f.createNewFile(); catch (IOException e) /捕获异常e.printStackTrace();System.out.println(ff.canRead();/ff所指向的这个文件是否可读?System.out.println(ff.canWrite();/ ff所指向的这个文件是否可写入?System.out.println(ff.exists();/ ff所指向的这个文件是否存在?System.out.println(ff.getPath();/输出ff对象的路径名System.out.println(ff.isHidden();/ff所指向的文件是否为隐藏文件?System.out.println(ff.isFile();/ff这个对象是一个文件吗?System.out.println(f1.mkdir();/f1这个对象路径创建成功了吗?System.out.println(ff.isDirectory();/ff这个对象是目录吗?System.out.println(ff.lastModified();/ff所指向的这个文件的最后修改时间System.out.println(ff.length();/ff所指向的这个文件的大小是多少System.out.println(ff.delete();/删除ff所指向的文件是否成功System.out.println(f.renameTo(f1);/是否成功的将f所指向的文件重命名为f1System.out.println(f.toString();/以字符串的形式将f对象返回在eclipse中测试一下结果:第二节 怎么样将一个创建好的文件写入一些内容import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintStream;/导入java.io包中的FileOutputStream 、IOException 、PrintStreampublic class Output /创建名叫Output的类public void write(String filename)/创建一个带有参数的无返回值的方法write/目的是将形参中所代表的路径名文件写入一些内容FileOutputStream fs=null;PrintStream ps=null;/分别创建两个FileOutputStream、 PrintStream对象fs 和ps。/将它们初始化为nulltry /处理在写入文件时可能出现的异常fs=new FileOutputStream(filename);/将fs的引用指向用该方法形参作为构造方法参数的FileOutputStream对象ps=new PrintStream(fs);/将ps的引用指向用fs作为构造方法参数的PrintStream对象ps.println("1234567890123");/调用ps对象中的println方法,将字符串"1234567890123"写入到文件中System.out.println("文件写入成功");/如果没有出现异常,输出 文件写入成功。 catch (Exception e) /捕获异常e.printStackTrace();finally/无论是否写入成功,都应该将fs和ps所指向的文件关闭try if(ps!=null)ps.close(); catch (Exception e1) e1.printStackTrace();try if(fs!=null)fs.close(); catch (IOException e1) e1.printStackTrace();在eclipse中测试一下第三节 怎么样读取一个文件的内容import java.io.File;import java.io.FileInputStream;import java.io.IOException;/导入java.io包中的File、FileInputStream 、IOExceptionpublic class In /创建名叫In的类public String fun(String a)/创建带有参数的,返回值类型为String的方法fun/其中形参a是字符串形式的文件路径/该方法返回的是形参路径所指向的文件内容File ff=new File(a);/创建用形参作为构造方法参数的File类型的对象ffFileInputStream fs=null;/创建FileInputStream对象fs,并初始化为nullbyte bb=new byte2;/创建byte型的数组bb,并指定长度为2,指定了每次读取的字符数String con=""/创建一个String类型的变量con,用来储存读取文件的内容int n=0;/定义一个局部变量。初始化为0try/处理在读取文件中可能存在的异常fs=new FileInputStream(ff);/将fs的引用指向用该方法形参作为构造方法参数的FileInputStream对象while(n!=-1)/以是否读到文件尾为判断条件,进行while循环if(n!=0)/如果n不等于0,将读取bb数组中的n个字符/并将其内容放入到temp临时字符串中String temp=new String(bb,0,n);/将内容累加到con中con+=temp;n=fs.read(bb);/用fs对象调用read方法将读取出的字符个数赋给ncatch(Exception e)/捕获异常e.printStackTrace();finally/无论是否出现异常都应该将文件关闭try /处理关闭文件时产生的异常 fs.close(); catch (IOException e1) /捕获IOException异常e1.printStackTrace();return con;/返回调用该方法所读取的文件内容我们在eclipse中测试一下,测试码如图:第四节 利用前两个程序中的方法拷贝一个文件import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/导入java.io包中的File、FileInputStream、FileOutputStream、IOException类 public class CopyFile /创建CopyFile类public void copy(String srcName, String desName) /创建copy方法,其形式参数分别为源文件和目的文件 File src = new File(srcName); File des = new File(desName);/分别由两个形参作为File构造方法的参数,创建两个File对象src和des FileInputStream fis = null; FileOutputStream fos = null;/分别声明FileInputStream、FileOutputStream的对象fis和fos,并将其初始化为null try /处理在文件copy的时候所产生的异常 des.createNewFile();/创建形参des所指的目的文件 fis = new FileInputStream(src); fos = new FileOutputStream(des);/分别创建FileInputStream、FileOutputStream的对象fis和fos int n=0;/定义整形变量n,初始化为0 byte buf = new byte2;/创建byte型的数组bb,并指定长度为2,指定了每次读取的字符数 while(n = fis.read(buf) != -1) /调用fis的read方法读取源文件,并将其读取的字符数量赋给n/定义循环条件为n!=-1(未读到文件尾) fos.write(buf,0,n);/将每次读取的内容写入到目的文件中 catch(Exception e) /捕获异常 e.printStackTrace(); finally /为了安全起见,分别处理在文件关闭时的异常 try if(fos!=null)fos.flush(); catch (IOException e1) e1.printStackTrace(); try if(fos!=null)fos.close(); catch (IOException e2) e2.printStackTrace(); try if(fis!=null)fis.close(); catch (IOException e3) e3.printStackTrace(); System.out.println("文件copy成功"); 在eclipse中测试,测试码如下图:第十五章 2007年6月20日 星期三授课教师:学生: 第一节 与文件操作相关的一些程序实例一、实现FilenameFilter接口来过滤符合某些条件的文件或目录。import java.io.File;import java.io.FilenameFilter;/导入java.io包中的File类和FilenameFilter接口public class JavaFilter implements FilenameFilter/创建JavaFilter类实现FilenameFilter接口public boolean accept(File dir,String name)/重写接口中的accept方法,以实现FilenameFilter接口return name.endsWith(".java");/返回一以".java"结尾字符串在eclipse中测试:二、读取properties类型文件的内容:properties类型文件叫属性文件,其中的内容不要写中文,否则会读出乱码,它的作用是实现程序和程序之间、程序和服务器之间的信息交换。由于properties类型文件通常存放的是一些服务器的IP地址,或者存放程序实现所必须的目录或文件,所以可以利用文件返回的字符串来使维护程序更加方便。下面举一个读取properties类型文件的内容的程序。我们首先在硬盘上创建一个test. properties.用记事本打开写入内容如下图其中url和name叫做标记,后面的部分叫内容import java.io.File;import java.io.FileInputStream;import java.util.Properties;/导入java.io包中的File和FileInputStream类/导入java.util中的Properties类public class ReadPro /创建ReadPro类 public String url = "" public String name = "" /定义.properties类型文件中的内容标记url和 name作为数据成员,初始化它们为""public ReadPro() /在构造方法中完成读取.propertie文件的操作/使其创建该类对象时就已经将.propertie文件的内容赋给该类的成员变量 try /处理在读取文件中可能出现的异常 Properties props = new Properties(); /创建Properties类的对象 File f = new File("d:/Test/test. properties"); /用.propertie文件路径作为参数的构造方法创建File类对象f FileInputStream in = new FileInputStream(f);/将f作为FileInputStream构造方法的参数创建其对象in props.load(in);/将in作为参数用对象props调用Properties中的方法load/将文件读取出来 in.close(); /关闭该文件 url = props.getProperty("url"); name=props.getProperty("name");/用Properties类中的getProperty方法将标记作为参数,分别返回给数据成员 catch(Exception e) /捕获异常 e.printStackTrace(); 我们在eclipse中测试。测试码见下图:第三节 线程一、基本概念:1、进程:通俗来讲就是指正在被cpu执行的代码叫进程。2、线程:等待被cpu执行的代码叫线程。3、多线程:指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。 由于cpu采用分时复用,每个线程都有机会得到执行,每个都执行1ms,我们看起来就像是同时执行。二、创建线程:线程的所有活动都是通过线程的run()方法来实现的。在一个线程被建立并初始化以后, Java 的运行时系统就自动调用 run()方法,正是通过 run()方法才使得建立线程的目的得以实现。线程开始执行时,从它的 run ()方法中执行,这种方法是定义的线程的执行起点,就像应用程序从 main()开始一样。通常, run()方法是一个循环,例如一个播放动画的线程要循环显示一系列图片。有时, run() 方法会执行一个时间较长的操作,例如下载并播放电影。有两种方法可以构造自己的 run() 方法。下面我们将通过两个例子来分别说明。1、通过继承创建线程定义一个线程类,它继承线程类 Thread 并重写其中的方法 run ( ) ,由于 Java 只支持单继承,用这种方法定义的类不能再继承其他父类。启动时调用start方法。举例说明public class X1 extends Thread /创建类X1,继承Thread类int i=1;/定义整型变量i,初始化值为1public void run()/重写run方法while(i>0)System.out.println("X1的 "+i+);try /处理在线程sleep时所产生的异常X1.sleep(1000L);/为了测试时能看清楚,调用Thread类中的sleep方法/每秒输出一个数字 catch (InterruptedException e) /捕获异常e.printStackTrace();测试码如图:2、提供一个实现接口 Runnable 的类作为一个线程的目标对象,在初始化一个Thread 类或者 Thread 子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体 run ( )。这时,实现接口 Runnable 的类仍然可以继承其他父类。举例说明:public class X2 implements Runnable/创建X2类,实现Runnable接口int i=1;public void run()/重写run方法以实现Runnable接口while(i>0)System.out.println("X2的 "+i+);try Thread.sleep(1000L); catch (InterruptedException e) / TODO 自动生成 catch 块e.printStackTrace();测试码入图:3、两种方法的比较 (1)直接继承线程 Thread 类。不能再从其他类继承,编写简单,可以直接操作线程。 (2)通过实现 Runnable 接口实现线程。可以将 CPU 、代码和数据分开,形成清晰的模型;还可以继承其他类;保持程序风格的一致性和良好的扩展性。在具体应用中,采用哪种方法来构造线程体要视情况而定。通常,当一个线程已继承了另一个类时,就只能用第二种方法来构造,即实现Runnable 接口。三、线程的状态:1、创建状态(new Thread() 当一个线程处于创建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。2、可运行状态( Runnable ) 当一个线程处于可运行状态时,系统为这个线程分配了它所需的系统资源,安排其运行并调用线程运行方法,这样就使得该线程处于可运行( Runnable )状态。3、运行中状态( Running ) 当一个线程处于可运行状态时,系统为这个线程分配了它所需的系统资源, Java 的运行系统选中一个可运行状态的线程,该线程占有 CPU 并转为运行中状态。4、不可运行状态( Not Runnable ) 不可运行状态也称为阻塞状态( Blocked )。由于某种原因(输入输出、等待消息或其他阻塞情况),系统不能执行线程的状态。这时即使处理器空闲,也不能执行该线程。5、死亡状态( Dead ) 线程执行结束的状态。存在两种情况:自然撤消或是被停止。四、线程控制:1、设置线程的优先级用Thread类中的setPriorty方法;例如:Thread.setPriorty(10);其中的参数10是设置为最高优先级,1是最低优先级。注意:要在线程启动前设置优先级。2、停止一个线程:一种方法是直接调用stop方法,但这不可靠,sun公司的文档写明不推荐的方法。另外一种就是自己写个方法,让线程该停止的时候调用该方法。例如:可在例一中添加fun方法:public class X1 extends Thread int i=1;public void run()while(i>0)System.out.println("X1的 "+i+);try X1.sleep(1000L); catch (InterruptedException e) / TODO 自动生成 catch 块e.printStackTrace();public void fun()i=-1;System.out.println("X1 is Dead");测试码入图:3、启动多个线程:在下图中,我们虽然设置它们同样的sleep时间,但是还是显示出了不规律性,当多个线程都有机会执行时,cpu想执行哪个要靠它的心情决定。表现出来的随机性,我们是无能为力的。4、当两个线程同时对一个数据进行操作时,例如、一个线程向数组中写数字,另外一个输出,那么有可能出现还没有写入的时候就被输出了。当我们不知道什么时间控制其停止的时候可以使用join方法。join方法是等待一个线程执行完毕。public class Join /创建Join类,用来测试join方法int a=new int 10;/定义一个int型的数组a,其长度为10public static void main(String args) /创建main方法,作为程序入口 Join a=new Join();a.fun();/调用fun()方法,启动内部类中的线程,为数组a初始化。for(int i=0;i<10;i+) System.out.println("ai= *"+a.ai); /输出数组a的各个元素值public void fun()/创建fun方法XXX b=new XXX();/创建内部类对象bThread th=new Thread(b);th.start();/启动线程try /调用join方法,使该线程结束再处理main方法th.join(); catch (InterruptedException e) / TODO 自动生成 catch 块e.printStackTrace();class XXX implements Runnable/创建内部类XXX实现Runnable接口public void run()/重写run方法实现Runnable接口for(int i=0;i<10;i+)/初始化数组a,并输出ai=i;System.out.println("ai= "+ai);输出结果入下图:5、线程死锁如果程序中多个线程互相等待对方资源,而在得到对方资源前都不会释放自己的资源,这就造成都想得到资源而又都得不到,线程不能继续前进,这就是死锁问题。注意:使用线程的程序运行的结果是不可靠的,每个机器不同,结果也会有所差异。先启动的不一定先执行,尽管给它设置了最高的优先级。一但出问题了,调试也不好调。第十六章 2007年6月21日 星期四授课教师:学生: 第一节 计算机之间的通信计算机之间的通信类似于邮信和收信的过程,计算机往网线(socket)里写,写到套接字里去了。Socket与ServerSocketIp相当于主机号码,分机相当与端口号(065535)。注意:01024最好不要使用。举例说明:import java.io.PrintStream;import .InetAddress;import .ServerSocket;import .Socket;/* * author Administrator * * 向单个客户端写入消息 * * 测试方法:开始/运行 输入:telnet ,点击确定l * 在Microsoft Telnet>后面输入 open 127.0.0.1 1234 回车 */public class TestServerSocket1 public static void main(String args) throws Exception /安装电话分机 ServerSocket server = new ServerSocket(1234); System.out.println("Server is listening."); /秘书守侯电话 Socket sock = server.accept(); server.close(); /发出指示 PrintStream ps = new PrintStream(sock.getOutputStream();