??xml version="1.0" encoding="utf-8" standalone="yes"?>
http://java.sun.com/developer/JDCTechTips/2001/tt0410.html#making
有两U主要的Collection Types
java.util.Map
java.util.SortedMap
java.util.Collection
java.util.Set
java.util.List
java.util.SortedSet
Implementations
List的三U实?/span>
java.util.Vector
java.util.ArrayList
java.util.LinkedList
三者的异同
三者都是有序的Q一般就是加入的ơ序?/span>
Vector?/span>ArrayList内部都是用数l实现的Q可以把它们惌成ؓ一个数l。当定w不够的时候,新Z个更大的数组Q然后把现在q个数组中的所有元素都拯厅R可以想象这U实现可以很方便的直接取Z要的某个元素而不用遍历。但是如果在中间删除或者插入元素,效率׃高了。甚xơ扩容的时候,都是很媄响效率的时候?/span>
Vector?/span>ArrayList的区别就?/span>Vector是线E安全的Q但ArrayList不是。因为实现线E安全是有代LQ如果应用中不需要线E安全,那么qArrayListQ如果需要线E安全那׃定要?/span>Vector?/span>
至于java中的LinkedListQ其实在数据l构中就是双向链表。插入和删除元素都很快,但是要查找一个元素就慢了。有失必有得Q如何选择Q就看应用的情况了?/span>
Map?font face="Times New Roman, serif">SortedMap的几U实?/strong>
java.util.HashTable
java.util.HashMap
java.util.IdentityHashMap
java.util.WeakHashMap
以上四种都是无序的?font face="Times New Roman, serif">HashTable?font face="Times New Roman, serif">HashMap的区别是HashTable是线E安全的?font face="Times New Roman, serif">HashMap不是Q这个关pL点像Vector?font face="Times New Roman, serif">ArrayList?/p>
IdentityHashMap首先它是一?font face="Times New Roman, serif">HashMapQ不同的是,它不是根?font face="Times New Roman, serif">equal()函数来判断是否重复,只要不是同一个对象,哪怕这两个对象的数据都是一LQ那么就可以addq来?/p>
java.util.LinkedHashMap
java.uil.TreeMap
以上两种是有序的MapQ可以进?font face="Times New Roman, serif">iterateQ当然这是要付出效率代h的。两者不同之处,由名字便可知道,LinkedHashMap用链表来l护q个ơ序Q?font face="Times New Roman, serif">TreeMap是用二叉树来l护q个ơ序?/p>
Sets?font face="Times New Roman, serif">SortedSets的几U实?/p>
java.util.HashSet
java.util.LinkedSet
java.util.TreeSet
由名字就可知道什么意思了Q不多说?br />
Collection的选择
需要通过一?font face="Times New Roman, serif">key扑ֈ一个元素吗Q?br />
YesQ那qMap
NoQ那qCollection
如果选择了一?font face="Times New Roman, serif">CollectionQ允讔R复元素吗Q?br />
YesQ那qList
NoQ那qSet
然后是军_要不?font face="Times New Roman, serif">Sorted...q个比较难军_了?br /> 如果常常?font face="Times New Roman, serif">sortQ那q接选择sorted的类?br /> 如果偶尔或者根本不需?font face="Times New Roman, serif">sortedQ那选择普通类型,需?font face="Times New Roman, serif">sort的时候先拷到sorted的类型中sort一下?/p>
三种Iterators
java.util.Enumeration
q个基本?font face="Times New Roman, serif">Iterator替代掉了Q但在某些场合,比如J2ME中还可能用到?/p>
java.util.Iterator
用的最q泛
java.util.ListIterator
双向?font face="Times New Roman, serif">IteratorQ必ȝ在实?font face="Times New Roman, serif">List?font face="Times New Roman, serif">Collection上面?/p>
PSQ?/strong>很多Collection提供的是Fail-Fast IteratorsQ就是在iterater的时候,q个Collection是不能被更改的,否则׃报出ConcurrentModificationException在多U程环境下面其要注意?/p>
]]>
在编E中Q用final变量来声明一些常量,q样׃用在每个用到q个帔R数字的地Ҏ入o人厌烦的复杂数字Q比?font face="Times New Roman, serif">PIQ,只要打入q个帔R名字p了。这大家都知道,可是要注意,q种帔R是在~译阶段才被替换的(所谓替换,是把程序中用到q个帔R名字的地方,用常量本w来替代Q。那意味着Q如果其它类用到了这个常量,如果帔R的值发生了更改Q那用到q个帔R的类必须重新build一下,否则那个c里q是以前的倹{?font face="Times New Roman, serif">
如果在程序中你用Cprivate final static帔RQƈ且只在某一个方法内用到Q那么你应该把它的声明移到方法以内。如果被两个以上的方法用刎ͼ那么q是留在cd明里?/p>
UdҎ内部后,不用?font face="Times New Roman, serif">private关键字,而且E序看v来比较简单?/p>
Final Variables
首先写个例子
public static String someMethod(final String environmentKey){
final String key = "env." + environmentKey;
System.out.println("Key is :" + key);
return (System.getProperty(key));
}
?font face="Times New Roman, serif">method中声明的final变量和常量是不同的,不同之处在于method-scoped final variables are variable。每ơ进入这个方法内部,q个变量p初始化一ơ。当Ӟq些变量都是q行时进行替换,而不像常量是在编译时q行替换?/p>
Final Parameters
方法的parameters声明?font face="Times New Roman, serif">finalQ可以防止,在方法体内部q个参数被篡攏V很好的best practice?/p>
Final Collections
public final static Set VALID_COLORS; q句语句是不是声明了一?font face="Times New Roman, serif">final setQ答案是NO。这只是声明了一?font face="Times New Roman, serif">final引用Q也是VALID_COLORSq个引用不能被更攏V?/p>
如果重新声明一个引用指向这个对象,那么q个对象q是能够更改的,所以这q不是一?font face="Times New Roman, serif">final set。那么怎样做才能真正得C?font face="Times New Roman, serif">final set呢?
public final static Set VALID_COLORS;
static{
Set temp = new HashSet();
temp.add(Color.red);
temp.add(Color.blue);
...
VALID_COLORS = Collections.unmodifiableSet(temp);
}
在实现自qunmodifiable collections factory的时候,除了要实?font face="Times New Roman, serif">CollectionQ?font face="Times New Roman, serif">seriallizable接口以外Q对?font face="Times New Roman, serif">Collection中定义的写操作,要重载。方法体中可以简单地抛出UnsupportedOperationException异常?br />
Instance-Scoped Variables
说白了,是那些在对象被实例化的时候才被初始化的属性,q且是不能被修改的。那么就把他声明?font face="Times New Roman, serif">final吧?/p>
exQ?font face="Times New Roman, serif">private final Date creationDate =
Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTime();
q么做的话,可以防止误操作Q改变这个本来不应该变的倹{?/p>
Final Classes
ex:
public final class SomeClass(){
//...Class contents
}
q样?font face="Times New Roman, serif">class 不能被ѝ?/p>
q有一U方法实玎ͼ是把它所有的构造函数都Ҏprivate的?/p>
q在设计模式?font face="Times New Roman, serif">sigleton模式中见q,但这限制了q个cȝ重用Q所以取个折P可以把构造函数声明成protected的?/p>
Final Method
q个很熟悉了Q一个类中的某个Ҏ如果被声明成final的,那么q个cȝ子类是不?font face="Times New Roman, serif">overrideq个Ҏ的?/p>
Conditional Complilation
~程的时候我们常怼使用System.out.println(".....");来显CZ些程序的q行情况Q但在真正交付的时候,我们q不希望q些语句被编译到class文g里面厅R?/p>
一个做法是所有这U类型的语句前面加上一?font face="Times New Roman, serif">if(booleanParameter)Q然后通过讄q个booleanParameter来实现要不要q行q些语句Q编译器在编译的时候如果发?font face="Times New Roman, serif">if里面的语句不可达Q那么会这些程序代码直接去掉?/p>
疑问是q些booleanParameter攑֜哪里比较好和方便。作者给出的是在包中专门Z个类Q里面存放这些静态的boolean帔RQ当Ӟ命名的时候要仔细。名字要指出用在哪里?/p>
2.RTTI——Runtime type identificationQ作用就是告诉你整个object是属于什么类型的。最常用的是getClass()Ҏ?/p>
3.只在for循环中用到的变量Q就在for循环中声明和分配Q不用担心会循环分配内存?/p>
比如Q?/p>
for(int i =0;i<10;i++){
String s = a[i];
}
sq不会@环newQ编译器会处理,让它只在W一ơ分配内存?br /> 前面~程Q我q特意把sUd外面d……汗啊
4.switch语句中,如果在default语句中加一个break是完全没有用的。因为在那个地方的breakҎ׃会被执行?/p>
5.continue
for(int idx=0;idx<1000,idx++){
if(idx==555){continue;}
}
在这个例子中Q@环仅仅蟩q了555Q如果程序中遇到cM要蟩q某个点的情况,可以q么利用continueQ会减少很多代码?/p>
6.chaining constructor
zȝsuper()、this(){,来羃减构造函数的复杂度?/p>
7.private for attributes
public for public methods
protected for helper methods
8.In Java, instances of the same class are friends and give unrestricted access to all of their properties and methods.
比如
if((obj.value==5)&&(this.value==5)){
obj.value=25;
}
q里面蟩q了setterҎQ直接给属性赋|q是很危险的做法。解决的Ҏ是无Z么方法给对象中的属性赋值都要通过setterҎ?/p>
9.对于问题代码要尽量用throw exception告知用户Q因为有时候不知道代码的执行环境,如EJB{等Q很多环境都是没有Console的,若是单的System.out.println 可能解决不了问题?/p>
DriverManager机制Q?/span>java.sql核心API
DataSource机制Q?/span>javax.sql可扩?/span>API
DriverManager机制Q?/span>
stetp1Q注册驱动程?/span>
Q?/span>1Q隐式注?/span>Class.forName("JDBCDriverName");
Q?/span>2Q显C注?/span>DriverMnager.registerDriver(new JDBCDriverName());
step 2:建立数据库连?/span>
Connection conn = DriverManager.getConnection(URL,username,password);
//其中URLQ?/span>jdbc:driver:databasename
step3:SQL操作
DataSource机制
step1Q查询数据源对象
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(DataSourceJNDIName);
step2Q获取数据库q接
Connection con = ds.getConnection();
step3Q?/span>SQL操作
SQL操作
Q?/span>1Q?/span>Statement
Statement stmt = con.createStatement();
stmt.executeUpdate("SQL语句");
stmt.close();
Q?/span>2Q?/span>PreparedStatement
例子
PreparedStatement psmt = conn.preparedStatement("INSERT INTO employee VALUES(?,?,?)");
psmt.setString(1,"Benjamin");
psmt.setString(2,"France");
psmt.setInt(3,55);
int opNum = psmt.executeUpdate();
q可以批量处?/span>
psmt.setString(1,"Benjamin");
psmt.setString(2,"France");
psmt.setInt(3,55);
psmt.addBatch();
psmt.setString(1,"Rob");
psmt.setString(2,"America");
psmt.setInt(3,56);
psmt.addBatch();
int [] updateCounts = psmt.executeBatch();
关于ResultSet
ResultSet rs = stmt.executeQuery("SQL");
next()—?span style="font-family: 宋体">Ud下一行,如果没有了则q回false。常常放?/span>while(rs.next)用来循环取数?/span>
getString(String ColumnName)
absolute(int row)
beforeFist()
isAfterLast()
isBeforeFirst()
isFirst()
isLast()
refreshRow()
关于元数?/span>
所谓元数据是描述数据的数据,q里当然指列名等{信息了
ResultSetMetaData rsmd = rs.getMetaData();
rsmd.getColumnCount();
rsmd.getColumnName(index);
cd?/span> |
大小 |
取D?/span> |
byte |
8 bits |
-128?/span>127 |
short |
16 bits |
-32768~32767 |
int |
32 bits |
|
long |
64 bits |
|
float |
32 bits |
|
double |
64 bits |
Java帔R
?/span>十进制不能以0打头Q数?/span>0除外Q?/span>
?/span>十六q制必须?/span>0x或?/span>0X打头
?/span>八进制必M0打头
?/span>长整型必MLl尾
?/span>数帔R默认?/span>double型,如果要将数赋值给float变量Q数字后面要?/span>f
final关键?/span>
final 标记的类不能被?/span>
final 变量是常量,不能改变
final Ҏ不能被子c重?/span>
Java变量
Q?/span>1Q当发生隐式cd转换Ӟ目标cd取D围要大于源类?/span>取D?/span>
Q?/span>2Q字W串可以使用加号同其它的数据cd相连而Ş成一个新的字W串
ExampleQ?/span>
System.out.println(‘a’+1); 输出的是98
System.out.println(“”+’a’+1); 输出的是”a1”
Q?/span>3Q?span style="color: #3366ff">局部变?/span>一定要q行初始?/span>
~译的时候可能只是警告,但在使用时就会报?/span>
Javaq算
Q?Q?span style="font: 7pt 'Times New Roman'"> 整数之间做除法时Q只保留整数部分而舍弃小数部分?/span>
Q?Q?span style="font: 7pt 'Times New Roman'"> Lq样的习惯:?/span>x==3 写成 3==x
Q?Q?span style="font: 7pt 'Times New Roman'"> &?/span>&&的区?/span>
&&UCؓ短\表达式,意思就?/span>&不管两边?/span>true或?/span>false都会一下,?/span>&&如果到前面的是falseQ它后面׃了Q反正综合v来表辑ּ肯定?/span>false?/span>
Q?Q?span style="font: 7pt 'Times New Roman'"> 位运?/span>
<< 左移
>> 右移
如果最高位?/span>0Q左边移I的高位填0Q如果最高位?/span>1Q左边移I的高位填?/span>1
>>> 无符号右U?/span>
不管最高位是什么,Uȝ的高位一律填?/span>0
右移n位就是除?/span>2?/span>nơ方
左移n位就是乘?/span>2?/span>nơ方
Java内存
Q?/span>1Q?/span>Java内存分ؓ两种Q?/span>
?/span>栈内?/span>Q用于存攑֟本类型变量和对象的引用变?/span>
?/span>堆内?/span>Q?/span>new创徏的对象和数组
Q?/span>2Q当堆内存中的对象没有引用指向它Ӟ它就变成了垃圾,会被垃圾回收器回收?/span>
Java面向对象
Q?/span>1Q?/span>= =常用来比较引用是否指向同一个地址
equals()用来比较对象的内Ҏ否一?/span>
对于数组?/span>Array.equalsҎ
Q?/span>2Q?/span>finalize()ҎQ它相当?/span>C++中的析构函数Q但又和析构函数不一栗因?/span>Java里面已经有垃圑֛收器了,所?/span>finalizeҎ不是特别重要。另外,finalize是在对象被当成垃圾从内存中释攑։调用Q而不是在对象变成垃圾前调用,垃圾回收器什么时候清理垃圾是不定时的Q所以不要指望用finalize做什么必要的收尾工作Q因ZҎ无法定它会赶在垃圾回收器之前执行?/span>
Q?/span>3Q?/span>System.gc()q个语句可以昑ּ地调用垃圑֛收器回收垃圾?/span>
Java参数传?/span>
Q?Q?span style="font: 7pt 'Times New Roman'"> 基本cd的变量作为实参传递,q不能改变这个变量的?/span>
举个例子Q就?/span>main函数里面定义的一个变量,传给一个方法,改下|其实q没有改?/span>main函数里面那个变量而是改了那个Ҏ自己内部的那个副本?/span>
Q?Q?span style="font: 7pt 'Times New Roman'"> 那如果传递的是某个对象的引用呢?
道理一P传递的是|q个“?#8221;是引用?#8220;?#8221;Q也是对象的内存地址Q方法通过q个地址对变量进行的修改Q当然就是对main函数中定义的q个变量本n的修改了?/span>
Java内部c?/span>
Ac里面定义了Bc,那么B叫做内部类Q?/span>A叫做外部类?/span>
B可以直接讉KAcȝ所有变量和ҎQ反之不成立?/span>
BcM存了Acȝthis引用?/span>
内部cd以是static?/span>
如果内部c被声明?/span>staticQ那么它可以包含static的变量,但不再能讉K外部cȝ?/span>static变量?/span>
Ҏ内定义的内部c,只能讉KҎ中的final变量Q而不能访问时变量,但可以访问外部类的变量?/span>
Java异常
Q?Q?span style="font: 7pt 'Times New Roman'"> 一个方法被覆盖Ӟ覆盖它的Ҏ必须抛出相同的异常或异常的子c?/span>
Q?Q?span style="font: 7pt 'Times New Roman'"> 如果父类抛出多个异常Q那么覆盖方法必L出那些异常的一个子集,也就是说Q不能抛出新的异常?/span>
JavaU程
两种实现多线E方?/span>
Q?Q?span style="font: 7pt 'Times New Roman'"> 直接l承Thread
MyThread extends Thread
然后
MyThread t = new MyTread();
t.start();
t.start();
值得注意的是Q无?/span>start多少遍只能启动一个线E?/span>
要实现多个线E,只能生成多个对象Q分别启动线E,一个对象只能启动一个线E?/span>
Q?Q?span style="font: 7pt 'Times New Roman'"> 实现Runnable接口
MyThread implements Runnalbe
然后
new Thread(t).start();
new Thread(t).start();
q种Ҏp实现多个U程?/span>
但这两种Ҏ启动的多个线E又有不一L地方Q?/span>
W一U因为是生成了多个对象,所以类中声明的一些资源,比如变量{等都是各不相关的?/span>
W二U对cM声明的资源是多个U程׃n的?/span>
所以要按需选择?/span>
Java String?/span>StringBuffer
String 对象不能L被改变,l常用的“+”其实是新生成了一?/span>String对象Q^常感觉不大,但是真的在大型应用中Q对效率影响非常严重?/span>
StringBuffer对象可以改动Q一旦生成了不再变化的内容,可以调用它?/span>toStringҎQ把它{化ؓString对象?/span>