现在的位置: 首页 > 综合 > 正文

【Java】Java学习笔记总结(二)

2013年09月03日 ⁄ 综合 ⁄ 共 10828字 ⁄ 字号 评论关闭
文章目录

2013-07-22

1. AWTSwing的区别,如何设置look and feel?如何往JFrame添加组件。

答:AWT 是抽象窗口组件工具包,是 java 最早的用于编写图形节目应用程序的开发包。
Swing 是为了解决 AWT 存在的问题而新开发的包,它以 AWT 为基础的。

设置look and feel

try{
    UIManager.setLookAndFeel(外观名称);
   }catch(Exception e){}

方法setLookAndFeel的一些参数:

UIManager.getCrossPlatformLookAndFeelClassName()

--Java的界面外观所有平台均一致.

UIManager.getSystemLookAndFeelClassName()

--指定为当前平台的界面外观.32Windows平台Windows界面外观Mac OS平台Mac OS界面外观Sun平台CDE/Motif界面外观.

"javax.swing.plaf.metal.MetalLookAndFeel"

--指定为Java的界面外观也就是方法UIManager.getCrossPlatformLookAndFeelClassName()的返回值.

"com.sun.java.swing.plaf.windows.WindowsLookAndFeel"

--指定为Windows的界面外观仅在Windows平台起作用.

"com.sun.java.swing.plaf.motif.MotifLookAndFeel"

--指定为CDE/Motif的界面外观可以在所有平台起作用.

"javax.swing.plaf.mac.MacLookAndFeel"

--指定为Mac OS的界面外观仅在Mac OS平台起作用

 Swing 程序用JFrame 对象实现了它们的窗口。JFrame 类是AWT Frame 类的一个子类。它还加入了一些Swing 所独有的特性。与 Frame 的使用十分相似。唯一的区别在于,不能将组件加入到JFrame中。可以或者将组件加入到JFrame content pane(内容面板中,或者提供一个新的content pane(内容面板)

JFrame添加组件有两种方式:
  1)用 getContentPane ()方法获得JFrame的内容面板,再对其加入组件:frame. getContentPane ().add(childComponent)
  2)建立一个JpanelJDesktopPane之类的中间容器,把组件添加到容器中,用setContentPane()方法把该容器置为JFrame的内容面板:
    JPanel contentPane = new JPanel();
    ……//把其它组件添加到Jpanel;
    frame.setContentPane(contentPane);
    //contentPane对象设置成为frame的内容面板 

2. 说出常用的几个布局管理器和其特点。

答:常用的几个布局管理器和其特点:

------特点 
java.awt ---CardLayout--- 将组件象卡片一样放置在容器中,在某一时刻只有一个组件可见。 
java.awt--- FlowLayout--- 将组件按从左到右而后从上到下的顺序依次排列,一行不能放完则折到下一行继续放置。 
java.awt ---GridLayout ---形似一个无框线的表格,每个单元格中放一个组件。 
java.awt ---BorderLayout ---将组件按东、南、西、北、中五个区域放置,每个方向最多只能放置一个组件。 
java.awt--- GridBagLayout--- 非常灵活,可指定组件放置的具体位置及占用单元格数目。 

3. FrameDialog默认的布局管理器是什么,Panel的又是什么?

答:Frame默认的布局管理器是:BorderLayout

Dialog默认的布局管理器是:BorderLayout

Panel默认的布局管理器是:FlowLayout

2013-07-23

IO写入和复制文件

//package com.app;

import java.io.*;

public class Test_IODemo {
	public static void main(String[] args) {
		ForFileWriter("用FileWriter写入文件", "以FileWriter写入.txt");
		ForBufferedWriter("用BufferedWriter写入文件", "以BufferedWriter写入.txt");
		FileCopy1("我.txt", "字符流复制.txt");
		FileCopy2("我.txt", "字节流复制.txt");
		FileCopy3("我.txt", "处理流复制.txt");
	}
	//用FileWriter写入文件
	public  static void ForFileWriter(String string,String fileName) {
		File file = new File(fileName);
		try {
			FileWriter fWriter = new FileWriter(file);
			fWriter.write(string);
			fWriter.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	//用BufferedWriter写入文件
	public static void ForBufferedWriter(String string,String desFile) {
		BufferedWriter bWriter = null;
		try {
			bWriter = new BufferedWriter(new FileWriter(new File(desFile)));
			bWriter.write(string.toString());
			bWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//字符流复制
	public static void FileCopy1(String readfile,String writeFile) {
		try {
			FileReader input = new FileReader(readfile);
			FileWriter output = new FileWriter(writeFile);
			int read = input.read();		
			while ( read != -1 ) {
				output.write(read);	
				read = input.read();
			}			
			input.close();
			output.close();
		} catch (IOException e) {
			System.out.println(e);
		}
	}
	//字节流复制
	public static void FileCopy2(String readfile,String writeFile) {
		try {
			FileInputStream input = new FileInputStream(readfile);
			FileOutputStream output = new FileOutputStream(writeFile);
			int read = input.read();		
			while ( read != -1 ) {
				output.write(read);	
				read = input.read();
			}			
			input.close();
			output.close();
		} catch (IOException e) {
			System.out.println(e);
		}
	}
	//处理流复制
	public static void FileCopy3(String readfile,String writeFile) {
		BufferedReader bReader = null;
		BufferedWriter bWriter = null;
		String line = null; 
		try {
			bReader = new BufferedReader(new FileReader(new File(readfile)));
			bWriter = new BufferedWriter(new FileWriter(new File(writeFile)));
			while ((line = bReader.readLine())!=null) {
				bWriter.write(line);
				bWriter.newLine();
			}
			bWriter.close();
			bReader.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

2013-07-24

1. 使用SwingIO设计一个记事本程序。

答:java文件见Test_Notepad.java

http://blog.csdn.net/jueblog/article/details/9457517

可执行文件见notepad.exe

2. 什么是对象序列化和反序列化?说一下具体实现的核心代码;Serializable接口有什么作用。

答:把Java对象转换为字节序列的过程称为对象的序列化。
  把字节序列恢复为Java对象的过程称为对象的反序列化。
  对象的序列化主要有两种用途:
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  2) 在网络上传送对象的字节序列。

对象序列化:

  	public static void ser(Person p, String fileName){
  		ObjectOutputStream oos = null;
  		try {
  			oos = new ObjectOutputStream(new FileOutputStream(new File(fileName)));
  			oos.writeObject(p);
  		} catch (Exception e) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  	}

对象的反序列化:

	public static void unSer(String fileName){
		try {
			ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(fileName)));
			Person p = (Person)ois.readObject();
			System.out.println(p.getAge() + p.getName());
			} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

3. 给定一个目录,输出其中的子目录或者文件名。

答:Java文件见 Text_IO_File.java

import java.io.*;

//给定一个目录,输出其中的子目录或者文件名。
//并按条件筛选输出含有指定字符串的文件

public class Text_IO_File {
	public static void main(String[] args) {
		File directory = new File("");
		String pathString = null;
		try{
		    pathString = directory.getCanonicalPath();//获取标准的路径
		}catch(Exception e){}
		System.out.println("当前目录下的所有文件:");
		FileTest_List(pathString);
		System.out.println("当前目录下的所有Java文件:");
		FileTest_List_Choice(pathString, ".java");
	}
	//返回路径名下目录中的文件和目录。
	public static void FileTest_List(String fileName) {
		try {
			File f=new File(fileName);
			String[] arrStrings = f.list();
			for(String string : arrStrings){
				System.out.println(string);
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	//返回路径名下目录中含choice的文件名
	public static void FileTest_List_Choice(String fileName,final String choice) {
		try {
			File f=new File(fileName);
			String[] arrStrings = f.list(new FilenameFilter() {
				@Override
				public boolean accept(File dir, String name) {
					// TODO Auto-generated method stub
					return name.indexOf(choice) != -1;
				}
			});
			for(String string : arrStrings){
				System.out.println(string);
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

4. 编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。

答: Java文件见 Test_Merge.java

//package com.app;

import java.io.*;

public class Test_Merge {
	public static void main(String[] args) {
		WordMarge("Word1.txt", "Word2.txt", "WordMarge.txt");
	}
	//将readfile1文件中的单词与readfile2文件中的单词交替合并到writeFile文件中
	public static void WordMarge(String readfile1,String readfile2,String writeFile) {  
	    BufferedReader bReader1 = null;  
	    BufferedReader bReader2 = null;  
	    BufferedWriter bWriter = null;  
	    String line1 = null;   
	    String line2 = null;   
	    try {  
	        bReader1 = new BufferedReader(new FileReader(new File(readfile1))); 
	        bReader2 = new BufferedReader(new FileReader(new File(readfile2))); 
	        bWriter = new BufferedWriter(new FileWriter(new File(writeFile)));  
	        while ((line1 = bReader1.readLine())!=null | (line2 = bReader2.readLine())!=null) {
		        if(line1 != null) {  
		            bWriter.write(line1);  
		            bWriter.newLine();  
		        }  
		        if(line2 !=null) {  
		            bWriter.write(line2);  
		            bWriter.newLine();  
		        }
			}
	        bWriter.close();  
	        bReader1.close();  
	        bReader2.close();  
	    } catch (Exception e) {  
	        // TODO: handle exception  
	        e.printStackTrace();  
	    }  
	}  
}

2013-07-25

线程的同步

//1package com.app;
/**
 * Java线程:线程的同步
 */

import java.util.concurrent.*;

public class Test0725_Thread_Syn4 {
	public static void main(String[] args) {
		final ExecutorService exec = Executors.newFixedThreadPool(1);
		Callable<String> call = new Callable<String>() {
			public String call() throws Exception {
				// 开始执行耗时操作
				int cash = 300;
				String name = "张三";
				System.out.println(name + "现在有" + cash + "元存款");
				User u = new User(name, cash);
				String[] arr = { "线程A", "线程B", "线程C", "线程D", "线程E", "线程F",
						"线程G", "线程H", "线程I", "线程J" };
				for (int i = 0; i < 10; i++) {
					MyThread th = new MyThread(arr[i], u,
							(int) (Math.random() * 1000 - 500));
					th.start();
				}
				Thread.sleep(1000 * 5);
				return "线程执行完成.";
			}
		};
		try {
			Future<String> future = exec.submit(call);
			String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); // 任务处理超时时间设为1 秒
			System.out.println("任务成功返回:" + obj);
		} catch (TimeoutException ex) {
			System.out.println("\n处理超时啦....");
			System.exit(0);
		} catch (Exception e) {
			System.out.println("处理失败.");
			e.printStackTrace();
		}   
		try {    
			Future<String> future = exec.submit(call);    
			String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); //任务处理超时时间设为 1 秒    
			System.out.println("任务成功返回:" + obj);    
        } catch (TimeoutException ex) {    
			System.out.println("处理超时啦....");    
			ex.printStackTrace();    
        } catch (Exception e) {    
			System.out.println("处理失败.");    
			e.printStackTrace();    
        }
		 exec.shutdown();     // 关闭线程池 
		 /*		int cash2 = 100;
		String name2 = "李四";
		System.out.println(name2 + "现在有" + cash2 + "元存款");
		User u2 = new User(name, cash);
		String[] arr2 = {"线程A","线程B","线程C","线程D","线程E","线程F"};
		for (int i = 0; i < 6; i++) {
			MyThread th2 = new MyThread(name2+arr2[i], u2, (int)(Math.random()*1000-500));
			th2.start();
		}*/
	}
}
class MyThread extends Thread {
	private User u;
	private int x = 0;
	MyThread(String name, User u, int x) {
		super(name);
		this.u = u;
		this.x = x;
	}
	public void run() {
		u.oper(x);
	}
}
class User {
	private String code;
	private int cash;
	private int time = 0;
	User(String code, int cash) {
		this.code = code;
		this.cash = cash;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public int getCash() {
		return cash;
	}
	public void setCode(int cash) {
		this.cash = cash;
	}
	/**
	 * 业务方法
	 *            添加x万元
	 */
	public synchronized void oper(int x) {
		if ((this.cash +x >= 1000) && x > 0 ) {
			System.out.println(Thread.currentThread().getName() + "暂停!"+"当前账户余额为:" + this.cash + ",您还想存" +x + ",太多了!");
			try {
				Thread.yield();
		//		Thread.sleep(100);
				this.wait();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}else if (this.cash + x <0) {
			System.out.println(Thread.currentThread().getName() + "暂停!"+"当前账户余额为:" + this.cash + ",小于所取额 " +x +",余额不足!");
			try {
				Thread.yield();
		//		Thread.sleep(100);
				this.wait();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		 if(this.cash < 1000 && this.cash > 0 && (this.cash + x >= 0) && (this.cash + x <= 1000)){
				this.cash += x;
				System.out.println(Thread.currentThread().getName() + "运行结束,增加“ "
						+ x + " ”,当前用户账户余额为:" + this.cash);
				time++;
				this.notifyAll();
		}
		this.notifyAll();
	}
	@Override
	public String toString() {
		return "User{" + "code='" + code + '\'' + ", cash=" + cash + '}';
	}
}

2013-07-26

1. 同步有几种实现方法。

答:Java的同步可以用synchronized关键字来实现。
主要有两种方法:
sychronized同步代码,需要绑定一个对象,如synchronized(obj){}
sychronized同步一个方法,是对方法进行线程同步。如public void synchronized methodA(){}

2. 线程的基本状态(生命周期)

答:java中,每个线程都需经历创建、就绪、运行、阻塞和终止五种状态,线程从创建到终止的状态变化称为生命周期。

new运算符和Thread类或其子类建立一个线程对象后,该线程就处于创建状态。

创建--->就绪:通过调用start()方法

就绪--->运行:处于就绪状态的线程一旦得到CPU,就进入运行状态并自动调用自己的run()方法

运行--->阻塞:处于运行状态的线程,执行sleep()方法,或等待I/O设备资源,让出CPU并暂时中止自己运行,进入阻塞状态

阻塞--->就绪:睡眠时间已到,或等待的I/O设备空闲下来,线程便进入就绪状态,重新到就绪队列中等待CPU。当再次获得CPU时,便从原来中止位置开始继续运行。

运行--->终止:(1)(正常情况下)线程任务完成
                 (2)(非正常状况)线程被强制性的中止,如通过执行stop()destroy()方法来终止一个线程

3. 简述synchronized和java.util.concurrent.locks.Lock的异同。

答:主要相同点:

  Lock能完成synchronized所实现的所有功能。

主要不同点:

1)Lock有比synchronized更精确的线程语义和更好的性能。

2)synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

4. 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。

答:Java代码见ThreadTest.java

//package com.app;


public class ThreadTest {
	static int t = 10;
	static final int TIME = 5;
	public static void main(String[] args) {
		ThreadTest test = new ThreadTest();
		
		AddTest thread1 = test.new AddTest();
		MinusTest thread2 = test.new MinusTest();
		for (int i = 0; i < 2; i++) {
			new Thread(thread1).start();
			new Thread(thread2).start();
		}
	}
	
	private synchronized void Add() {
		t++;
		System.out.println(Thread.currentThread().getName() + "--加法--" +t);
	}
	class AddTest implements Runnable{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			for (int i = 0; i < TIME; i++) {
				Add();
			}
		}
	}
	
	private synchronized void Minus() {
		t--;
		System.out.println(Thread.currentThread().getName() + "--减法--" +t);
	}
	class MinusTest implements Runnable{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			for (int i = 0; i < TIME; i++) {
				Minus();
			}
		}
	}
}

抱歉!评论已关闭.