内部类和匿名内部类
内部类:可以使用外部的变量
匿名内部类:可以使用外部的类变量或者实例变量或者final修饰的局部变量
//比如这种写法是Runnable匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
//这种是内部类,RunnableTests可以重用
new Thread(RunnableTest).start();
Runnable RunnableTest = new Runnable() {
@Override
public void run() {
}
};
String,StringBuffer与StringBuilder
Java基础之String,StringBuffer与StringBuilder的区别及应用场景
抽象类和接口
抽象类首先它是类只能继承,并且只能继承一个。接口可以实现多个。
抽象类它是is的关系,接口是have的关系。
抽象类可以实现部分方法逻辑,接口只能是方法。
使用场景常常是在抽象类中写接口,将接口暴露出去,可以实现回调等操作。
多态
接口实现,继承父类进行方法重写,同一个类中进行方法重载。
多态存在的三个必要条件:要有继承;要有重写;父类引用指向子类对象。
class A ...{
public String show(D obj)...{
return ("A and D");
}
public String show(A obj)...{
return ("A and A");
}
}
//继承
class B extends A...{
public String show(B obj)...{
return ("B and B");
}
//重写
public String show(A obj)...{
return ("B and A");
}
}
//使用,父类引用指向子类对象
A a =new B();
a.show(new B());
结果输出B and A
A a =new B()向上转型了,所以a中方法为A and D;B and A
向上转型和向下转型
向上转型:在运行时,会遗忘子类对象中与父类对象中不同的方法。也会覆盖与父类中相同的方法–重写。(方法名,参数都相同)
向下转型:在向下转型之前,它得先向上转型;向下转型只能转型为本类对象。
集合
1、collecton集合,用来表示任何一种数据结构
2、Collection集合接口,指的是java.util.Collection接口,是Set、list和Queue接口的超类接口
3、Collection集合工具类,指的是java.util.Collections类4
1、List关注事物的索引列表
2、Set关注事物的唯一性
3、Queue关注事物被处理时的顺序
4、Map关注事物的映射和键值的唯一性
List接口
List关心的是索引,与其他集合相比,List特有的就是和索引相关的一些方法:get(int index) 、 add(int index,Object o) 、 indexOf(Object o) 。
ArrayList 基于数组,可以将它理解成一个可增长的数组,它提供快速迭代和快速随机访问的能力。不是同步的,多线程中要管理线程同步问题。
LinkedList 中的元素之间是双链接的,适合添加和删除
Vector 基于数组,是ArrayList的线程安全版本,性能比ArrayList要低,是线程同步的
Set接口
Set关心唯一性,它不允许重复。无序
HashSet 以HashMap为基础以key作为存储项,当不希望集合中有重复值,并且希望按照元素的插入顺序进行迭代遍历时可使用此类。
LinkedHashset 当不希望集合中有重复值,并且希望按照元素的插入顺序进行迭代遍历时可采用此类。
TreeSet 有序,当不希望集合中有重复值,并且希望按照元素的自然顺序进行排序时可以采用此类。
(自然顺序意思是某种和插入顺序无关,而是和元素本身的内容和特质有关的排序方式,譬如“abc”排在“abd”前面。)
Queue接口
Queue用于保存将要执行的任务列表
LinkedList 同样实现了Queue接口,可以实现先进先出的队列。
PriorityQueue 用来创建自然排序的优先级队列。
Map接口
Map关心的是唯一的标识符。他将唯一的键映射到某个元素。当然键和值都是对象。
HashMap 当需要键值对表示,又不关心顺序时可采用HashMap。是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值放在哪里,元素成对,元素可为空
Hashtable 它是HashMap的线程安全版本,元素成对,线程安全,元素不可为空。
LinkedHashMap 当需要键值对,并且关心插入顺序时可采用它。
TreeMap 当需要键值对,并关心元素的自然排序时可采用它。
final修饰的可不可以改变
final代表对象不可改变。
final修饰类,类不能被继承。
final修饰方法,方法不能被重写。
final修饰变量,首次可以被赋值,其余不能赋值。
但final修饰list,map,StringBuffer等时,内部值是可以变化的。
final的意思是地址不能改,但是地址指向的内容当然可以改。list的add,remove等操作只改变了对象的内容,未改变地址。但你再次new List()时会报错,因为在更改对象地址。