美文网首页
Java Basis

Java Basis

作者: 最黑暗的自己 | 来源:发表于2020-01-27 11:29 被阅读0次

    一、Java Object类方法:
    1,构造函数
    2,hashCode和equals函数用来判断对象是否相同
    equals:判断两个对象是否相等(两个对象的地址是否相等)
    ==:(判断两个对象的地址是不是相等,默认等同于equals)
    1)、如果两个对象相等,那么它们的hashCode()值一定相同。
    这里的相等是指,通过equals()比较两个对象时返回true。
    2)、如果两个对象hashCode()相等,它们并不一定相等。
    3,wait(),wait(long),wait(long,int),notify(),notifyAll()
    4,toString()和getClass,
    toString():toString() 输出一个对象的地址字符串(哈希code码)
    5,clone()
    6,finalize()用于在垃圾回收
    释放资源

    二、HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理
    1、HashMap原理(数组+链表)
    (1)hashmap.put(K key, V value):写入键值对
    根据key的keyCode计算hash值,查找hash值在table中的索引,通过索引位置得到Entry,若不为空,通过循环不断遍历链表查找是否在链表中有相同的Entry,当出现插入值得的key和hash相同的Entry,则覆盖原有value,如果key值不同,则存储新值(链表形式,且放在链头部),并返回原始值,否则新增Entry,将key、value添加到i索引处。
    (2)hashmap.get(Object key):读取值
    根据key值的hashcode值计算hash码,根据hash码取出索引处的Entry,entry.next(),不断遍历,直到找到entry的key与hash与被搜索的key、hash相同时,取出value值。
    (3)hashMap扩容:
    loadFactor默认0.75,数组大小为16,160.75=12,当超过12时,就得扩容216=32;
    2、Hash冲突
    如果两个不同对象的hashCode相同,这种现象称为hash冲突。

    三、HashMap 和 HashTable 区别
    1、HashTable是线程安全的,而HashTable非线性安全,Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合。
    2、hashmap可以使用null作为key,当key为null时,总是存储在table数组的第一个节点上,hashtable不允许使用key为null。
    3、hashmap继承了AbstractMap,hashtable则是继承Dictionary抽象类,两者都实现了map接口。
    4、hashmap的初始容量为16,hashtable则是11,填充因子都是0.75
    5、扩容方法:hashmap是当前容量翻倍,hashtable是容量翻倍+1
    6、两者都是数组+链表的结构
    7、判断是否含有某个键的方式:hashmap 使用containsKey()方法判断,hashtable使用get()方法判断是否含有某个键。因为在hashmap中null可以作为键,当get()得到null时,既可表示hashmap中没有该键,也可表示该键所对应的键值为null。
    8、两者计算hash的方式不同
    hashtable:直接使用key的hashcode对table数组长度进行取模。

    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;
    

    hashmap:对key的hashcode进行二次hash,然后对table数组长度取模。

    static int hash(int h) {
         h ^= (h >>> 20) ^ (h >>> 12);
         return h ^ (h >>> 7) ^ (h >>> 4);
     }
    
    static int indexFor(int h, int length) {
         return h & (length-1);
     }
    

    四、HashCode 作用,如何重载hashCode方法
    参考:https://juejin.im/post/5a4379d4f265da432003874c
    hashcode作用:
    hashcode用于返回对象的hash值,主要用于查找的快捷性,hashcode是object对象中就有的,在hashtable和hashmap中都是通过hashcode查找在散列表中的位置。
    重载hashcode方法:
    覆盖equals方法时,总要覆盖hashcode方法。
    1.给int变量赋值
    2.为对象中每个有意义的字段计算出一个散列码
    3.合并
    4.返回结果
    5.验证结果,确保相同的对象有相同的散列码

    五、ArrayList与LinkedList区别与联系
    区别:
    参考:https://blog.csdn.net/qq_33300026/article/details/79232006
    1、arraylist的实现是基于数组,linkedlist则是基于双向链表。
    2、对于查询arraylist优于linkedlist,arraylist的查询根据下标以O(1)的时间复杂度对元素进行访问,而linkedlist的每个元素都依靠地址指针和它的后一个元素连接在一起,查找某个元素的时间复杂度是O(n)。
    3、对于插入和删除操作linkedlist优于arraylist,arraylist插入或删除时需要重新计算大小或更新索引。
    4、linkedlist比arraylist更占内存,linkedlist的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素
    联系:
    两者都是list类型,实现了基本的list接口

    六、GC机制
    参考:https://blog.csdn.net/antony9118/article/details/51375662
    垃圾回收机制:在系统的运行的过程中,会产生一些无用的对象,若果不对清理回收这些无用对象的内存,可能会导致内存的耗尽,所以垃圾回收机制回收的是内存包括堆区和方法区的内存。
    回收的特点:当进行垃圾回收的时候,不论何种GC算法除了垃圾回收的线程之外其他任何线程都要停止,停止的线程将在垃圾回收完成之后恢复进行,算法的不同就是减少停止的时间。

    七、Java反射机制,Java代理模式
    (1)反射机制:
    对于任何一个类,都能够获得这个类的所有属性和方法,对于任何一个对象都能调用它的任意一个方法和属性(包括私有方法和属性),这种动态获取信息以及动态调用对象的方法的功能就称为java语言的反射机制。

    使用反射机制:
    先获取到该类的字节码文件对象(.class),通过字节码文件对象,就可以通过该类中的方法获取到我们想要的所有信息。

    获取字节码文件对象的方式:
    1、Class z=Class.forName("类名")
    2、Class z1=person.class
    3、Class z2=p.getClass()//类的实例获取

    反射api:
    1、User user=(User)z.newInstance();//通过字节码对象创建实例对象,无参
    2、
    //获取有参构造器
    Constructor con=(User)z.getConstructor(int.class,String.class);
    User u=(User)con.newInstance(12,"as");
    3、获取成员变量并使用
    User user=(User)z.newInstance();
    Field field=z.getDeclaredField("id");//成员变量私有
    field.setAccessible(true);//打开可见权限
    field.setInt(user,5);//赋值
    field.getInt(obj);//获取成员变量的值
    4、获得方法
    User user=(User)z.newInstance();
    Method method= z.getMethod("eat");
    method.invoke(user);//调用方法

    Method method=z.getMethod("sing",String.class);
    method.invoke(user,"aaa");//带String参数

    Method method=z.getDeclaredMethod("say");
    method.setAccessible(true);//私有方法
    method.invoke(user);
    (2)Java代理模式
    自己能做的事情,让别人代替来做
    静态代理模式
    动态代理(JDK代理)
    Cglib代理

    静态代理模式:真实角色和代理角色都实现了同一角色(抽象角色),代理角色实现的是抽象接口(java多态特性)
    动态代理:只有真实角色实现了接口,代理角色实现的是jdk的内置接口InvocationHandler(Proxy.newProxyInstance来创建一个代理实例从而进行代理)

    八、Java泛型
    泛型(泛型类,泛型接口,泛型方法):参数化类型


    image.png

    泛型逻辑上可以看成是多个不同的类型,实际上是相同的基本类型。(类型擦除)
    类型通配符一般是使用 ? 代替具体的类型实参

    九、Synchronized原理
    synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。
    (1)修饰普通方法

    (2)修饰静态方法(static)

    (3)修饰代码块

    十、Volatile实现原理
    参考:https://blog.csdn.net/devotion987/article/details/68486942
    volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性。
    1、防重排序
    2、实现可见性
    线程本身并不直接与主内存进行数据的交互,而是通过线程的工作内存来完成相应的操作,这也是线程间数据不可见的本质原因。
    对Volatile变量的写操作与普通变量的主要区别
    (1)修改volatile变量时会强制将修改后的值刷新到主内存中
    (2)修改volatile变量后会导致其他线程工作内存中对应的变量值失效。因此在读取该变量值的时候就需要重新读取主内存中的值
    3、保证原子性(volatile只能保证对单次读/写的原子性)

    十一、方法锁、对象锁、类锁的意义和区别

    七、SparseArray

    相关文章

      网友评论

          本文标题:Java Basis

          本文链接:https://www.haomeiwen.com/subject/edqxtqtx.html