乐趣区

关于面试:建议反复观看精选高频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、分布式缓存、数据结构等等。

退出移动版