Thking in java(第四版)-查缺补漏(1-5章)

背景

为了过渡到第四版的学习,将以前学过的过一遍,记录下新的知识点。

1.参数化类型

ArrayList<Shape> shapes=new ArrayList<Shape>();

就像上面写的那样,在尖括号中间包含类型信息可以创建只容纳Shape对象的ArrayList。好处是,

我们可以明确地知道对象的类型,不用下溯造型。

2.高精度数字

BigInteger :支持任意精度的整数。 

BigDecimal:支持任何精度的定点数。

3.截尾和舍入

在将float或double转型为整形值时,总是对该数字执行截尾。如果想要得到

舍入的结果,就要使用java.lang.Math中的round()方法。

4.默认导入java.lang

所以java.lang包里面的东西,我们可以直接用

5.Character包装器类

java.lang.Character 包装器类可以把char基本类型的值包装进对象。

6.Foreach语法

Random rand=new Random(50);
float f[]=new float[10];
for(int i=0;i<10;i++)
    f[i]=rand.nextFloat();
for(float x: f)
    System.out.prinln(x);

适用于数组和容器

语法:定义了float类型的变量x,然后将每一个f元素赋值给x。

可以遍历数组或者容器,简化for的使用。

7.垃圾回收器如何工作

(1)引用记数:是一种简单但速度很慢的垃圾回收技术。每个对象都有一个引用计数器,当引用连接至对象时,

引用计数加1。当引用离开作用域或被置为null时,引用计数减1。垃圾回收器会在含有全部对象的列表上遍历

,当发现某个对象的引用计数为0时,就会释放其占用的空间。如果对象之间存在循环引用,可能会出现“对象

应该被回收,但是引用计数却不为零”的情况。似乎未在任何一种Java虚拟机实现。

(2)“停止-复制”:先暂停程序运行,然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。

当对象被复制到新堆时,它们是一个挨着一个,所以新堆保持紧凑排列。

(3)“标记-清扫”:从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象。每当找到一个存活对象,

就会给对象设一个标记,等到全部标记工作完成的时候,清理动作才会开始。在清理过程中,没有标记的对象将被

释放。在程序暂停的情况下才能进行。速度很慢,适合用在产生少量垃圾的时候。这时它的速度就会很快。

8.JIT

即时编译器技术(Just-In-Time,JIT),可以把程序全部或部分翻译成本地机器码,程序运行速度会提升。

“惰性评估”,即时编译器只在必要的时候才编译代码。Java HotSpot技术就采用了类似方法,代码每次被执行的时候

都会做一些优化,所以执行次数越多,它的速度越快。

9.数组的另一种形式

Integer[] b=new Integer[]{
    new Integer(1),new Integer(2),
};

public class DynamicArray{
    public static void main(String[] args){
        Other.main(new String[]{"hello","world","!"});
    }
}

10.可变参数列表

package c12;

public class NewVarArgs {
	static void printArray(Object... args){
		for(Object obj:args)
			System.out.println(obj+" ");
		System.out.println();
	}
	public static void main(String[] args){
		printArray(new Integer(47),new Float(3.14),new Double(11.11));
		printArray(46,3.14F,11.11);
		printArray((Object[])new Integer[]{1,2,3,4});
        printArray();
	}
}

args获取的是一个数组,所以可以用foreach语法。将0个参数传递给可变参数列表也是可以的。

可变参数列表与自动包装机制可以和谐共处,例如:

package c12;

public class AutoboxingVarargs {
	public static void f(Integer... args){
		for(Integer i:args)
			System.out.print(i+" ");
		System.out.println();
	}
	public static void main(String[] args){
		f(new Integer(1),new Integer(2));
		f(4,5,6,7,8,9);
		f(10,new Integer(11),12);
	}
}

在使用重载的时候,每个函数要添加一个非可变参数,才不会引起错误。

使用getClass方法打印出来的字符串,如果是数组会有前导"["。

11.枚举类型

使用语法如下:

public enum Spiciness {
	NOT,MILD,MEDIUM,HOT,FLAMING
}

它会创建toString()方法,方便显示某个enum实例名字。

ordinal()方法,用来表示某个特定enum常量的声明顺序

static values()方法用来按照enum常量的声明顺序,产生有这些常量构成的数组。

enum可以在switch语句内使用,例如:

package c05;

public class Burrito {
	Spiciness degree;
	public Burrito(Spiciness degree){	this.degree=degree;}
	public void describe(){
		System.out.print("This burrito is");
		switch(degree){
		case NOT: System.out.println("not spity at all");
				  break;
		case MILD:
		case MEDIUM:System.out.println("a little hot");
		            break;
		case HOT:
		case FLAMING:
		default:	System.out.println("maybe too hot");
		}
	}
	public static void main(String[] args){
		Burrito plain=new Burrito(Spiciness.NOT),
		greenChile =new Burrito(Spiciness.MEDIUM),
		jalapeno =new Burrito(Spiciness.HOT);
		plain.describe();
		greenChile.describe();
		jalapeno.describe();
	}
}

猜你喜欢

转载自blog.csdn.net/a614528195/article/details/81450410