每周总结

1.为什么匿名内部类参数必须为final类型


内部类使用外部类的局部变量时,其实是内部类的对象在使用它,
而内部类访问外部方法中的局部变量时,外部方法的局部变量可能已经不存在了,
那么就得为其延续生命,拷贝到内部类中,然而拷贝会带来不一致性,从而需要使用final保持一致性。

2.多态问题之向上转型和向下转型+动态绑定

多态::是指向同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
    ----只有非私有的实例方法才是多态的,私有方法、静态方法、域都不是多态的---
向上转型:能把子类对象当做父类对象来使用。
    有方法的缺失,但转型是安全的。
动态绑定:如果子类重写了父类中的方法,向上转型后使用父类的引用调用这些重写的方法就会调用子类中重写的方法。
向下转型:对象向下转型时,存在一个问题:
	若一个父类A的引用a,指向一个子类B的实例,将a赋值给另一个子类C引用时,会抛出java.lang.ClassCastException异常;
	抛出异常后程序将不能继续向下执行,为了避免这个异常的抛出,我们可以通过instanceof关键字判断引用指向的实例是否可以进行强制转换成某个子类对象

//已知Animal类有两个子类Dog和Cat:
    public class Demo{
      	public static void main(String[]args){
          	Animal a = new Dog();
          	check(a);
      	}
      	//设计一个方法,判断一个动物是猫还是狗
      	public static void check(Animal a){
          	if(a instanceof Dog){
            	System.out.println("狗");
          	}else if(a instanceof Cat){
            	System.out.println("猫");
          	}
      	}
    }


package lainxi01;

/**
 * 多态的好处
 * 正是因为java采用的是动态绑定,保证了向上转型总是能够产生正确的行为
 * 因此在一定程度上消除类型间的耦合性
 * 下面的程序中,设计draw方法让其接受父类Shape类型的参数,
 * 因为是向上转型
 * 所以此方法能接受所有的Shape的子类对象
 * 因为是动态绑定,所以s总能找到正确的print()方法
 * @author nice
 *
 */
class Shape{
	void print() {
		System.out.println("Shape");
	}
}

class Circle extends Shape {
	void print() {
		System.out.println("Circle");
	}
}

class Rectangle extends Shape{
	void print() {
		System.out.println("Rectangle");
	}
}

class Square extends Shape{
	void print() {
		System.out.println("Square");
	}
}
public class DrawShape {
public static void main(String[] args) {
	Shape s = new Shape();
	s.print();
	s = new Circle();//向上转型
	s.print();
	s =new Rectangle();//向上转型
	s.print();
	s = new Square();//向上转型
	s.print();
}
}

3.0单例设计模式之懒汉式饿汉式

单例设计模式


4.泛型擦除

程序编译的时候会将泛型去掉,成为泛型的擦除(生成的class文件不带泛型)---是为了兼容运行的类加载器。


5.0什么是哈希表

是一个元素为链表的数组,综合了数组和链表的好处(类似新华词典)


6.0集合的使用技巧

 需要唯一吗需要制定顺序吗需要频繁增删吗
TreeSet需要需要 
HashSet需要不需要 
LinkedHashSet需要可预知迭代顺序 
LinkedList不需要 需要
ArrayList不需要 不需要
HashMap/HashTablekey唯一 仅用于查询
LinkedHashMapkey唯一 如果经常修改
    

7.0如何记录每个容器的结构和所属的体系

看名字,后缀名就是该集合所属的体系,前缀名就是该集合的数据结构。

看到array就想到数组---查询快,有角标

看到Link就想到链表---增删快,有add get removeFirst/last 等方法

看到hash就想到哈希表--就想到唯一性,就想到元素需要重写hashcode和equals方法


8.0TreeMap自定义排序需要实现Comparator接口或者重写compareTo方法?

compreTo是元素具有比较性,让元素所属的类来实现,(自然排序,无参构造)

comparator是集合具备比较性,需要建立一个自己的比较方法(比较器排序,有参构造)

这篇文章讲了TreeSet中比较元素排序的两种方法


9.0HashSet 存储相同的却只存储了一个呢

通过查看add源码得知,依赖hashcode()和equals()方法-----首先比较哈希值,如果相同,比较地址值或equals(),如果不同就添加到集合中。

那这样就清晰了,如果不重写hashcode()方法和equals()方法,默认使用Object的方法,一般来说不相同。但是还有一句话


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值