Java核心技术(第8版) - 读书笔记 - 第3章

1、Java采用UTF-16标准,一定程度上与Unicode兼容。Unicode有17个级别,1个标准和16个拓展。

2、Unicode标准中,第1级U+0000到U+FFFF,在Java中用2个字节表示(但U+D800到U+DBFF无定义)。

3、Unicode还定义了其余16个扩展级,从U+10000到U+10FFFF。在Java中用4个字节表示。它们的前两个字节就是U+D800~U+DBFF,即Java标准级别中没定义的部分,后两个字节就是U+DC00到U+DFFF。因此,这16个级别的范围是U+10000到U+10FFFF。

4、Java中,char、String、StringBuffer都是用的UTF-16编码。字符值用代码点这个概念表示。U+0000与U+10FFFF。

5、Java中的八种基本类型:4整、2浮、char(unicode)、boolean

6、4整型按照范围递增:byte、short、int、long。注意long常量后加L。

7、浮点:float、double。float常量加F,double常量不加或D。

8、浮点的三个特殊值:正无穷大(1/0) Double.INFINITY、负无穷大 Double.NEGATIVE_INFINITY、NaN(0/0) Double.NaN

9、char类型\u0000 到 \uffff。

10、Java中,变量只要是Unicode的就可以,因此中文变量名也是可以的。

11、Java中的常量用final表示。

final double PIE = 3.1415926;

12、如果希望一个常量在多个类中使用,可再加上static

public static final double PIE = 3.14;

13、位运算:与&、或|、异或^、非~。

14、位运算:
(1)>>>,右移,高位用0填充。
(2)>>,右移,高位用最高位填充(也即如果被操作数的符号为正,则在二进制的高位补0;如果被操作数的符号为负,则在二进制的高位补1。)。
(3)<<,左移。
负数第一位是1,正数是0。因此对于正数,>>>和>>等价,但负数的话,>>>就会改变属性。因此>>又叫逻辑右移,因为它不改变符号。

15、Math类包含了各种数学函数。

double x = 10;
double y = Math.sqrt(x);

幂运算Math.pow(x, a) x^a
三角函数Math.sin/Math.cos/Math.tan/Math.atan/Math.atan2
对数函数Math.exp/Math.log
常量Math.PI/Math.E

16、操作符次序和C/C++类似。

17、枚举类型

//声明
enum Size {SMALL, MEDIUM, LARGE, XLARGE};

//使用
Size s = Size.MEDIUM;

19、字符串String是Unicod的序列。"Java\u2122",即J a v a和TM标志。

20、子字符串

String greeting = "Hello You";
String s = greeting.substring(0, 3);
System.out.println(s);
//输出 Hel

21、String支持字符串拼接,拼接时会自动转换int和string。

22、Java的String是不能修改的,即不可变字符。下面的代码实际是让str从"aaa"指向了“bbb”,即改变了String str指向的位置,而没有修改常量"aaa"和"bbb"

String str = "aaa";
str = "bbb";

23、编译器的字符串是共享的。拼接大量的字符串会导致效率低下。

24、检测字符串相等不再是==而是str1.equals(str2)

25、尽量使用代码点String.codePointAt(index),不要使用Char:String.codePointAt(index)。

26、Java中字符串操作非常常用。
char String.charAt() 最好不要用,用codePointAt()更好
int String.compareTo(xx) 按照字典序与xx比较。

boolean String.startsWith(xx) 是否以xx开头
boolean String.endsWith(xx) 是否以xx结尾
boolean String.equals(x) 是否和xx相等
boolean String.equalsIgnoreCase(other) 忽略字母大小写是否和other相等。

int String.indexOf(str, pos) 从pos开始的位置查找子字符串
int length() 字符串长度
int codePointCount(int startIndex, int endIndex)

String String.substring(int begin, int end) 返回begin到end的子字符串
String String.toLowerCase() 返回字符串的小写字母化。
String String.toUpperCase()

27、构建字符串:可以用StringBuilder。

28、数据输出System.out.println

29、数据输入

Scanner scan = new Scanner(System.in);
if(scan.hasNextXX())
{
    scan.nextXX()
}

例子:

import java.util.*;

public class InputTest
{
    public static void main(String [] args)
    {
        //var
        String name = "";
        int age = 0;

        //Input
        Scanner in = new Scanner(System.in);
        System.out.println("What's your name?");
        if(in.hasNextLine())
        {
            name = in.nextLine();
        }
        System.out.println("What's your age?");
        if(in.hasNextInt())
        {
            age = in.nextInt();
        }   

        //Output
        System.out.println("Your name is "+ name +", age is "+age);
    }
}

30、JDK6还引入了Console类,可读入Password(隐藏回显)。

import java.io.Console;

public class TC
{
    public static void main(String [] args)
    {
        Console con = System.console();
        System.out.println("Username:");
        String user = con.readLine();
        System.out.println("Password:");
        char[] password = con.readPassword();
        System.out.println(user+" "+(new String(password)));
    }
}

31、System.out.printf()可以格式化输出。
System.out.printf("%8.2f", x); //8字符宽度,小数点后2位精度。
%d 整数
%x 十六进制整数
%f 浮点 15.9
%e 科学浮点 15.9e+01
%s 字符串
%c 字母
%b 布尔 (输出true或者false)
%h 散列码?
其他标志:
+ 强制打印符号(+ -)
空格 在正数前添加空格
- 左对齐
$ 格式化的参数索引,同一个对象格式化多次时候用,%n$y,n是第几个参数,y是格式化字符串

32、String.format可以格式化字符串。

33、String.format可以直接对日期进行格式化,结合$控制符号。
%1$tx,其中1表示第一个参数需要是Date,t是表示转入日期控制,x表示一般的ym哪些什么的日期控制。

//格式化
String tmstr = String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS" , new Date());
//输出 2011-12-09 17:14:57
System.out.println(tmstr);

34、Java读文件。

读文件用Scanner包一个File对象:
Scanner in = new Scanner(new File("myfile.txt"));
然后就可以和之前一样读取格式化的信息了。

import java.io.*;
import java.util.*;

public class FileRead
{
    public static void main(String [] args)
    {
        try
        {
            Scanner in =  new Scanner(new File("./FileRead.java"));
            while(in.hasNextLine())
            {
                System.out.println(in.nextLine());
            }
            in.close();
        }
        catch(FileNotFoundException e)
        {
            System.out.println("File not found.");
            System.exit(-1);
        }
    }
}

35、Java基础写文件用PrintWriter。

PrintWriter out = new PrintWriter("out.txt", "UTF-8");
第一个参数是路径,第2个是字符集编码。如果需要append什么模式的,不用String,用FileOutputStream做为第一个参数吧!

import java.io.*;

public class FileWrite
{
    public static void main(String [] args)
    {
        PrintWriter out = null;
        try
        {
            out = new PrintWriter("out.txt", "UTF-8");
            for(int i=0; i<1000; i++)
            {
                out.println(i);
            }
        }
        catch(FileNotFoundException ef)
        {
            System.out.println("File not found.");
        }
        catch(SecurityException es)
        {
            System.out.println("Can't write file.");
        }
        catch(UnsupportedEncodingException eu)
        {
            System.out.println("Unsuppourt encoding.");
        }
        finally
        {
            if(out!=null)
            {
                out.close();
            }
        }   

    }
}

36、Java中的if switch for while do while和C/C++的差不多。多了一个foreach。

for(String s: list)
{
    System.out.println(s);
}

书上的例子

import java.util.*;

public class Retirement
{
    public static void main(String args[])
    {
        //Input
        Scanner in = new Scanner(System.in);    

        System.out.println("How much money do you need to retire?");
        double retiremoney = in.nextDouble();

        System.out.println("How much money will you contribute each year?");
        double yearmoney = in.nextDouble();

        System.out.println("Insert rate in %?");
        double rate = in.nextDouble()/100;  //Remeber change it to %..

        //Calculate
        int year = 1;
        double money = 0;
        while( money < retiremoney )
        {
            //one year
            money += yearmoney;
            //intrest
            money *= (1+rate);
            year++;
        }   

        System.out.println("You need "+year+" to retire.");

    }
}

37、switch的标签必须是整型或者枚举常量,不能是字符串。

38、goto有害论过于绝对了,在Java中可以适量使用goto语句。

while(...)
{
....
goto label_exception;
....

}

label_exception:
    ....

39、大数运算:BigInteger
BigInteger add(BigInteger)
BigInteger substract(BigInteger)
BigInteger multiply(BigInteger)
BigInteger divide(BigInteger)
BigInteger mod(BigInteger)
String toString(int)
40、高精度运算:BigDecimal
BigDecimal add(BigDecimal)
BigDecimal subtract(BigDecimal)

41、数组,不仅要声明为:
int [] a;
还要new出来:
int [] a = new int[10];

42、foreach用法,这是jdk5之后引入的。

int [] arr = new int[100];
... // 赋值
for(int e: arr)
{
    System.out.println(e);
}

43、打印数组简易方法(且用逗号,分割开)

import java.util.Arrays;
public class Test
{
    public static void main(String [] args)
    {
        int [] arr  = {1, 2, 3, 4};
        //Arrays输出
        System.out.println(Arrays.toString(arr));
        //输出:[1, 2, 3, 4]
    }
}

44、Java允许在定义数组时候直接初始化它们的数值

int [] arr = {1, 2, 3, 4};

45、Java中对象都是引用,因此,如下只是让a和b都指向了数组a

int [] a ={1, 2, 3};

int [] b = a;

要拷贝数组,需要用Arrays.copyOf函数

46、命令行参数

public static void main(String [] args)

args[0] 程序名称

args[1] ~ args[n-1] n个参数

47、数组排序

Arrays.sort(arr);

48、Arrays中的实用方法。

Arrays.toString(arr) 将数组输出为[elem1, elem2, ....]的形式,逗号分割开

Arrays.copyOf(arr, len) 拷贝数组arr,返回拷贝好的新数组(new了,不是引用了)

Arrays.sort(arr) 排序数组

Arrays.binarySearch(arr) 二分查找

Arrays.fill(arr, val) 把数组arr赋值为val值

Arrays.equals(arr1, arr2) 检查arr1和arr2是否都完全相等。。

49、Java支持多维数组、甚至不规则的多维数组。

不规则的多维数组(打印三角形的例子,这里每一行的数组长度是不一样的):

public class SJ
{
    public static void main(String [] args)
    {   
        //table 2 dem
        boolean [][] table = new boolean[9][];
        for(int i=0; i<table.length; i++)
        {   
            table[i] = new boolean[i+1];
        }   

        //compute
        for(int i=0; i< table.length; i++)
        {   
            for(int j=0; j< table[i].length; j++)
            {   
                if(table[i][j]) 
                {   
                    System.out.print(1+" ");
                }   
                else
                {   
                    System.out.print(0+" ");
                }   
            }   
            System.out.println();
        }   
    }   
}
/*输出
0 
0 0 
0 0 0 
0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 

*/

本章完。

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *