小知识点
- main不是关键字,但是可以被jvm识别
- 静态代码块–构造代码块–构造函数,启动一个类时他们的执行顺序
- javadoc 生成帮助文档 @author @version @param @return 类要加public
- \t 制表符 \n 换行符
- super语句必须放在子类构造函数的第一行,因为要访问父类的属性初始化值
- super和this不能出现在同一个构造函数中,因为他们都必须放在第一句
- 只要创建子类对象,就一定会调用一次父类的构造函数
- 子类中的每一个构造函数的第一行都会默认有super();
- 当父类中没有空参的构造函数时,子类必须有this或super访问父类的其他构造函数
- 子类的覆盖方法的权限不能低于父类,因为子类要比父类功能强大
线程
进程:当前正在执行的程序,代表应用程序在内存中的执行区域
线程:是进程中的一个执行控制单元,一个执行路径
多线程的好处:一个进程有多个线程,提高了执行效率
开启第二个线程的两种方式:
new Thread(){
@Override
public void run() {
System.out.println("第一中方式");
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("第二种方式");
}
}){}.start();
两种方式优缺点的比较:
直接使用Thread简单方便,但是只能单继承,如果使用Runnable对象可以多实现。
String类
- String s1 = new String(“abc”);在内存中创建了几个对象?
答案:两个。一个s1对象在堆中,一个”abc”常量在常量池中。 - String s1 = “a” +”b” + “c”; String s2 = “abc”;
s1 == s2? s1.equals(s2)?
答案:true,true;因为java的常量优化机制会将s1直接变成常量”abc” - 几个类的区别
String类:不可改变的,一旦初始化就不能改变
StringBuilder:是可变序列,线程不安全,效率高,1.5出现
JAVA中的几个有意思的类
Date,DateFormat,SimpleDateFormat,Calendar,Timer,System,Runtime,Math,Random
集合
数组与集合的比较
数组的长度是固定的,可以存储基本数据类型也可以存储对象
集合的长度是可变的,只能存储对象根接口
单列集合的根接口是Collection,子接口有List和Set;
双列集合的根接口是Map,子接口有HashMap和TreeMap迭代器Iterator
Iterator本身并不具备增删的方法,所以在迭代的时候增删会出现并发修改异常。
List
可重复,有索引,有序
三个子类
- ArrayList:底层数据结构是数组结构,线程不安全,查询速度快,所以替代了Vector
- LinkList:底层是链表数据结构,线程不安全,查询慢,增删快
- Vector:底层是数组结构,线程安全,查询和增删都慢。jdk1.0出现,比集合出现的都早,已经被ArrayList替代
ArrayList可变长度的实现
ArrayList底层默认封装了一个长度为10的数组,当超出长度时,会创建一个新的数组,新数组的长度为原数组的1.5倍,并copy原数据。
set
不可重复,没有索引,无序
三个子类
- HashSet:使用哈希算法去重复,效率高,但是元素无序
- TreeSet:TreeSet是用来排序的,可以制定顺序
- LinkedHashSet:HashSet的子类,原理相同,除了去重复还能保留存储顺序,底层是链表结构
HashSet
- HashSet去重复依赖于hashCode()和equals()方法,先判断hashCode()方法
- 自定义的对象必须实现hashCode()和equals()方法;hashCode()方法属性值相同必须返回true,属性值不同尽量返回falsed
迭代
- 使用Iterator,hasMore()和next()方法
- 增强for(底层使用Iterator实现的)
TreeSet
- 依赖CompareTo()方法进行排序
- 实现比较:自定义类实现CompareTo()方法;传入匿名内部类的方法
泛型
泛型是JDK1.5出现的,非常实用。它可以运行时的异常提前到编译时,并且方便开发,在使用集合时优点特别明显。下图是个简单的示例:
通配符?和T的区别
- ?不能修饰类
- ?相当于声明了一个变量,可以直接在方法中传递
泛型限定边界
- ? extend E:接收E或者E的子类,固定了父类型
- ? super E:接收E或者E的父类,都定了子类型