面试笔记-基础篇(不定时更新)

说明
面试笔记:基础篇
博主菜鸟一枚,写此博客是记录日常学习以及面试笔记,若有不正确的地方,欢迎各路大神留言指出

Java的数据类型有那些?

  • 整数型:byte、int、short、long
  • 浮点型:double、float
  • 布尔型:boolean
  • 字符型:char
    注:String类型不是数据类型,在java中对String的定义是对象

java中有goto吗?

  • 有,在java中有goto的保留字,但目前并未使用

i++是线程安全的吗?

  • 不是线程安全的
    • 若i是方法内定义的,则是线程安全的,因为每个方法都是线程私有的
    • 若i是类的成员变量,则不是线程安全的,因为i++或者i–,都会有读值,+1或者-1,写值三个步骤,都可能有CPU调度产生,这时i值有可能会被其他线程所修改,造成脏读脏写

& 与 && 的区别

  • 共同点:
    • 都是用做逻辑与的运行符,表示And
    • 都是当运算符两边的结果为true时,整个运算结果才返回true,反之若有一方为false,整个运算结果为false
  • 不同点:
    • &&具有短路功能,&&运算符前面的运算为false,&&运算符后面的表达式不会执行,例如:
    /**
    当str为null时,后面的!str.equals("")表达式不会执行
    */
    if(str != null && !str.equals(""))
    
    • 使用&运算符会执行整个运算过程,不具备&&的短路功能,例如:
    /**
    当str为null时,后面的str.equals("")表达式也会执行,则会抛出 NullPointerException 异常
    */
    if(str != null && !str.equals(""))
    

什么是单例类?

  • 在内存中最多只能有一个对象的类

  • 单例类的构造函数必须是私有的

  • 单例类必须是自己来创建自己,别的类不能创建单例类

    /**
    如果项目在启动的时候对启动时间不做要求,则可以这样创建单例类
    如果项目在启动的时候,这个单例类不会引用过多,则可以这样创建单例类
    */
    class Person{
        private static Person instance = new Person();
        private Person(){}
        
        public static Person getInstance(){
            return instance;
        }
    }
    
    /**
    如果项目在启动的时候对启动时间有要求,则可这样创建单例类
    */
    class Person{
        private static Person instance = null;
        private Person(){}
        
        public static Person getInstance(){
            if(instance == null){
                instance = new Person();
            }
            return instance;
        }
    }
    

equals 和 == 的区别

  • ==比较的是两值时候指向是够同个对象
  • equals比较的是两值内容是否一致
    String s1 = "abc";//在内存中创建字符串对象,内容是abc
    String s2 = "abc";//在执行的时候发现已经有abc存在在内存中,所以s2会指向s1的abc,内容是abc
    String s3 = "ab" + "c";//会转化为abc,指向s1
    String s4 = new String("abc");//会在内存中重新创建一个新的字符串对象s4,内容是abc
    
    System.out.println(s1==s2);//true
    System.out.println(s1.equals(s2));//true
    System.out.println(s1.equals(s3));//true
    System.out.println(s1==s4);//false
    System.out.println(s1.equals(s4));//true
    

".java"源文件能否包含多个类?

  • 可以,但只能有一个类是public修饰的,并且public修饰的类名必须与文件名一致

Mysql中char 和 varchar 的区别

  • 都是存储字符串
  • 两者间检索不同,char是固定长度字符类型,而varchar则是可变长度字符类型
  • char的处理速度要比varchar的速度快
  • char相比于varchar会浪费存储空间
  • 若读取char数据时,尾部有空格则会丢失空格,而varchar则相反
  • 对长度变化不大,并且对查询速度有较高要求的可以优先使用char类型存储

StringBuffer 和 StringBuilder 的区别

  • 共同点:
    • 都是可变字符序列
      注:String是不可变的字符序列
  • 不同点:
    • StringBuilder
      • 不是线程安全的,不能同步访问
      • 运行效率高,若是在方法内使用,则建议使用StringBuilder
      • 若是字符串变量在方法内定义并使用的,则是线程安全的,因为一个方法只可能有一个线程去访问执行,只在一个线程内就不存在线程不安全的因素
      • 在JDK1.5以上才有
    • StringBuffer
      • 是线程安全的,若是应用在多线程环境下,则使用StringBuffer
      • 运行效率低

Overload 和 Override 的区别

  • Overload:
    • 也叫重载,表示一个类中可以有多个名称相同,参数列表各不相同的方法
  • Override:
    • 也叫重写,表示子类中可以拥有与父类中某个方法名和参数完全相同

你可能感兴趣的:(笔记)