Java杂记
仅以此系列记录阅读《JAVA核心技术:卷一》中感觉比较重要的部分。
String类型小结
不可修改的好处
JAVA中字符串是不可修改的,即”Hello”这个字符串在内存中就是一个整体,而不是’H’,’e’等拼凑出来的。这样做的好处是编译器可以实现字符串的共享。由于实际操作中,字符串的比较操作与生成操作比较多,因此,共享字符串能提高资源的利用率。
不可修改的弊端与解决方案
然而,当需要从键盘获取字符拼凑成一个字符串时,使用String类型会导致很低的效率,和高的资源开销。因此JAVA引入StringBuilder类型和StringBuffer类型。其一般用法如下:
StringBuilder sb = new StringBuilder();
sb.append("He");
sb.append("ll");
sb.append("o");
String str = sb.toString();
StringBuffer与StringBuilder的区别
StringBuffer 的用法和StringBuilder完全一样,但是StringBuilder是线程不安全的,因此在多线程程序中应该用StringBuffer,而StringBuilder在单线程中的效率比StringBuffer要高,所以在单线程中应该用StringBuilder。
对象数据域访问权限
一个方法可以访问所属类所有对象的私有数据。
如以下的eq()
方法:
public class Test03 {
private String name;
public Test03(String n){
name = n;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test03 t1 = new Test03("Good");
Test03 t2 = new Test03("Good");
System.out.println(t1.eq(t2));
}
public boolean eq(Test03 t){
if(name.equals(t.name))
return true;
return false;
}
}
日期类
JAVA中,日期类常用的有Date类和GregorianCalendar类,前者一般用来获取当前的时间点,后者用来按照当地习惯展示日期。
Date类
Date类的无参构造器返回的对象是距离一个固定时间点的毫秒数,这个固定时间点是UTC是时间1970年1月1日00:00:00。
Date time = new Date()
注意Date中虽然有getYear(),getMonth(),getDay()
这些方法,但是JAVA编译器并不鼓励使用。这是因为JAVA设计者后来考虑将保存时间点与保存日历分成两个类,然而此时Date中已经有getYear()
等方法了,所以只能将其标记为不鼓励使用,并且编译器会发出警告。我们不应该使用这些方法,因为可能在JAVA的后续版本中,这些方法会被删掉。
在构造JAVA类数据域的访问器时,一定要注意,Date类是可变类型,所以访问器应该返回其clone的对象,否则会发生危险。
示例代码如下:
class Test{
private Date time;
Test(){
time = new Date();
}
public Date getTime(){
return time;
}
public void setTime(Date time){
this.time = time;
}
public static void main(String[] args){
Test t = new Test();
System.out.println(t.getTime());//输出此时的time值
Date d = t.getTime();
d.setYear(1990);
//输出更改后的d值和time值
System.out.println(t.getTime());
System.out.println(d);
//结果发现更改d后,time也发生了改变,说明数据封闭性遭到了破坏
}
}
所以访问器应当返回Date对象的clone值,具体说明见JAVA学习笔记(二)。
此外,Date类还有after和before这两个方法比较常用,较为简单,不细表。
GregorianCalendar类
这个类是为了更好的保存日历格式而设计出来的,由于不同的地域有不同的日历格式,所以通过GregorianCalendar类可以避免地缘因素带来的可读性问题。
其一般使用方法如下:
class Test{
public static void main(String[] args){
//多个构造器
GregorianCalendar gc1 = new GregorianCalendar();//当前时间
GregorianCalendar gc2 = new GregorianCalendar(1995,Calendar.April,17);
GregorianCalendar gc3 = new GregorianCalendar(1995,Calendar.April,17,2,0,0);
//与Date类型互换
Date time = gc2.getTime();
gc3.setTime(time);
//get方法获得日,月,年
gc1.get(Calendar.DAY_OF_MONTH);
gc1.get(Calendar.MONTH);
gc1.get(Calendar.YEAR);
//get方法获得星期
gc1.get(Calendar.DAY_OF_WEEK);
//由于不同地域中星期的第一天不同,通过以下方法获取第一天
gc1.getFirstDayOfWeek();
//要更改地域则在main方法的第一行调用:Locale.setDefault(Locale.ITALY)
}
}
注意日期类的月份是从0到11,为了提高程序可读性一般用Calendar类提供的静态常量来表示,如:Calendar.April表示4月,实际值是3。
此外还有一些set和get方法,正常使用即可,不细表。