java基础二
1.2 常用类
string str = new string("i") 和string str = "i"有什么区别
内存分配不一样,string str = "i",java虚拟机会分配到常量池中,string str = new string("i")会分配到堆内存中 ,会创建2个对象
1.3 面向对象
1.3.1 接口和抽象类的区别
接口可以多实现,抽象类只能单继承
接口中没有构造方法,抽象类中有构造方法,需要子类对访问父类的变量初始化
接口有常量,抽象类中既有普通成员变量,也有常量
接口中只能定义为抽象方法,默认修饰符:public abstract,抽象类中有抽象方法,也有普通方法,有抽象方法的类,定义为抽象方法
接口只能被public修饰,抽象类可以被public,protected,和default修饰
1.3.2 重载和重写的区别
重写:子类存在与父类方法声明完全一样的方法
重载:在同一个类中,方法名相同,参数列表不同,与返回值无关
1.3.3 父类中的静态方法能否被重写
不能,重写只适用于实例方法,而子类中存在与父类相同的静态方法,我们成为隐藏
1.4 异常
1.4.1 常见的异常
- 空指针异常(Nullpointerexception)
- 数组索引越界异常(ArrayIndexOutOfBoundsException)
- 指定的类不存在(Classnotfoundexception)
- 方法不存在(NoSuchMethodException)
- 文件未找到(FileNotFoundException)
1.4.2 类的加载机制
加载,连接,初始化
1.4.3 java类的加载顺序
- 父类静态代码块
- 子类静态代码块
- 父类构造代码块
- 父类构造方法
- 子类构造代码块
- 子类构造方法
1.5 集合
1.5.1 分类java中的集合分为单列集合collection和双列集合map
collection的子接口:
- list:有序不可重复
- ArryList:基于数组实现的,长度可变的数据结构,,允许null当元素,默认长度是10,一次增长0.5倍,其容量是原来的1.5倍
- LinkedList:是基于链表实现的,提供最佳顺序存取,适合插入和移除元素,由这个类定义的链表也可以像栈或队列一样,适合插入和移除元素,特点是改快读慢
- set:无序可重复
- HashSet:实现了HashMap,底层是数组加链表,元素不允许重复,无序
- TreeSet:底层是红黑树,实现元素排序
map的实现类:双列集合,用于存放键值对,键值是唯一的,不可重复
- HashMap:底层是由数组加链表实现的,线程不安全,效率高
- TreeMap:底层是红黑树,实现元素排序
- linkedHashmap:底层是HashMap和linkedList,通过hashMap实现存放键值对,通过链表实现元素有序
1.5.2 HashMap和HashTable的区别
相同点:
都是存储键值对的集合,底层都是数组加链表
不同点:
- 继承父类不同:hashTable继承Dictionary类,hashMap继承AbstractMap类,都实现了Map接口
- 线程安全不同:hashTable中的方法是synchronize的,而hashMap中的方法在缺省情况下是非synchronize的,在多线程并发的情况下,hashtable不需要为他的方法实现同步,hashmap则需要实现同步
- hashTable不允许null为元素,hashMap允许键或者值是null
1.5.3 集合排序
- 实现compare接口,重写compareTo()方法
- 构造事传入comparator<T>,重写compare()方法
- 使用collections.sort(集合对象,comparator<T>比较的匿名对象)
1.5.4 数组和list转换
数组转list:Arrays.asList(array)
list转数组:list.toArry()
1.5.5 collections和collection区别
collections:是一个包装类,包含了很多静态方法,不能被实例化,相当于一个工具类
collection:是一个集合接口,提供对集合对象的基本操作的通用接口方法,所有集合是他的子类:list,set
1.5.6 hashmap是线程不安全的
1.5.7 hashmap1.7和1.8的区别
1.7及之前的版本,hashmap又叫散列链表,基于一个数组以及多个链表实现,hash值冲突时,就将对应节点以链表形式储存
使用一个entry数组来存储数据,用key的hashcode取模来决定key在数组中的位置,如果hashcode值相同,或者hashcode取模后相同,那么这些key会被定位到数组的同一个格子里,这些key就会形成一个链表
如果所有key的hashcode值都相同,则这个链表会很长,那么put/get就需要遍历这个链表,也就说时间复杂度会退化到0(n)
jdk1.8,当同一个hash值的链表节点数不少于8,不以单链表形式存储,会被调整为红黑树
使用一个node数组来存储数据,但这个数组可能是链表结构,也可能是红黑树
- 如果插入的key的hashcode相同,那么这些key也会定义到node数组的同一个格子里
- 如果同一个格子里的key不超过8个,使用链表储存
- 如果超过了8个,会调用treeifbybin函数,将链表转为红黑树
所以即使hashcode值相同,由于红黑树的特点,查找某个特定元素,也需要0(logn)
注意:key的对象,必须实现了compare接口
jdk1.8的hashmap慢于jdk1.8