JAVA基础知识点

1、java中原始数据类型有哪些?它们的大小及对应的封装类型是什么?

        boolean 数据类型非true 即 false ,数据类型表示1bit

        boolean                    Boolean

        byte        1byte         Byte

        short        2bytes      Short

        int            4bytes      Integer

        long         8bytes      Long

        float         4bytes      Float

        double     8bytes      Double

        char        2bytes       Character

2、"=="与"equal()"区别?

        "=="判断的是两个对象的内存地址是否一样 适用原始数据类型和枚举类型

        "equal()" 是Object类的方法 Object对它的实现是比较内存地址,我们可以重写这个方法来自定义

        比较原始数据类型和枚举类型使用 "==",对于引用类型的相等性比较 应该适用equal();

3、java中的四种引用及其使用场景市什么?

        强引用:通常我们使用 new 操作符创建一个对象时所返回的引用即为强引用

        软引用:若一个对象只能通过软引用到达,那么这个对象在内存不足时会 被回收,可用于图片缓存中,内存不足时系统会自动回收不再使用的Bitmap

        弱引用:若一个对象只能通过弱引用到达,那么它就会被回收(即使内存 充足),同样可用于图片缓存中,这时候只要 Bitmap 不再使用就会被回收

        虚引用:虚引用是 Java 中最的引用,通过它甚至无法获取被引用的对象,它存在的唯一作用就是当它指向的对象回收时,它本身会被加入到引用队列中,这样我们可以知道它指向的对象何时被销毁。

4、object 中定义了哪些方法?

        clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()

5、ArrayList, LinkedList, Vector 的区别是什么?

        ArrayList: 内部采用数组存储元素,支持高效随机访问,支持动态调整大小      
        
        LinkedList: 内部采用链表来存储元素,支持快速插入 / 删除元素,但不支
持高效地随机访问
        Vector: 可以看作线程安全版的 ArrayList
6、String, StringBuilder, StringBuffer 的区别是什么?

          String: 不可变的字符序列,若要向其中添加新字符需要创建一个新的 String 对象

          StringBuilder: 可变字符序列,支持向其中添加新字符(无需创建新对象)StringBuffer: 可以看作线程安全版的 StringBuilder
7、Map, Set, List, Queue Stack 的特点及用法。
        Map: Java 中存储键值对的数据类型都实现了这个接口,表示 映射表 。 支持的两个核心操作是 get(Object key) 以及 put(K key, V value) ,分别用来获取键对应的值以及向映射表中插入键值对。
        Set: 实现了这个接口的集合类型中不允许存在重复的元素,代表数学意义上的“ 集合 。它所支持的核心操作有 add(E e) , remove(Object o) , contains(Object o) ,分别用于添加元素,删除元素以及判断给定元素是否 存在于集中。
        List: Java 中集合框架中的列表类型都实现了这个接口,表示一种有序序列。支持 get(int index) , add(E e) 等操作。
        Queue: Java 集合框架中的队列接口,代表了 先进先出 队列。支持 add(E element) , remove() 等操作。
        Stack: Java 集合框架中表示堆栈的数据类型,堆栈是一种 后进先出 的数
据结构。支持 push(E item) , pop() 等操作。
8、 HashMap HashTable 的区别
        HashTable 是线程安全的,而 HashMap 不是
        HashMap 中允许存在 null 键和 null 值,而 HashTable 中不允许
9、HashMap 的实现原理
        简单介绍jdk1.7和jdk1.8区别
                1.7  数组+链表 1.8 数组+链表+红黑树
                1.7 采用头插法 1.8 采用尾插法
                1.7 hash  1.8 简化hash算法
                1.7 扩容 需要重新计算hash值  1.8 改变位置 或者改变索引+改变原数组长度

hashMap死循环头 插法 + 链表 + 多线程并发 + HashMap 扩容 解决有效方法 就是采用安全容器ConcurrentHashMap

HashMap 死循环的常用解决方案有以下 3 个:

                使用线程安全容器 ConcurrentHashMap 替代(推荐使用此方案)。

                使用线程安全容器 Hashtable 替代(性能低,不建议使用)。

                使用 synchronized 或 Lock 加锁 HashMap 之后,再进行操作,相当于多线程排队执行(比较麻烦,也不建议使用)。

                如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap。

解决hash冲突的方法有很多,HashMap底层是通过链表来解决hash冲突的。

transient Entry[] table;//存储元素的实体数组
  
 transient int size;//存放元素的个数
  
 int threshold; //临界值   当实际大小超过临界值时,会进行扩容threshold = 加载因子*容量
 
 final float loadFactor; //加载因子
  
 transient int modCount;//被修改的次数

 hashMap 默认初始容量16 默认负载系数0.75
 默认初始容量(数组默认大小):16,2的整数次方static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;   
 最大容量static final int MAXIMUM_CAPACITY = 1 << 30; 
 默认负载因子static final float DEFAULT_LOAD_FACTOR = 0.75f;
 装载因子用来衡量HashMap满的程度,表示当map集合中存储的数据达到当前数组大小的75%则需要进行扩容 链表转红黑树边界static final int TREEIFY_THRESHOLD = 8;
 红黑树转离链表边界static final int UNTREEIFY_THRESHOLD = 6;
 哈希桶数组transient Node<K,V>[] table; 
 实际存储的元素个数transient int size; 
 当map里面的数据大于这个threshold就会进行扩容int threshold   阈值 = table.length * loadFactor
 
 哈希表为解决冲突,可以采用地址法和链地址法等来解决问题,Java中HashMap采用了链地址法。

10、TreeMap, LinkedHashMap, HashMap 的区别是什么?

        HashMap 的底层实现是散列表,因此它内部存储的元素是无序的;
        TreeMap 的底层实现是红黑树,所以它内部的元素的有序的。排序的依据 是自然序或者是创建 TreeMap 时所提供的比较器(Comparator)对象。
        LinkedHashMap 可以看作能够记住插入元素的顺序的 HashMap
11、Collection Collections 的区别是什么?
         Collection 是 Java 集合框架中的基本接口;
         Collections Java 集合框架提供的一个工具类,其中包含了大量用于操作或返回集
合的静态方法
12、 对于 “try-catch-finally” ,若 try 语句块中包含 “return” 语句, finally 语句块会 执行吗?
        会执行。只有两种情况 finally 块中的语句不会被执行:
                1.调用了 System.exit() 方法;
                2.JVM“ 崩溃 了。
13、Override, Overload 的含义与区别
        

        1、目的

              overload用于增加程序的可读性(做法不同但是做的同一事情)。 override用于提供其超级类已经提供的方法的特定实现。

2、范围
        overload 在相同的类范围内内执行。 override发生在两类具有继承(继承)的关系。

3、参数

        overload参数必须不同,override参数必须相同。

4、多态性

        overload 静态多态,调用的函数在编译时被选中。 override 是运行时多态性的。

5、返回类型

        overload中可以相同或不同。但你必须改变参数。 override必须是相同的或协变的。

1.重写必须继承,重载不用。
2. 重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。
3. 重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
4. 重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常
总的来说,方法重载就是同名不同参.

14、接口与抽象类的区别

        抽象类中可以包含属性,方法(包含抽象方法与有着具体实现的方法),常量;接口只能包含常量和方法声明。
        
        抽象类中的方法和成员变量可以定义可见性(比如 public private 等);而接口中的方法只能为 public (缺省为 public )。
        一个子类只能有一个父类(具体类或抽象类);而一个接口可以继 承一个多个接口,一个类也可以实现多个接口。
        子类中实现父类中的抽象方法时,可见性可以大于等于父类中的; 而接口实现类中的接口 方法的可见性只能与接口中相同(public)。
15、线程池的用法与优势
        
        优势: 实现对线程的复用,避免了反复创建及销毁线程的开销;使用线程
池统一管理线程可以减少并发线程的数目,而线程数过多往往会在线程上
下文切换上以及线程同步上浪费过多时间。
        用法: 我们可以调用 ThreadPoolExecutor 的某个构造方法来自己创建一个
线程池。但通常情况下我们可以使用 Executors 类提供给我们的静态工厂
方法来更方便的创建一个线程池对象。创建了线程池对象后,我们就可以
调用 submit 方法提交任务到线程池中去执行了;线程池使用完毕后我们
要记得调用 shutdown 方法来关闭它。

希望本文章能够帮助到你们,后续会继续更新内容,有需要程序猿扫上面二维码,可以和我交流,如果文章不对请大家指正,谢谢大家! 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值