常见问题之java基础

  • java有几种数据类型
    基本类型:

    数值:byte,short ,int,long
    小数类型:float,double
    布尔类型:boolean
    

    引用类型:

    类,接口,数值
    
  • 访问修饰符有哪些

    private  当前类
    default  当前类,当前包
    protected 当前类,当前包,子类
    public 当前类,当前包,子类,不同包
    
  • final的作用

    final 修饰的类不可以被继承
    final 修饰的方法不可以被重写
    final 修饰的变量不可以被修改,只是引用不能被修改,引用的内容还是可以改的
    
  • java三大特性

    封装:将一个对象内部进行隐藏通过修饰符,通过复用性和安全性
    继承:提高代码的复用性,是多态的前提
    多态:父类或者父接口可以引用子类的实例对象,提高灵活性
    
  • 抽象类和接口的对比

    相同:
    1.抽象类和接口都不能实例化
    2.都是用来继承或者实现的
    3.都包含抽象方法,子类都需要重写覆盖
    不相同:
    1. 关键字:抽象类abstract 接口 interface
    2. 构造器:抽象类可以有构造器 接口不能有构造器
    3. 方法修饰符: 抽象类可以是任意访问修饰符 接口方法只能并且默认就是public
    4. 继承:类只可以继承一个抽象类, 类可以实现多个接口
    5. 字段声明:抽象类可以是任意的, 接口只能或者默认是public static
    
  • 值传递和引用传递的区别

     值传递:方法传递参数,当为基本类型,那么是值传递,直接传递的是内容的拷贝,修改赋值不影响原来的值
     引用传递:方法传递参数,当为引用类型,那么少是引用传递,直接拷贝是内存地址,修改引用内容对原来的值有影响
     值和引用传递:本质上都是值传递,一个传递的是内容,一个传递的是地址(特殊内容),一个是内容拷贝,一个是地址拷贝,重新对这两种类型的参数赋值都不影响原来的变量
    
  • String和StringBuffer、StringBuilder的区别

    可变性:
    1.不可变:String对象是不可变的,底层的数据结构为 private final char[]
    2.可变: StringBuffer、StringBuilder 是可变的,底层的数据结构为 char[] value
    线程安全性
    1.线程安全的:StringBuffer,String是线程安全的,StringBuffer加了同步锁,String不可再次写只可读
    2.线程不安全的: StringBuilder线程不安全,没有进行同步
    使用方式
    1.少量字符串操作用String
    2.线程安全用StringBuffer
    3.线程不安全但是要效率用StringBuilder
    
  • bio,nio,aio的区别

    1.bio就是我们使用的传统io,读写阻塞,需要开单独线程处理,并发能力低
    2.nio就是bio的升级,也叫做非阻塞io,提供了Buffer,Channel,Selector的方式实现和操作io,实现多路复用
      并发负载能力高
    3.aio是nio2版本,也叫做异步非堵塞 io ,异步 io 的操作基于事件和回调机制。
    
  • hashCode和equals方法

    1.在使用Hash相关类型集合的时候,HashSet,HashMap,在判断是不是一个对象的时候,
      是hashCode和equals方法同时返回true,才会认为是同一个对象,才会进行覆盖,否则当做一个新对象存储
    2.Long,Integer...这些基本类型都帮我们重写好了hashCode和equals方法,可以通过
     hashCode和equals方法唯一标识一个对象,我们可以直接使用不会有问题
     3.我们自定义的类,会直接继承Object的hashCode方法,直接返回内存地址,那么直接new一个对象
       肯定hashCode不会相等,那么在使用HashSet,HashMap就永远都不是同一个对象
     4.如果你定义的类不会用到Hash相关的集合操作,那么可以不重写hashCode和equals方法
     5.使用了lombok插件的添加相关注解已经重写了hashCode和equals方法
    	 public int hashCode() {
          
          
            int PRIME = true;
            int result = 1;
            Object $userId = this.getUserId();
            int result = result * 59 + ($userId == null ? 43 : $userId.hashCode());
            Object $userName = this.getUserName();
            result = result * 59 + ($userName == null ? 43 : $userName.hashCode());
            Object $appName = this.getAppName();
            result = result * 59 + ($appName == null ? 43 : $appName.hashCode());
            return result;
        }
      public boolean equals(final Object o) {
          
          
            if (o == this) {
          
          
                return true;
            } else if (!(o instanceof AccountCreateDto)) {
          
          
                return false;
            } else {
          
          
                ......
        }
    
  • Hash相关集合使用String做Key的好处

     使用String作为key的速度更快,因为比较hashCode的时候,String的不需要重写计算Hash,
     已经当做String对象的hash属性缓存下来了
     public int hashCode() {
          
          
        int h = hash;
        if (h == 0 && value.length > 0) {
          
          
            char val[] = value;
    
            for (int i = 0; i < value.length; i++) {
          
          
                h = 31 * h + val[i];
            }
            //缓存计算的hash值
            hash = h;
        }
        //如果有,直接返回
        return h;
    }
    
  • 常用的集合类

    1.主要是两个接口 Collection 和 Map
      Collection子接口:Set, List,Queue
      Map接口:没有细分子接口
    2.常见实现
      List:ArrayList、LinkedList、Stack,Vector
      Set:HashSet、TreeSet、LinkedHashSet
      Map:HashMap、TreeMap、Hashtable、ConcurrentHashMap
    3.Set,List,Map特性
      Set: 允许存入null,不允许重复
      List: 允许存入多个null,允许重复
      Map: 存储的是键值对,key可以为null,不允许重复key
    
  • ArrayList 和 LinkedList 的区别

    1.ArrayList底层用的数组,LinkedList底层是双向链表
    2.ArrayList随机访问效率高,直接通过数组下标(O(1));LinkedList随机访问效率差点,需要移动指针(O(n))
    3.ArrayList添加/删除效率低,设计到扩容素组元素移动;LinkedList的插入删除直接改变指针的指向
    4.ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全
    
  • HashMap 与 HashTable 区别

    1.HashMap非线程安全,HashTable线程安全
    2.HashMap的key可以为null,HashTable的key不能为null
    3.HashMap底层数据结构是数组+链表+红黑树,HashTable底层数据结构没做优化依然是数组+链表
    4.HashMap初始大小是16,扩容为2倍,HashTable初始大小是11,扩容2n+1
    

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/105664821