java基础二

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 常见的异常

  1. 空指针异常(Nullpointerexception)
  2. 数组索引越界异常(ArrayIndexOutOfBoundsException)
  3. 指定的类不存在(Classnotfoundexception)
  4. 方法不存在(NoSuchMethodException)
  5. 文件未找到(FileNotFoundException)

1.4.2 类的加载机制

加载,连接,初始化

1.4.3 java类的加载顺序

  1. 父类静态代码块
  2. 子类静态代码块
  3. 父类构造代码块
  4. 父类构造方法
  5. 子类构造代码块
  6. 子类构造方法

1.5 集合

1.5.1  分类java中的集合分为单列集合collection和双列集合map

collection的子接口:

  • list:有序不可重复
  1. ArryList:基于数组实现的,长度可变的数据结构,,允许null当元素,默认长度是10,一次增长0.5倍,其容量是原来的1.5倍
  2. LinkedList:是基于链表实现的,提供最佳顺序存取,适合插入和移除元素,由这个类定义的链表也可以像栈或队列一样,适合插入和移除元素,特点是改快读慢
  • set:无序可重复
  1. HashSet:实现了HashMap,底层是数组加链表,元素不允许重复,无序
  2. TreeSet:底层是红黑树,实现元素排序

map的实现类:双列集合,用于存放键值对,键值是唯一的,不可重复

  1. HashMap:底层是由数组加链表实现的,线程不安全,效率高
  2. TreeMap:底层是红黑树,实现元素排序
  3. linkedHashmap:底层是HashMap和linkedList,通过hashMap实现存放键值对,通过链表实现元素有序

1.5.2 HashMap和HashTable的区别

相同点:

都是存储键值对的集合,底层都是数组加链表

不同点:

  1. 继承父类不同:hashTable继承Dictionary类,hashMap继承AbstractMap类,都实现了Map接口
  2. 线程安全不同:hashTable中的方法是synchronize的,而hashMap中的方法在缺省情况下是非synchronize的,在多线程并发的情况下,hashtable不需要为他的方法实现同步,hashmap则需要实现同步
  3. hashTable不允许null为元素,hashMap允许键或者值是null

1.5.3 集合排序

  1. 实现compare接口,重写compareTo()方法
  2. 构造事传入comparator<T>,重写compare()方法
  3. 使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值