#
package com.sitinspring;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;



/** *//**
* 用匿名類實現(xiàn)排序的例子
* @author sitinspring(junglesong@gmail.com)
*
* @date 2007-12-7
*/

public class Main
{

public static void main(String[] args)
{
// 新建鏈表并加入元素
List<Member> members=new ArrayList<Member>();
members.add(new Member("Andy",20));
members.add(new Member("Dell",23));
members.add(new Member("Felex",24));
members.add(new Member("Bill",21));
members.add(new Member("Cindy",22));
// 創(chuàng)建一個比較器匿名類

Comparator comparator=new Comparator()
{

public int compare(Object op1,Object op2)
{
Member memberOp1=(Member)op1;
Member memberOp2=(Member)op2;
// 按姓名排序
return memberOp1.getName().compareTo(memberOp2.getName());
}
};
// 排序
Collections.sort(members,comparator);
// 輸出排序后的鏈表

for(Member member:members)
{
System.out.println(member);
}
}
}
摘要: 泛型類示例一:
package com.sitinpsring;
import java.util.ArrayList;
import java.util.List;
/** *//**
* 泛型類示例一,成員變量為鏈表,T可以指代任意類類型.
* @author sitinsprin...
閱讀全文
BigDecimal op1=new BigDecimal("3.14159");
BigDecimal op2=new BigDecimal("3");
System.out.println("和="+op1.add(op2));
System.out.println("差="+op1.subtract(op2));
System.out.println("積="+op1.multiply(op1));
System.out.println("商="+op1.divide(op2, BigDecimal.ROUND_UP));
System.out.println("負值="+op1.negate());
System.out.println("指定精度的商="+op1.divide(op2,15, BigDecimal.ROUND_UP));
輸出:
和=6.14159
差=0.14159
積=9.8695877281
商=1.04720
負值=-3.14159
指定精度的商=1.047196666666667
Date類內(nèi)部既不存儲年月日也不存儲時分秒,而是存儲一個從1970年1月1日0點0分0秒開始的毫秒數(shù),而真正有用的年月日時分秒毫秒都是從這個毫秒數(shù)轉化而來,這是它不容易被使用的地方,尤其是顯示和存儲的場合。但Date類的優(yōu)勢在于方便計算和比較。
另一點,日常生活中我們習慣用年月日時分秒這樣的文本日期來表示時間,它方便顯示和存儲,也容易理解,但不容易計算和比較。
綜上所述,我們在程序中進行日期時間處理時經(jīng)常需要在在文本日期和Date類之間進行轉換,為此我們需要借助java.text.SimpleDateFormat類來進行處理,下文列舉了它的幾個常用示例。
1.將Date轉化為常見的日期時間字符串
這里我們需要用到java.text.SimpleDateFormat類的format方法,其中可以指定年月日時分秒的模式字符串格式。
Date date = new Date();
Format formatter = new SimpleDateFormat("yyyy年MM月dd日HH時mm分ss秒");
System.out.println("轉化的時間等于="+formatter.format(date));
其中
yyyy表示四位數(shù)的年份
MM表示兩位數(shù)的月份
dd表示兩位數(shù)的日期
HH表示兩位數(shù)的小時
mm表示兩位數(shù)的分鐘
ss表示兩位數(shù)的秒鐘
2.將文本日期轉化為Date以方便比較
文本日期的優(yōu)勢在于便于記憶,容易處理,但缺點是不方便比較,這時我們需要借助SimpleDateFormat的parse方法得到Date對象再進行比較,實例如下:
String strDate1="2004年8月9日";
String strDate2="2004年10月5日";
SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy年MM月dd日");
java.util.Date date1 = myFormatter.parse(strDate1);
java.util.Date date2 = myFormatter.parse(strDate2);
// Date比較能得出正確結果
if(date2.compareTo(date1)>0){
System.out.println(strDate2+">"+strDate1);
}
// 字符串比較得不出正確結果
if(strDate2.compareTo(strDate1)>0){
System.out.println(strDate2+">"+strDate1);
}
3.將文本日期轉化為Date以方便計算
文本日期的另一個大問題是不方便計算,比如計算2008年1月9日的100天后是那一天就不容易,此時我們還是需要把文本日期轉化為Date進行計算,再把結果轉化為文本日期:
SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy年MM月dd日");
java.util.Date date = myFormatter.parse("2008年1月9日");
date.setDate(date.getDate()+100);
Format formatter = new SimpleDateFormat("yyyy年MM月dd日");
// 得到2008年04月18日
System.out.println("100天后為"+formatter.format(date));
實現(xiàn)類:
package com.sitinspring.view.panel;

import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


/** *//**
* 間隔色表格渲染類
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-1-10
*/

public class ColorTableCellRenderer extends DefaultTableCellRenderer
{
private static final long serialVersionUID = -3378036327580475639L;

public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,

int column)
{
// 得到渲染的單元格
Component cell =
super.getTableCellRendererComponent(
table,
value,
isSelected,
hasFocus,
row,
column);

// 進行渲染

if (hasFocus)
{
// 如果獲得焦點則設置背景色為紅色
cell.setBackground(Color.red);
//cell.setForeground(Color.black);

} else
{

if ((row % 2) == 0)
{
// 偶數(shù)行設置為白色
cell.setBackground(Color.white);

} else
{
// 奇數(shù)行設置為藍色
cell.setBackground(Color.cyan);
}
}
return cell;
}
}

package com.sitinspring.view.panel;

import java.awt.Color;
import java.awt.Component;
import java.util.regex.Pattern;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


/** *//**
* 大於37顯示紅色的表單元格
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-1-10
*/

public class AgeTableCellRenderer extends DefaultTableCellRenderer
{
private static final long serialVersionUID = -334535475639L;

public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,

int column)
{
// 得到單元格
Component cell =
super.getTableCellRendererComponent(
table,
value,
isSelected,
hasFocus,
row,
column);
// 先把所有單元格設置為白色
cell.setBackground(Color.white);
// 進行渲染

if (table.getColumnName(column).equals("年齡") )
{ // 如果列名等于“年齡”
// 取得單元格的文字
String strValue=(String)value;

if(Pattern.matches("\\d+", strValue))
{

if(Integer.parseInt(strValue)>37)
{
// 如果是數(shù)字且值大于37,將單元格背景設置為紅色
cell.setBackground(Color.red);
}
}
}
return cell;
}
}
什么是值傳遞?什么是引用傳遞?
值傳遞是將要傳遞的值作為一副本傳遞.如
int i=4;
int j=i;
這里相當于把14復制了一個副本給j,結果是i=4,j=4
引用傳遞,傳遞的是引用對象的內(nèi)存地址
int *p,*p1;
int j=5; *p=j; //這里是把j在內(nèi)存當中的地址賦給了指針p
p1=p; //這里是把指針p中保存的地址(就是j的地址)賦給了指針p1
j=4; //這里改變j的值 輸出結果是 j=4 , *p=4 , *p1=4 //因為p和p1指向的都是j 所以他們的值隨j值改變
(以上說明和代碼來自http://zhidao.baidu.com/question/31191252.html)
Java中函數(shù)參數(shù)的傳遞是值傳遞還是引用傳遞?
Java中參數(shù)傳遞時傳遞到函數(shù)中的參數(shù)都是原變量的一份拷貝,對于非類類型如int,float等,這份拷貝自然和原變量脫離了關系,這不難理解;
而對于類的實例而言,這份拷貝恰巧是實例引用的拷貝,它(參數(shù))指向的實例地址和原實例引用指向的實例地址都是一樣的,因此對參數(shù)的修改有時也會影響到實例本身,故此造成了Java傳遞類實例是傳遞的引用即地址的假象,如下面例子中的changeMemberField函數(shù),但是我們把參數(shù)指向的地址改到別的實例上時,如changeMember函數(shù),我們會發(fā)現(xiàn)參數(shù)和原實例引用再也不會發(fā)生關系了,這里證明Java中參數(shù)傳遞是完完全全是傳值而不是傳址。
例子代碼:
代碼:
package com.sitinspring;
public class ChangeClass{
public void changeInt(int i){
i=5;
}
public void changeLong(long i){
i=555;
}
public void changeString(String str){
str="5555";
}
public void changeMember(Member member){
member=new Member("Cindy",35);
}
public void changeMemberField(Member member){
member.setAge(20);
member.setName("Andy");
}
public static void main(String[] args){
ChangeClass changeClass=new ChangeClass();
int intValue=10;
changeClass.changeInt(intValue);
System.out.println(intValue);
long longValue=10;
changeClass.changeLong(longValue);
System.out.println(longValue);
String stringValue="1234";
changeClass.changeString(stringValue);
System.out.println(stringValue);
Member member2=new Member("Douglas",45);
changeClass.changeMember(member2);
System.out.println(member2);
Member member=new Member("Bill",25);
changeClass.changeMemberField(member);
System.out.println(member);
}
}
package com.sitinspring;
public class Member{
private String name;
private int age;
public Member(String name,int age){
this.age=age;
this.name=name;
}
public String toString(){
return "Member name="+name+" age="+age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
輸出:
10
10
1234
Member name=Douglas age=45
Member name=Andy age=20
解釋:
第一個輸出10是因為int是基本類型,傳遞的參數(shù)是intValue的拷貝,對拷貝的修改對原值intValue沒有影響.
第一個輸出10和上面是一個道理.
第三個輸出1234.由于String是類類型, str是stringValue的地址拷貝,參數(shù)str指向的地址和stringValue的一致,但在函數(shù)changeString 中,由于String的特殊性, str=“5555”和str=new String(“5555”)是等價的, str指向了新的”5555”所在的地址,此句后str就與原來的stringValue徹底脫離了聯(lián)系.
第四個輸出Member?name=Douglas?age=45的道理和上面相同.
第五個輸出Member?name=Andy?age=20是因為changeMemberField函數(shù)中修改了參數(shù)member 的值,也就是修改member指向實例的值,而這個實例正是member指向的值,因此member就變成了name=Andy 且age=20.
結論
Java中參數(shù)傳遞的都是值,對應基本類型,傳遞的是原值的拷貝;對于類類型,傳遞的是引用即地址的拷貝.
對于函數(shù)對參數(shù)的改變是否會影響原值的問題:值類型自然不會影響到原值.而對于類類型要看改變的是參數(shù)的地址還是值,如果是前者,參數(shù)和原引用指向了不同的地址,它們自然脫離了關系;如果是后者,修改的實例就是原引用指向的實例,這當然對原值進行了修改.
代碼下載:
http://m.tkk7.com/Files/sitinspring/PassValueOrReference20080116142420.rar
反射Reflection是Java被視為動態(tài)語言的一個關鍵性質.這個機制允許程序在運行時通過Reflection APIs得到任何一個已知名稱的類的相關信息,包括其構造方法,父類,實現(xiàn)的接口,成員變量(field)和成員方法(method)的相關信息,并可在運行時改變成員變量的值或調用其方法.反射的高度靈活的特性使得它成為Java語言中最具魔力和活力的部分,它是許多流行框架的實現(xiàn)基礎,如Struts,Spring和Hibernate,本篇將列舉一些反射常見的API:
實現(xiàn)反射機制的類
在JDK中,主要由以下類來實現(xiàn)Java反射機制,這些類都位于java.lang.reflect包中:
Class類:代表一個類。
Field 類:代表類的成員變量(成員變量也稱為類的屬性)。
Method類:代表類的方法。
Constructor 類:代表類的構造方法。
Array類:提供了動態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組的元素的靜態(tài)方法。
反射的源頭:Class類
Java類繼承體系的是一個單根體系,所有類的都起源于Object類,其內(nèi)聲明了數(shù)個應該在所有Java class中被改寫的methods:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一個Class object。當一個class被加載,或當加載器(class loader)的defineClass()被JVM調用,JVM 便自動產(chǎn)生一個Class object。
由于在java.lang.Object 類中定義了getClass()方法,因此對于任意一個Java對象,都可以通過此方法獲得對象的類型。
Class類對象代表了Java應用程序中的各種類和接口.這些類不是程序代碼生成的,而是在Java虛擬機(JVM)裝入各種類時生成的.
Static class forName(String className)
這個方法返回以className為名字的Class對象。
Object newInstance()
創(chuàng)建該Class對象代表的類的一個實例,類似調用一個無參數(shù)的構造函數(shù)。這個方法要求類必須具有一個無參構造函數(shù),如果沒有時調用此方法程序會拋出一個java.lang.InstantiationException異常,這也是許多框架要求類具有一個無參構造函數(shù)的根本原因
package com.sitinspring;
public class Member{
private String name;
private int age;
private float salary;
public Member(){
name="Unknown";
age=20;
salary=1.00f;
}
public String toString(){
return "名稱="+name+" 年齡="+age+" 薪水="+salary;
}
public static void main(String[] args){
try{
Class cls=Class.forName("com.sitinspring.Member");
Member member=(Member)cls.newInstance();
System.out.println(member);
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
Class getSuperclass()
返回該Class對象代表的類的父類。如果該Class是Object,接口,基本數(shù)據(jù)類型或void,則返回nulll,如果這個類對象是數(shù)組,則返回Object類的類對象
public class Member extends Thread implements Comparable{
private String name;
private int age;
private float salary;
public Member(){
name="Unknown";
age=20;
salary=1.00f;
}
public String toString(){
return "名稱="+name+" 年齡="+age+" 薪水="+salary;
}
public int compareTo(Object obj){
Member another=(Member)obj;
return this.age-another.age;
}
public static void main(String[] args){
System.out.println(Member.class.getSuperclass());
System.out.println(Object.class.getSuperclass());
System.out.println(Comparable.class.getSuperclass());
System.out.println(int.class.getSuperclass());
System.out.println(void.class.getSuperclass());
System.out.println(String[].class.getSuperclass());
}
}
Class[] getInterfaces()
返回該Class對象實現(xiàn)的接口。
public class Member implements Comparable,Runnable{
private String name;
private int age;
private float salary;
public Member(){
name="Unknown";
age=20;
salary=1.00f;
}
public String toString(){
return "名稱="+name+" 年齡="+age+" 薪水="+salary;
}
public int compareTo(Object obj){
Member another=(Member)obj;
return this.age-another.age;
}
public void run(){
}
public static void main(String[] args){
for(Class cls:Member.class.getInterfaces()){
System.out.println(cls.toString());
}
}
}
輸出:
interface java.lang.Comparable
interface java.lang.Runnable
Construtor[] getConstructors()
Construtor[] getDeclaredConstructors()
Construtor[] getConstructors(Class[] parameterTypes)
Construtor[] getDeclaredConstructors(Class[] parameterTypes)
返回構造函數(shù),如果有parameterTypes,返回參數(shù)類型為parameterTypes的構造函數(shù),Declared是指類中聲明的所有構造函數(shù),如果沒有Declared,則只返回共有構造函數(shù)。
public class Member {
private String name;
private int age;
private float salary;
public Member() {
name = "Unknown";
age = 20;
salary = 1.00f;
}
public Member(String name, int age, float salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public String toString() {
return "名稱=" + name + " 年齡=" + age + " 薪水=" + salary;
}
public static void main(String[] args) {
for (Constructor cls : Member.class.getConstructors()) {
System.out.println(cls.toString());
}
try {
Class cls = Class.forName("com.sitinspring.Member");
Constructor con =cls.getConstructor(new Class[]{String.class, int.class,float.class});
Member member = (Member) con.newInstance(new Object[] {
new String("Sitinspring"), new Integer(30),
new Float(20000) });
System.out.println(member);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Field[] getFields()
Field[] getDeclaredFields()
Field getField(String name)
Field[] getDeclaredFields(String name)
返回成員變量。如果有name參數(shù),返回名字是name的成員變量,Declared指聲明中所有的成員變量,如果沒有Declared,則只返回公有成員變量。
public class Member {
private String name;
private int age;
private float salary;
public String field1;
protected String field2;
public static void main(String[] args) {
for (Field field : Member.class.getFields()) {
System.out.println(field);
}
for (Field field : Member.class.getDeclaredFields()) {
System.out.println(field.getName());
}
}
}
輸出:
public java.lang.String com.sitinspring.Member.field1
name
age
salary
field1
field2
Method[] getMethods()
Method[] getDeclaredMethods()
Method getMethod(String name,Class[] parameterTypes)
Method[] getDeclaredMethods(String name ,Class[] parameterTypes)
返回類的方法,如果有name和parameterTypes參數(shù),返回名字是name,且有parameterTypes參數(shù)列表的方法、Declared指聲明中所有的方法(包括public,private,protected),如果沒有Declared,則只返回公有方法。
Method類有一個重要方法
Object invoke(Object obj,Object[] arg),
通過它可以進行類方法調用,在后面的例子中會見到。
public class Member {
private String name;
private int age;
private float salary;
public Member() {
name = "Unknown";
age = 20;
salary = 1.00f;
}
public String toString() {
return "名稱=" + name + " 年齡=" + age + " 薪水=" + salary;
}
public int getAge() {
return age;
}
protected String getName() {
return name;
}
private float getSalary() {
return salary;
}
public static void main(String[] args) {
for (Method method : Member.class.getMethods()) {
System.out.println(method);
}
System.out.println("--------------");
for (Method method : Member.class.getDeclaredMethods()) {
System.out.println(method);
}
}
}
調用類的方法
Method類有一個重要方法
Object invoke(Object obj,Object[] arg),
Object代表返回值,obj是類實例, arg是參數(shù)數(shù)組。
這個方法能調用實例的一個方法。如右:
public class Caculator{
public int add(int op1,int op2){
return op1+op2;
}
public int substract(int op1,int op2){
return op1-op2;
}
public static void main(String[] args){
try{
Caculator caculator=new Caculator();
Method addMethod = caculator.getClass().getMethod(
"add",
new Class[] { int.class,int.class });
Object result1=addMethod.invoke(caculator, new Object[] { 1,2 });
System.out.println("和="+result1);
Method substractMethod = caculator.getClass().getMethod(
"substract",
new Class[] { int.class,int.class });
Object result2=substractMethod.invoke(caculator, new Object[] { 3,4 });
System.out.println("差="+result2);
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
通過Field對對象進行設值取值請見:
http://m.tkk7.com/sitinspring/archive/2008/01/03/172455.html
通過Method對對象進行設值取值請見:
http://m.tkk7.com/sitinspring/archive/2008/01/05/172970.html
摘要: 費了一番周折,把Tomcat6中JDBC數(shù)據(jù)源配置好了,這里把過程寫一下。感覺是某些網(wǎng)上的東西不可全信,還是官方文檔管用。
步驟一:將Oracle的數(shù)據(jù)庫驅動包classes12.jar拷貝到$CATALINA_HOME/lib下,我的Tomcat6庫位置是C:\Tomcat6\lib,就拷貝到這里。
步驟二:改寫server.xml。
server.xml在$CATALINA_...
閱讀全文
通常來說,使用下面的方法確實能改變樹節(jié)點的圖標,但靈活性不高。
// 設定葉節(jié)點圖標
Icon leafIcon = new ImageIcon(TreeViewPanel.class
.getResource("/leaf.gif"));
// 設定關閉狀態(tài)節(jié)點圖標
Icon closedIcon = new ImageIcon(TreeViewPanel.class
.getResource("/close.gif"));
// 設定打開狀態(tài)節(jié)點圖標
Icon openIcon = new ImageIcon(TreeViewPanel.class
.getResource("/open.gif"));

// 取得樹的渲染器
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree
.getCellRenderer();

// 設定葉節(jié)點圖標
renderer.setLeafIcon(leafIcon);

// 設定關閉狀態(tài)節(jié)點圖標
renderer.setClosedIcon(closedIcon);

// 設定打開狀態(tài)節(jié)點圖標
renderer.setOpenIcon(openIcon);
但這樣靈活性不高,如我想每層的圖標都不一樣就不能使用這種方法了,我想要的效果如下:
這時我們只有擴展DefaultTreeCellRenderer創(chuàng)建自己的樹節(jié)點渲染器,我創(chuàng)建的渲染器代碼如下:
package com.sitinspring.common.render;

import java.awt.Component;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeNode;


/** *//**
* 樹節(jié)點渲染器
* @author: sitinspring(junglesong@gmail.com)
* @date: 2008-2-12
*/

public class TreeNodeRenderer extends DefaultTreeCellRenderer
{
private static final long serialVersionUID = 8532405600839140757L;
// 數(shù)據(jù)庫圖標,頂層節(jié)點用
private static final Icon databaseIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/database.gif"));
// 表圖標,第三層節(jié)點用
private static final Icon tableIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/leaf.gif"));
// 表空間關閉狀態(tài)圖標,關閉狀態(tài)的第二層節(jié)點用
private static final Icon tableSpaceCloseIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/close.gif"));
// 表空間關閉狀態(tài)圖標,打開狀態(tài)的第二層節(jié)點用
private static final Icon tableSpaceOpenIcon = new ImageIcon(TreeNodeRenderer.class
.getResource("/open.gif"));
public Component getTreeCellRendererComponent(JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,

boolean hasFocus)
{
super.getTreeCellRendererComponent(tree,
value,
sel,
expanded,
leaf,
row,
hasFocus);
// 取得節(jié)點
DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
// 取得路徑
TreeNode[] paths = node.getPath();
// 按路徑層次賦予不同的圖標

if (paths.length == 3)
{
setIcon(tableIcon);

}else if(paths.length == 2)
{
// 按展開情況再賦予不同的圖標

if(expanded)
{
setIcon(tableSpaceOpenIcon);
}

else
{
setIcon(tableSpaceCloseIcon);
}
}

else if(paths.length == 1)
{
setIcon(databaseIcon);
}
return this;
}
}
使用這個渲染器使用以下代碼就行了:
tree.setCellRenderer(new TreeNodeRenderer());
以上。
摘要: 實例一:
效果圖:
頁面代碼:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><table>
...
閱讀全文