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

Think in Java(4th Edition)学习笔记 2009.03.23

2012年07月14日 ⁄ 综合 ⁄ 共 4231字 ⁄ 字号 评论关闭
文章目录

P41 Random的使用

Java实用工具类库中的类java.util.Random提供了产生各种类型随机数的方法。它可以产生int、long、float、double以及Goussian等类型的随机数。这也是它与java.lang.Math中的方法Random()最大的不同之处,后者只产生double型的随机数。

 类Random中的方法十分简单,它只有两个构造方法和六个普通方法。
构造方法:
(1)public Random()

  (2)public Random(long seed)

 

Java产生随机数需要有一个基值seed,在第一种方法中基值缺省,则将系统时间作为seed。

貌似不能自动生成一连串的不同的随机数,看来还要手工写代码来保证随机数的不同。

 

P48

Integer类的几个方法还是挺好用的:

 

toBinaryString

public static String toBinaryString(int i)
以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。

如果参数为负,该无符号整数值为参数加上 232;否则等于该参数。将该值转换为二进制(基数 2)形式的无前导 0 的 ASCII 数字字符串。如果无符号数的大小为零,则用一个零字符 '0' (’"u0030’) 表示它;否则,无符号数大小的表示形式中的第一个字符将不是零字符。字符 '0' ('"u0030') 和 '1' ('"u0031') 被用作二进制数字。

参数:
i - 要转换为字符串的整数。
返回:
用二进制(基数 2)参数表示的无符号整数值的字符串表示形式。
从以下版本开始:
JDK1.0.2

 

 

toHexString

public static String toHexString(int i)
以十六进制的无符号整数形式返回一个整数参数的字符串表示形式。

如果参数为负,那么无符号整数值为参数加上 232;否则等于该参数。将该值转换为十六进制(基数 16)的无前导 0 的 ASCII 数字字符串。如果无符号数的大小值为零,则用一个零字符 '0' (’"u0030’) 表示它;否则,无符号数大小的表示形式中的第一个字符将不是零字符。用以下字符作为十六进制数字:

 0123456789abcdef 

这些字符的范围是从 '"u0030''"u0039' 和从 '"u0061''"u0066'。如果希望得到大写字母,可以在结果上调用 String.toUpperCase() 方法:

 Integer.toHexString(n).toUpperCase() 
参数:
i - 要转换成字符串的整数。
返回:
用十六进制(基数 16)参数表示的无符号整数值的字符串表示形式。
从以下版本开始:

JDK1.0.2

 

decode

public static Integer decode(String nm) throws NumberFormatException
String 解码为 Integer。接受通过以下语法给出的十进制、十六进制和八进制数字:
DecodableString:
Signopt DecimalNumeral
Signopt 0x HexDigits
Signopt 0X HexDigits
Signopt # HexDigits
Signopt 0 OctalDigits
Sign:
-

Java Language Specification》的第 §3.10.1 节中有 DecimalNumeralHexDigitsOctalDigits 的定义。

跟在(可选)负号和/或基数说明符(“0x”、“0X”、“#”或前导零)后面的字符序列是使用指示的基数(10、16 或 8)通过 Integer.parseInt 方法分析的。字符序列必须表示一个正值,否则会抛出 NumberFormatException。如果指定的 String 的第一个字符是减号,则对结果求反。String 中不允许出现空白字符。

参数:
nm - 要解码的 String
返回:
保持 nm 所表示的 int 值的 Integer 对象。
抛出:
NumberFormatException - 如果 String 不包含可分析整数。
从以下版本开始:
1.2
另请参见:

parseInt(java.lang.String, int)

 

 

 Character类里面也有一些关于字符的处理函数,也挺好用得。

P68

Java中的foreach语法,和C#中的还是有些区别的,用惯了C#的,看Java猛然有点不习惯。

1 public class ForEachString {
2     public static void main(String[] args)
3     {
4         for(char c : "This is a test of foreach".toCharArray())
5             System.out .print(c + " ");
6     }
7 }
8 

 

 P79

 参数的顺序不同可以区分两个不同的方法,但是不推荐,代码难以维护。

public class OverloadingOrder {
    
static void f(String s, int i)
    {
        System.out.println(
"String: " + s + ", int: " + i);
    }
    
static void f(int i ,String s)
    {
        System.out.println(
"int: " + i + ", String: " + s);
    }
    
    
public static void main(String[] args)
    {
        f(
"String first",11);
        f(
99"Int first");
    }

}

 

P85

Java中可以在构造函数中调用构造函数,但是不能再非构造函数中调用构造函数

public class Flower {
    
int petalCount = 0;
    String s 
= "initial value";
    Flower(
int petals)
    {
        petalCount 
= petals;
        System.out.println(
"Constructor w/ int arg only, petalCount= " + petalCount);
    }
    
    Flower(String ss)
    {
        System.out.println(
"Constructor w/ String arg only, s= " + ss);
        s 
=ss;
    }
    
    Flower(String s,
int petals)
    {
        
this(petals);         //在构造函数中调用构造函数
        this.s = s;
        System.out.println(
"String & int args");
    }
    
    Flower()
    {
        
this("hi",47);         //在构造函数中调用构造函数
        System.out.println("Default constructor (no args)");
    }
    
    
void printPetalCount()
    {
        
//this(11);           //不能在非构造函数中调用构造函数
        System.out.println("petalCount = " +petalCount + " s = " + s);
    }
    
/**
     * 
@param args
     
*/
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        Flower x = new Flower();
        x.printPetalCount();
    }
}

 

 P87

关于finalize()方法,下面这篇文章写得浅显易懂,还不错!

 

http://blog.csdn.net/dongliheng/archive/2007/07/12/1686258.aspx

 

P94

初始化顺序:在类的内部,变量定义的先后顺序决定了变量之间的初始化顺序,即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。

package Chapter5;

class Window
{
    Window(
int marker)
    {
        System.out.println(
"Window(" + marker + ")");
    }
}

class House
{
    Window w1 
= new Window(1);
    House()
    {
        System.out.println(
"House()");
        w3 
= new Window(33);
    }
    Window w2 
= new Window(2);
    
void f()
    {
        System.out.println(
"f()");
    }
    Window w3 
= new Window(3);
}

public class OrderOfInitialization {

    /**
     * 
@param args
     
*/
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        House h = new House();
        h.f();

    }

}

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.