java编程笔记.doc_第1页
java编程笔记.doc_第2页
java编程笔记.doc_第3页
java编程笔记.doc_第4页
java编程笔记.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、多线程1二、集合6三、其它类16四、IO流17五、 图形界面编程(GUI)26六、 网络编程27Java学习笔记一、多线程a) 创建线程:第一种方法:通过继承Thread类,覆盖父类的run方法;在调用线程时,只需要调用线程的start方法即可,调用后自动调用run方法。Class ThreadDemo extends ThreadPublic void run()System.out.println(“Thread run”);Class ThreadDemoTestPublic static void main(String args)ThreadDemo t1 = new ThreadDemo(); /创建线程T1.start();/运行线程System.out.println(“hello world”);在运行线程时通过调用start方法与调用run方法的区别:调用run方法:程序会先执行run方法里面的内容,只有执行完后才继续下面的内容。调用start方法:这样就与主函数构成一个多线程,会交替执行。线程里的几种方法:1、 getName();-得到该线程的名字(每个线程都有一个默认的名字:thread-n,n从0开始)2、 static Thread currentThread();-获取当前线程对象3、 可以通过setName()或者构造函数传递名字Class Test extends ThreadTest(String name)Super(name);/调用父类Thread的带一个参数构造函数为线程命名Public void run()System.out.println(Thread.currentThread().getName()+”-thread run-”);Class ThreadTestPublic static void main(String args)Test t = new Test(“one-”);t.start();/也可以通过t.setName(“one-”);给线程命名,这样就不需要构造函数System.out.println(“hello world”);第二种方法:编辑类,实现Runnable接口,实现其run方法,通过Thread类创建线程对象,将Runnable接口的实现类作为参数传递给Thread的构造方法,然后调用Thread的start方法开启线程,并调用Runnable实现类的run方法。Class RunnableDemo implements RunnablePublic void run()System.out.println(“我是通过接口实现的线程”);Class RunnableDemoTestPublic static void main(String args)RunnableDemo r = new RunnableDemo();Thread t = new Thread(r);t.Start();System.out.println(“hello world”);这两种方法的区别:通过实现Runnable接口方法可以避免单继承的局限性,这是比较推荐的方法。关于线程安全问题:当有多个线程时,一定要注意安全问题。问题原因所在:当多条语句在操作同一线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程就参与进来。导致共享数据的错误。解决办法:对多条操作共享数据的语句,只能让一个线程执行完,在执行过程中,其他线程不能参与。Java中解决办法:同步代码块Synchronized(对象)需要被同步的代码对象如同一把锁,持有锁的线程才能执行同步语句块。没有持有锁的线程即使获得CPU的执行权,也进不去。弊端:每个线程都需要判断锁,消耗了资源。使用该方法的两个前提:1、 必须是多线程的;2、 必须是使用的一把锁。在一个多线程中如何找安全问题:1、 明确哪些代码是多线程运行代码;2、 明确共享数据;3、 明确多线程运行代码中,哪些语句是操作共享数据的。 同步函数:可以将需要同步的代码块取出来,封装在一个函数里面。这样的函数就叫做同步函数。 例如 Public synchronized void 函数名()需要封装的同步语句块然后只需要调用该函数就可以了。 同步函数使用的锁是this.静态同步函数使用的锁是该方法对应类的字节码文件类名.class.设计模式:单例设计模式(保证一个类在内存中的唯一性)饿汉式:(single类一进内存就完成类的创建)Class SinglePrivate static single()/将构造函数私有化Private static Single s = new Single();/创建一个本类对象Public static Single getInstance()/创建一个公有方法,调用该类。Return s;Class SingleDemoPublic static void main(String args)Single s1 = Single.getInstance();Single s2 = Single.getInstance();/s1和s2 操作的是同一个对象。/如果用类名直接调用方法,则该方法必须声明为static,静态方法必须访问静态成员。懒汉式:(对象是在调用函数时创建的,延迟了类的加载)Class SinglePrivate static Single();Private static Single s = null;Public static Single getInstance()If(s=null)Synchronized(Single.class)If(s=null)S = new Single();Return s;红色字体代码是为了解决懒汉式的安全问题的。利用多线程的安全机制,将共同的代码块用锁锁住,这样就可以避免安全隐患。在开发的时候用饿汉式,这样避免了安全问题,代码也比较少。死锁问题:是因为共同代码块里面嵌套着共同代码块,这样就会产生死锁的问题。多线程中的等待机制:所需要的三个方法(wait();notify();notifyAll();)必须是公用一把锁,这样才能唤醒或者让某一线程等待。 锁.wait()-锁.notify();JDK1.5等待机制升级版:添加了新的包:java.util.concurrent.locks,这个包里面定义了相关接口(Lock和Condition)Lock里面的方法(lock();unlock();)替换了synchronized语句;Condition里面的方法(await();signal();signalAll();)替换了Object 监视器方法(wait、notify 和 notifyAll);另外可以支持多个相关的 Condition 对象,使得更方便的等待或者唤醒线程。private Lock lock = new ReentrantLock();private Condition condition_pro = lock.newCondition();private Condition condition_cum = lock.newCondition();public void set(String name) throws InterruptedExceptionlock.lock();trywhile(flag)condition_pro.await(); = name+-+count+;System.out.println(Thread.currentThread().getName()+.生产者.+);flag = true;condition_cum.signal();finallylock.unlock();红色字体的代码就是升级版的处理方式;(相关文件在:E:/java练习/PCDemo2.java.)停止线程:(stop()方法已经过时)如何停止线程?只有一种方法,就是让run方法结束。一般run方法都是循环,我们只要控制住循环条件,我们就可以让run方法停止,也就是线程停止。特殊情况:当线程都处于冻结状态时,就不会读取标记,那么线程就不会结束。当没有指定方式让冻结的线程恢复到运行状态时,我们就要对冻结状态的线程进行清除。Thread类提供了该方法interrupt();当调用interrupt()方法时,会获得一个interruptedException错误。守护线程:setDaemon();用于将线程转变为守护线程,在开启线程前调用。当正在运行的程序全部是守护线程时,java虚拟机自动退出。Join方法:当A线程执行到B线程的join方法时,A会等待B线程执行完之后再运行。可以用来临时加入线程执行。多线程的运用:当多段代码需要同时运行时,将它们封装起来。class ThreadTest public static void main(String args) new Thread()public void run()for(int x=0;x100;x+)System.out.println(.);.start();for(int x=0;x100;x+)System.out.println(.);Runnable r = new Runnable()public void run()for(int x=0;xstu.age)return 1;if(this.age=stu.age)return pareTo();return -1;泛型:JDK1.5以后出现的一种安全机制。import java.util.*;class FXDemo public static void main(String args) ArrayList al = new ArrayList();al.add(aaa);al.add(w);al.add(ee);al.add(qwe);Iterator it = al.iterator();while(it.hasNext()String s = it.next();System.out.println(s+.+s.length();泛型机制的出现,不仅使得程序安全了,而且省去了强制转型。泛型类:当类中要操作的引用类类型不确定时,就可以用到泛型类。例如:Class studentClass workerClass toolPrivate Q q;Public void setObject(Q q)This.q = q;Public Q getObject()Return q;Class DemoPublic static void main(String args)Tool t1 = new tool();T1.setObject(new student();Student s = t1.getObject();(泛型类定义的泛型是在整个类中的,假如方法想操作不同的对象时,必须new多个对象才可以实现,这时可以将泛型定义在方法中,也就是泛型方法)泛型方法:例如Class DemoPublic void show(T t)System.out.println(“show:”+t);Public void print(T t)System.out.println(“print:”+t);Class DemoTestPublic static void main(String args)Demo d = new Demo();d.show(“abc”);/这里传入的是字符串类型的d.print(new integer(8);/这里传入的是整数型的静态方法不能调用类上定义的泛型,如果它操作的类对象不确定,可以将泛型定义在静态方法上。Public static void main(String args)通配符?的用法:import java.util.*;class FXDemo5 public static void main(String args) ArrayList al = new ArrayList();al.add(abc1);al.add(abc2);printColl(al);ArrayList al1 = new ArrayList();al1.add(4);al1.add(7);printColl(al1);public static void printColl(ArrayList al)/为了提高代码的复用性,用?代替明确的类型Iterator it = al.iterator();while(it.hasNext()System.out.println(it.next();class Personprivate String name = null;public Person(String name) = name;public String getName()return name;class Student extends Personpublic Student(String name)super(name);import java.util.*;class FXDemo6 public static void main(String args) ArrayList al = new ArrayList();al.add(new Person(abc1);al.add(new Person(abc2);al.add(new Person(abc3);/printColl(al);ArrayList al1 = new ArrayList();al1.add(new Student(abc11);al1.add(new Student(abc22);al1.add(new Student(abc33);printColl(al1);public static void printColl(ArrayList al)Iterator it = al.iterator();while(it.hasNext()System.out.println(it.next().getName();? extends E可以接受E对象或者其子类对象Map集合:|- Hashtable底层是哈希表数据结构, 不可以存入null健null值,线程是同步的。|- HashMap底层是哈希表数据结构,可以存入null健null值,线程是不同步的。|- TreeMap底层是二叉树数据结构,线程不同步,可以对Map中的健进行排序。HashMap的用法。import java.util.*;class HashMapDemo public static void main(String args) Map map = new HashMap();map.put(01,zhangshan1);map.put(02,zhangshan2);map.put(03,zhangshan3);map.put(04,zhangshan4);/entrySet()方法的运用SetMap.Entry s = map.entrySet();/Map.Entry是Map接口里面的内部接口IteratorMap.Entry it = s.iterator();while(it.hasNext()Map.Entry me = it.next();String key = me.getKey();String value = me.getValue();System.out.println(key+:+value);/*keySet()方法的运用Set s = map.keySet();Iterator it = s.iterator();while(it.hasNext()String key = it.next();String value = map.get(key);System.out.println(key+:+value);*/基本方法的运用/System.out.println(containsKey:+map.containsKey(01);/System.out.println(containsValue:+map.containsValue(zhangshan1);/System.out.println(get:+map.get(01);/System.out.println(HashCode:+map.hashCode();/System.out.println(isEmpty:+map.isEmpty();/System.out.println(remove:+map.remove(01);/System.out.println(size:+map.size();/*Collection coll = map.values();Iterator it = coll.iterator();while(it.hasNext()String s = it.next();System.out.println(s:+s);*/集合框架的工具类collections其中有一个方法可以用来对List集合排序sort();Public static T extends Comparable void sort(List list);该方法用来对List集合进行自然排序,如果要进行其他的排序,则需要传一个比较器即可。Public static void sort(List list,Comparable c);因为sort是静态方法,所以可以直接有类名调用。Max()方法返回集合中的最大值,用法与sort()相似。Static Int binarySearch(List,key)方法返回key在List中的位置,如果不存在则返回key的插入点的负数减1(-插入点-1),假如List不具备比较性,则需要定义一个比较器。ReverseOrder();返回一个比较器,它强行逆转了实现了comparable接口对象的collection的自然顺序。如果里面加入一个自定义比较器做为参数,则逆转了自定义比较器的顺序。操作数组的工具类Arrays(相关方法可以查看文档)AsList():将指定数组转换成List集合。把数组变成集合的好处:可以用集合的思想和方法来操作数组中的元素。注意:变成集合后,不能使用集合的增删方法,因为数组的长度是固定的。如果数组中的元素都是对象,那么变成集合时,数组中的元素都自动变成集合中的元素。如果数组中的元素都是基本数据类型,那么会将这个数组做为集合中的元素存在。ToArray():将集合变成数组。(collection接口里面的方法)为了限定对元素的操作,就要将集合变成数组。String arr = al.toArray(new Stringal.size();高级for循环:格式:for(数据类型 变量名 : 被遍历的集合(collection)或者数组)只能获取集合元素,不能进行增删。For(String s : 集合)System.out.println(s);可变参数:可变参数在定义时一定要放在参数列表的最后面。Public static void show(String s,int arr)静态导入(staticImport)在使用的某些方法是某些类的静态方法时,比如arrays类里面的sort(),max(),等方法。我们一般调用语句为:Arrays.sort(),Arrays.max()为了简化,我们可以导入这些静态方法:import static java.util.Arrays.*;(导入Arrays里面所以的静态成员)当静态方法重名时,比如Object类里面的toString()和Arrays里面的toString(),在调用toString()方法时,我们一定要加入具体的类名。三、其它类d) System类类中的方法和属性都是静态的Out:标准输出;In: 标准输入,默认是键盘。获取系统信息属性:Properties getProperties(); 返回的是一个properties类,该类是HashTable的子类,也就是Map集合的子类,所以可以用集合的方法取出里面的值。该集合里面都是字符串,没有泛型。取出:For(Object obj : prop.keySet()String value = (String)prop.getValue(obj);System.out.println(obj+”:”+value);可以向系统里面添加我们自己的信息:System.setProperty(name,value);也可以取出特定的信息:String value = System.getProperty(name);可以在运行虚拟机时(运行class文件)动态加入系统信息:java D= (java文件名)e) Runtime类该类没有提供构造方法,不能new对象,里面提供了一个静态的方法用来得到本类对象,然后再调用里面其他的非静态方法,这个方法就是static Runtime getRuntime();(这以设计正好符合单例设计模式)Runtime里面的一个方法exec(String command);执行指定的字符串命令它可以返回一个Process进程对象,这个对象里面有一个destory();方法用来杀掉子进程。f) Date类:与时间相关的类。Date d = new Date();/直接new一个时间对象。System.out.println(d);/打印该时间,有结果可以看出打印出来的结果格式不理想,/所以需要调用其它方法对其进行格式化。/通过查找文档,可以用SimpleDateFormat类进行。在创建SimplemDateFormat对/象时将格式传递到其构造函数中。SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日”);String time = Sdf.format(d);System.out.println(“time=”+time);g) Calendar类:日历类。该类也是一个抽象类,不能new对象,但里面提供了可以得到本类对象的方法,所以可以用此方法创建对象,或者new其子对象。Calendar c = Calendar.getInstance();如果将c打印出来,里面包含了很多信息,我们可以通过get()方法得到这些信息。Get里面的参数全部是Calendar提供的静态字段。System.out.println(c.get(Calendar.YEAR)+”年”);Calendar里面的set方法可以用来设置时间,add方法可以用来对时间进行运算。h) Math类:数学相关的类。Math里面提供的都是静态的方法,可以直接通过类名去调用。Math.ceil(double d)返回大于等于d的最小整数。Math.floor(double d)返回小于等于d的最大整数。Math.round(double d)四舍五入。Math.pow(double a,double b)返回a的b次方。Math.Random()返回一个大于等于0下于10的伪随机数。我们也可以通过java.util.Random类得到随机数,并且可以调用其内部方法。四、IO流按照流的流向可以分为输入流和输出流按照操作的字符类型可分为字节流和字符流。Io流的四个基类(都是抽象的):InputStream OutPutStream Writer Reader创建文件:Writer类的一个子类FileWriter(用来操作文件的类)FileWriter fw = new FileWriter(“demo.txt”);/创建FileWriter对象,并且创建一个/demo.txt文件Fw.write(“abcdef”);/向文件中写入字符串,此字符串暂时放在流里面,还没有写入文件。Fw.flush();/刷新流的缓存区,将流里面的内容写入文件。Fw.close();/关闭流,关闭前会调用flush方法。关闭后不能再向里面写东西。IO里面的异常处理:import java.io.*;class FileWriterDemo2 public static void main(String args) FileWriter fw = null;/要在外面定义FileWriter,后面finally里面才能引用tryfw = new FileWriter(demo.txt);fw.write(aaaaa);catch (IOException e)System.out.println(e.toString();finallytryif(fw!=null)/这里对close也要进行一次异常处理。fw.close();/必须先判断fw不为空,否则当上面发/生异常时,此处会出现异常。catch (IOException e)System.out.println(e.toString();文件的续写:只需要在构造函数里面添加一个boolean的参数即可,为true则表示在文件末尾续写,为false则表示重新建立文件。另外,在WINDOWS里面记事本不能识别n,为了能够换行,我们用(rn)作为换行。读取文件:FileReader与写文件类似,Reader的一个子类FileReader用来读取文件。所需要的异常处理与写文件一样。Reader类里面用来读取文件的几个方法:Read(); 读取单个字符,返回的是这个字符对应的acsii值,多次调用时,它会接着读取后面的字符,如果读到文件末尾则返回-1。Read(char c); 读取一个字符数组,将读到的内容存在char中,返回的结果是读的字符个数,如果到文件末尾则返回-1;这个数组定义的长度一般为1024的整数倍。将一个文件拷贝到另一个文件里面例子见(E:java练习test2CopyTest.java)缓冲区:写缓冲区(BufferedWriter)、读缓冲区(BufferedReader)缓冲区的使用可以提高效率。写:FileWriter fw = new FileWriter(“buf.txt”);BufferedWriter bufw = new BufferedWriter(fw);For(int x=1;x5;x+)Bufw.write(“abc”+x);Bufw.flush();Bufw.close();/关闭缓冲区的同时会自动关闭fw,所以不用再写fw.close();读:FileReader fr = new FileReader(“buf.txt”);BufferedReader bufr = new BufferedReader(fr);String line = null;While(line = bufr.readLine()!=null)/readLine():读取一行的字符,当读到文件末尾时返回nullSystem.out.println(line);Bufr.close();利用缓冲区来实现文件的复制(E:java练习test2BufCopyTest.java)装饰设计模式:当想要对已有类的功能进行增强时,可以定义一个类,将这个类传递进来,基于已有的功能加强功能。自定义的这个类称为装饰类。装饰类通过利用构造函数接受被装饰的类。装饰类与被装饰类一定是一个体系里面的两个类,且装饰类要继承被装饰类。假如被继承类里面有抽象的方法,则装饰类需要实现这些方法。在类FileReader类中read()方法一次只能读一个字符,而在BufferedReader中readLine()方法可以读取一行字符串,所以这就是对功能的一种增强。装饰与继承的区别:装饰比继承要灵活,避免了集成体系的臃肿。BufferedReader类的一个子类LineNumberReader类:用于添加行号的类。里面有两个方法:setLineNumber();getLineNumber();FileReader fr = new FileReader(“demo.txt”);LineNumberReader lnr = new LineNumberReader(fr);String

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论