zoukankan      html  css  js  c++  java
  • 建议反复观看!精选高频java面试题20道,助你跳槽加薪!

    面向对象的特征有哪些方面?

    ① 抽象:抽象分为数据抽象和过程抽象两方面。
    数据抽象:针对对象的属性,比如建立一个鸟这样的类,鸟会有以下特征,两个翅膀,两支脚,有羽毛等等特性,写成类都是鸟的属性
    过程抽象:针对对象的行为特征,比如鸟会飞,会跳等等,这些方面的就会抽象为方法,即过程,写成类都是鸟的方法
    ② 继承:继承是从已有类得到继承信息创建新类的过程
    ③ 封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
    ④ 多态:多态是同一个行为具有多个不同表现形式或形态的能力(方法的重写)

    访问修饰符public,private,protected(不写修饰符默认只能同一包下访问)

    基本数据类型

    • 字符类型:byte,char
    • 基本整型:short,int,long
    • 浮点型:float,double
    • 布尔类型:boolean
      ps: String不是基本数据类型,是final修饰的java类

    精度丢失问题(如何判定单双精度)

    • float: float f = 3.4是否正确
      不正确。3.4是双精度,将双精度型(double)赋值给单精度型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F。
    • double: 为了防止double精度丢失问题,可以使用java.math包中提供的API类BigDecimal用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。
    double a = 1;
    double b = 20.2;
    double c = 300.02;
    BigDecimal a1 = new BigDecimal(Double.toString(a));
    BigDecimal b1 = new BigDecimal(Double.toString(b));
    BigDecimal c1 = new BigDecimal(Double.toString(c));
    double result = (a1.add(b1).add(c1)).doubleValue();
    System.out.println(result);
    
    

    int和Integer有什么区别

    Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

    class AutoUnboxingTest {
    
        public static void main(String[] args) {
            Integer a = new Integer(3);
            Integer b = 3;                  // 将3自动装箱成Integer类型
            int c = 3;
            System.out.println(a == b);     // false 两个引用没有引用同一对象
            System.out.println(a == c);     // true a自动拆箱成int类型再和c比较
        }
    }
    
    

    | 和 ||,& 和 && 的区别

    • || 和 && 定义为逻辑运算符,而 | 和 & 定义为位运算符
    • && 如果两个操作数都非零,则条件为真;
    • || 如果两个操作数中有任意一个非零,则条件为真。
    • & 按位与操作,按二进制位进行"与"运算。运算规则:(有 0 则为 0)
    0&0=0;   
    0&1=0;    
    1&0=0;     
    1&1=1;
    
    

    | 按位或运算符,按二进制位进行"或"运算。运算规则:(有 1 则为 1)

    0|0=0;    
    0|1=1;   
    1|0=1;    
    1|1=1;
    
    

    解释内存中的栈(stack)、堆(heap)。

    • 通常我们定义一个基本数据类型的变量,一个对象的引用,函数调用的现场都是保存在JVM中的栈空间。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都可以通过JVM的启动参数来进行调整,栈空间用光了会引发StackOverflowError
    • 而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为Eden、Survivor(又可分为From Survivor和To Survivor),堆和常量池空间不足则会引发OutOfMemoryError

    Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

    Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。

    数组有没有length()方法?String有没有length()方法?

    数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。

    在JAVA中如何跳出当前的多重嵌套循环

    // 使用标记
    public static void main(String[] args) {
            System.out.println("标记前");
            ok: for (int i = 0; i < 10; i++) {
                for (int j = 0; j < 10; j++) {
                    System.out.println("i=" + i + ",j=" + j);
                    if (j == 5)
                        break ok;
                }
            }
            System.out.println("标记后");
        }
    

    是否可以继承String类?

    ∵ String = final类 && final类 ≠ 继承(不能被继承)
    ∴ String ≠ 继承(不能被继承)

    String、StringBuffer、StringBuilder区别(详细介绍)

    • StringBuffer、StringBuilder和String一样,也用来代表字符串。
    • String类是不可变类,任何对String的改变都 会引发新的String对象的生成。
    • StringBuffer是可变类,任何对它所指代的字符串的改变都不会产生新的对象。StringBufferd支持并发操作,线性安全的,适 合多线程中使用
    • StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高

    方法重载(Overload)和方法重写(Override)

    • 方法重载:同一个类中的多个方法有相同的名字,但这些方法的参数列表不同,参数的数量或参数类型不能完全相同。
    • 方法重写:存在子父类之间的,,子类定义的方法与父类中的方法具有相同的方法名字,以及相同的参数表和相同的返回类型。
      ps:函数的返回值只是作为函数运行之后的一个“状态” ,并不能作为某个方法的“标识” 。

    Java中接口(interface)和抽象类(abstract)的区别

    • interface:关键字是interface,用来被类实现,可以多继承(Java类只能单继承)其他接口,内部都是抽象方法,所以被Java类实现(implement)的时候就要实现内部所有的方法,内部的变量隐式的被public static final 修饰,方法则是被public abstract 修饰(而且方法只能是public权限)。
    • abstract:关键字是abstract,用来被类继承,只能单继承其他类,内部既可以有抽象方法,也可以有普通方法,被Java类继承(extend)的时候必须实现内部的抽象方法,内部的抽象方法被abstract修饰,如果子类没有将抽象类全部实现,那么子类也要加abstract关键字。

    Java 中会存在内存泄漏吗,请简单描述。

    理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露

    String s = new String(“ds”);创建了几个字符串对象?

    两个对象,一个是静态区的"ds",一个是用new创建在堆上的对象

    Java 中的final关键字有哪些用法?

    • 修饰类:表示该类不能被继承
    • 修饰方法:表示方法不能被重写
    • 修饰变量:表示变量只能一次赋值以后值不能被修改(常量)

    数据类型之间的转换

    如何将字符串转换为基本数据类型
    调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型
    如何将基本数据类型转换为字符串
    一种方法是将基本数据类型与空字符串("")连接(+)即可获得其所对应的字符串;
    另一种方法是调用String 类中的valueOf()方法返回相应字符串

    列出一些你常见的运行时异常

    • ArithmeticException(算术异常)
    • ClassCastException (类转换异常)
    • IllegalArgumentException (非法参数异常)
    • IndexOutOfBoundsException (下标越界异常)
    • NullPointerException (空指针异常)
    • SecurityException (安全异常)

    java 集合(list、set、map)的特点

    List、Set是存储单列的数据集合,都继承与Collection接口。 Map是存储键值对这样的双列数据的集合,是个独立接口

    List:有顺序以线性方式存储,可以存放重复对象 (线程安全方法:List list = Collections.synchronizedList(new LinkedList(…));)

    • LinkedList:双向链表实现存储,索引数据慢插入数度较快,线程不安全(比安全性能好)
    • ArrayList: 数组方式存储数据,索引数据快插入数据慢,线程不安全
    • Vector: 数组方式存储数据,索引数据快插入数据慢,线程安全
    • Stack:继承自Vector,实现一个后进先出的堆栈(可以理解弹夹装弹,后装的先打出)

    Set:无顺序,不包含重复的元素

    • HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashCode()
    • TreeSet: 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列
    • LinkedHashSet: 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示

    Map:键必须是唯一 (同步方法:Map m = Collections.synchronizedMap(new TreeMap(…));)

    • Hashtable: 基于散列表的实现,允许空键空值,线程安全
    • HashMap: 基于散列表的实现,允许空键空值,线程不安全(与Hashtable基本一致)
    • TreeMap: 基于红黑树数据结构的实现,不允许空键空值,线程不安全
    • WeakHashMap: 改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

    总结

    欢迎关注公众号:前程有光,领取一线大厂Java面试题总结+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结! 这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。

  • 相关阅读:
    dotnet 新项目格式与对应框架预定义的宏
    dotnet 线程静态字段
    dotnet 线程静态字段
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取系统信息
    dotnet 通过 WMI 获取系统信息
    PHP show_source() 函数
  • 原文地址:https://www.cnblogs.com/lwh1019/p/14496512.html
Copyright © 2011-2022 走看看