实习面试之java常见题目

java面经 前言 本文介绍java的常见的面试题目,从java的基础,容器,多线程几个角度阐述java的基础知识,采用边背边写的方式,背的顺序为常规顺序,3道题一轮回。
零.面向对象的三个特点 封装,继承,多态
1、封装
封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
面相对象的不就是使用程序处理事情时以对象为中心去分析吗,与面向过程不同,面向过程关心处理的逻辑、流程等问题,而不关心事件主体。而面向对象即面向主体,所以我们在解决问题时应该先进行对象的封装(对象是封装类的实例,比如张三是人,人是一个封装类,张三只是对象中的一个实例、一个对象)。比如我们日常生活中的小兔子、小绵羊都可以封装为一个类。

比如兔子的属性有两只耳朵、四只腿、一双眼睛、三瓣嘴等;行为(功能)有跑、跳、吃素等。
2、继承
继承是面向对象的基本特征之一,继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。类似下面这个图:

【实习面试之java常见题目】我们在上面已经封装了兔子这个类,其他动物也一样可以进行封装。在封装过程中我们发现兔子、绵羊这两个类具有相似的功能或特性如吃草,所以我们可以抽取共有特征和方法形成高一层的类,如这里的食草动物、食肉动物。继承之间是子父类的关系。继承机制可以很好的描述一个类的生态,也提高了代码复用率,在Java中的Object类是所有类的超类,常称作上帝类。
3、多态
多态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
多态的优点:

  1. 消除类型之间的耦合关系
  2. 可替换性
  3. 可扩充性
  4. 接口性
  5. 灵活性
  6. 简化性
    多态存在的三个必要条件:
继承
重写(子类继承父类后对父类方法进行重新定义)
父类引用指向子类对象
简言之,多态其实是在继承的基础上的。比如说今天我们要去动物园参观动物,那么你说我们去参观兔子、参观绵羊、参观狮子、参观豹子都是对的,但你不能说我们去参观汽车。在这个例子中,子类具有多态性:除了使用自己的身份,还能充当父类。
一. java基础
  1. JDK和JRE的区别:
    • jdk : java development kit : 是java的工具包,提供java的开发环境和运行环境。
    • JRE:java runtime environment:是java程序的运行环境。
    具体来说jre包含了jdk,同时包含了java的源码和编译器javac,还包含了很多java的调试和分析的工具。如果运行java程序,jre就够了;如果开发java程序就要用到jdk。
  2. ==和equals的区别是什么?
对于==来说
对于基本类型和引用类型的效果是不同的,如下图所示:
- 基本类型:比较的是值是否相同
- 引用类型:比较的是引用是否相同
代码例子:
String x = "string"; String y = "string"; String z = new String("string"); System.out.println(x==y); // true System.out.println(x==z); // false System.out.println(x.equals(y)); // true System.out.println(x.equals(z)); // true

代码解读: 对于x和y来说他们都是基本类型,比较的是引用是否相同,所以==是true。 对于z来说,new的对象开辟了一段新的地址空间,所以引用不相同。 而对于equals来说他们都是比较值是否相同。

对于equals来说
equals的本质实际上就是==,只不过啊String和Integer等重写了equals方法,把他们变成了值的比较。看下面的代码会有更好的了解
class Cat { public Cat(String name) { this.name = name; }private String name; public String getName() { return name; }public void setName(String name) { this.name = name; } }Cat c1 = new Cat("王磊"); Cat c2 = new Cat("王磊"); System.out.println(c1.equals(c2)); // false

结果是false,equals的源码是:
public boolean equals(Object obj) { return (this == obj); }

这里面的this代表的是获取当前实例本身,所以本质上就是equal
如果有类似于Child c = new Child()形式的c引用的话,在栈区定义Child类型引用变量c,然后将堆区对象的地址赋值给它。
this的相关用法
同样的当我们进入到String的equals的源码的时候,我们发现了答案。
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }

原来是String重写了Object的equals方法,把引用改成了比较值。
总结:对于==来说基础类型比较的是值,引用类型比较的是引用的地址。对于equals来说一些String和Integer的类型重写了equals的方法,把它变成了比较值。
  1. 两个对象的hashcode()相同,则equals()也一定为true嘛?
    不对,两个对象的hashcode()相同,但是equals不一定相同。
    代码例子:
1 String str1 = "通话"; 2 String str2 = "重地"; 3 System.out.println(String.format("str1:%d | str2:%d",str1.hashCode(),str2.hashCode())); 4 System.out.println(str1.equals(str2));

hashcode的源码是什么
执行的结果是:
实习面试之java常见题目
文章图片
4. 4. final在java中有哪些作用?
  • final 修饰的类叫最终类,该类不能被继承
  • final修饰的方法不能被重写
  • final修饰的变量叫常量,常量必须被初始化,初始化之后的值就不能被更改。
  1. java中的Math.round(-1.5)等于多少?
    等于-1,在数轴上取值的时候啊,中间值0.5向右取。
  2. String属于基础数据类型吗?
    不属于,java的基础数据类型有8种,int,long,short,float,double,byte,char,boolean。
  3. java中的字符串都有哪些类?他们都有哪些区别?
    操作字符串有:String,StringBuffer,StringBuilder。
    String和StringBuffer,StringBuilder最大的区别在于String是不可变化的,所有的String的操作都会生成新的String的对象,然后将指针指向新的String对象。而StringBuffer和StringBuilder可以在原有的对象的基础上进行操作,所以在经常需要修改字符串的情况下还是尽量多使用StringBuilder和StringBuffer。
    StringBuffer和StringBuilder之间的区别就是,StringBuffer是线程安全的,而StringBuilder是非线程安全的。但是StringBuilder的效率要高于StringBuffer。所以在单线程的环境下推荐使用StringBuilder,反之多线程应该使用StringBuffer。
  4. String str=“iii”与String str = new String(“iii”)一样吗?
    答案
    不一样,第一种情况是在常量池中检索iii,如果没有的话就在常量池中新建一个iii,并且将其地址指向str;如果有就直接指向。第二种情况是在堆内存中创建iii对象,并且将这个对象指向栈内存中的str。
  5. 如何将字符串进行反转?
    stringbuffer和StringBuilder中有reverse的方法。可以调用这个方法直接反转字符串。
  6. String类种常见的方法有哪些?
    • indexOf():返回指定字符的索引
    • charAt() :返回指定索引位置的字符
    • replace():字符串替换
    • trim():去掉字符串两侧的空格
    • split():分割字符串,返回一个分割后的字符串数组
    • getByte():返回字符串Byte类型的数组
    • length():返回字符串的长度
    • toLowerCase():将一串已知的字符串转换成小写字母
    • toUpperCase():将一串已知的字符串转换成大写字母
    • subString():截取一串字符串
    • equals():字符串的比较
override是重写,抽象类和接口之间的关系
  1. 普通类和抽象类之间的关系:
    • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
    • 抽象类不能直接实例化,普通类可以实例化。
  2. 抽象类一定要有抽象方法吗?
    不一定啊,如果有抽象方法的话一定要在子类中重写。
  3. 抽象类能使用final进行修饰吗?
    不能,因为抽象类只有被继承才是有意义的。如果夫类定义成抽象类,那么该类就不会被继承。编译器也会报错说abstract和final是不合法的修饰词。
  4. 接口类和抽象类有什么区别?
    • 实现:抽象类的子类用extends来继承,而接口使用implement来实现
    • 构造函数:抽象类可以有构造函数,而接口不能有构造函数
    • main方法:抽象类可以有main方法,并且我们能够运行它;而接口不能有main方法。
    • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
    • 访问修饰符:接口中的方法默认使用public修饰;抽象类中的方法可以是任意访问修饰符。
  • ???各种修饰符的作用
  1. java中的IO流分为几种?
按照功能分:输入流,输出流
按照类型来分:字节流和字符流
字节流和字符流的区别是,字节流按照8位传输以字节为单位输入输出数据,字符按照16位传输以字符为单位输入输出数据。
  1. Files的常用方法有哪些?
  • Files.exists():检测文件是否存在
  • Files.createFile():创建文件
  • Files.createDirectory():创建文件件
  • Files.delete():文件删除
  • Files.copy():复制文件
  • Files.move():移动文件
  • Files.size():文件的大小
  • Files.read():读取文件
  • Files.write():写入文件
二. 容器
  1. java的容器有哪些?
    常用的容器目录:
    实习面试之java常见题目
    文章图片

    https://www.cnblogs.com/code-java/p/6847922.html 有关于Java中ArrayList、Vector、LinkedList三者的异同点
    https://blog.csdn.net/coding_1994/article/details/80553554 Java——HashSet和TreeSet的区别
  2. collection和collections有什么区别?
    • java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口皆苦方法。collection接口在java类库中有很多具体方法的实现。
      collection接口的意义是为各种具体的集合提供最大的统一华操作方式,其直接继承接口有List与Set
    • Collections则是集合类的一个 工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序,搜索以及线程安全等各种操作。
  3. list,set,map之间的区别是什么?
    实习面试之java常见题目
    文章图片

  4. Hashmap和hashtable有什么区别?
    • hashmap是单线程使用的,hashtable是同步的
    • hashmap去掉了contains方法,但是加上了containsValue()和containsKey方法
    • hashmap允许空键值,而hashtable不允许
  5. hashmap和treemap?
    在map中插入,删除和定位这类操作,hashmap是最好的选择。有序集合遍历,treemap更好。
  6. 说一下hashmap的实现原理?
    链表后面接上散列。
    put元素的时候,首先根据key的值计算一个hashcode。根据这个值得到这个元素在这个数组的下标位置。如果这个位置已经有元素,放入后面的链表当中。
  7. hashset的实现原理?
    • hashset底层是由hashmap实现的
    • hashset的元素是直接放在hashmap的key中
    • hashmap的value中存放的是present
  8. arraylist和linkedlist之间的区别是什么?
    arraylist是arry,linkedlist是双向链表
  9. arraylist和array
    • array可以容纳基本类型和对象
    • arraylist大小是固定的,array大小是指定的
    • array没有那么多功能,addall,removeal
多线程
  1. 并行和并发的区别?
    • 并行是指两个或者多个事件在同一时刻发生;并发是指两个或者多个事件在同一时间间隔发生。
    • 并行是在不同实体的多个事件,并发是在同一实体上的多个事件
    • 在一台处理器上同时处理多个任务,在多台处理器上同时处理多个任务。

    推荐阅读