JavaThink读书笔记

泛型

1:首先了解到的就是java泛型可以用来做元组,就行c++里的pair那样。

public class pair<F,S> { F first , S scond  ...};

2:泛型类或接口的继承或者实现,这个简单一点,如果不指定泛型的话,直接被当做object。

类似这样的都可以很快的理解 A <T,K,V> extends B<K,V> ... 

3:泛型的方法,泛型方法自己就有泛化能力,在返回值前加<T> or <T extends A> 

这个T独立于类的的泛型指定,如果该类是泛型类的话。所以不建议在一一个泛型类中泛型方法和类都用同一个字母使用同样的字母。

对于泛型类里的非泛型方法而言如果是静态的则不能使用泛型类型 如T。

4:java的泛型是擦除实现的第二泛型,所以,在一个泛型类内, K f(K a) V f(V a) 不能实现重载,因为都已经被擦除了。

当然可以指定擦除的边界 类似<T extends Object >。当类型进入或者出去的时候自动实现转型。 可以由反射提供一些解除限制的技巧,如 newstance()...

5:自限定类型 如 class myQueuep<T extends Comparable<T>>,这样的话就可以 声明的T t,t就可以调用compareTo了。

6:潜在类型机制,其使用自限定类型或者用其他的接口继承,就可以使擦除边界改变,如 5。但是反射可以提供更好的解决方法。

如 class<?> spkr=speaker.getClass();  Method mspeak=spkr.getMothod("spack"); mspeak.invoke(speaker);


数组

如何得到泛型数组(除了反射别无它法):
public static <T> T[] g(Class<T> type,int size) {
		return (T[])Array.newInstance(type,size);
	}

定义多维数组:
import java.util.ArrayList;

public class 多维数组 {
    public static void main(String[] args) {
    	//与java的泛型擦除密切相关
    	//基础类型直接用,对象类型要new空间给它,因为一开始分配的只是引用
    	ArrayList<ArrayList<ArrayList<Integer>>> ar=new ArrayList<>();
    	ar.add(new ArrayList<>());
    	ar.get(0).add(new ArrayList<>());
    	ar.get(0).get(0).add(233);
    	System.out.println(ar.get(0).get(0).get(0));
    	
    	ArrayList<ArrayList<Integer>>[][] ar1=new ArrayList[5][5];
    	ar1[2][2]=new ArrayList<>();
    	ar1[2][2].add(new ArrayList<>());
    	ar1[2][2].get(0).add(666);
    	System.out.println(ar1[2][2].get(0).get(0));
	}
}

容器 

1:Set接口和Map接口要求提供equals()方法,所有继承自这个接口(例如下面的Sortxx 和 Hashxx)的都应当提供一个恰当的equal方法(如果不提供将调用object继承来的equals()方法,比较两个引用是否相同),另外,他们都不允许存放相同元素(equals()方法返回true)。
SortedSetheSortedMap要求实现comparable接口(所有继承自他的也应该实现这个接口)
HashSet和HashMap要求提供hashCode()方法(如果不提供将调用object的hashcode()方法,是以地址计算散列码)
Sortxx 基于红黑树 Hashxx 基于散列
2:如果要创建自己类型的Map就必须再定义一个 MyMapEntry extends Map.Entry<K,V> 配合使用。
3:深入理解在Hashxx中的hashCode()与equals()的作用与实现要求,以及底层实现。
举例:对于基于散列的hash容器而言,底层有一个数组,每个对象被hash为一个数字(如果a.equals(b)==true的话,他们的hash值必须相同),
这样就可以通过数组的随机访问来确定对象的位置,当然可能会有冲突,因此数组的每个槽位保存的是Map.Entry<K,V> 对象的list(源代码对这部分调过优)。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值