【Java必备面试题】第2期

面试题:HashMap底层实现原理是什么?

这题是Java基础面试必问题。

(1)面试解析:

主要是考察对Map的理解,就是指key-value形式的理解, 来判断面试者对java基础掌握情况,作为开启java基础问答的首选问题, 答完此题, 可能就会问 map和list的区别 hashset vector的区别等

(2)正确回答:

a.HashMap采用了链表加数组的形式来存放数据。它里面的每一个元素都会存放在一个内部类Entry中。默认初始化大小为16(2的整数倍),每次扩容*2,负载因子为0.75。

b.对元素操作时,会先根据key的hash值与数组长度计算在数组中的存放位置,找到位置后再判断key是否相同,不相同则作为链表遍历,相同则替换value。

c.通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Factor则resize为原来的2倍)。

d.获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来。

e.在jdk1.8后为了防止hash碰撞发生太过频繁,增加了红黑树的结构,在特定的情况下会替换链表结构。

tips:

hashmap的问题会延伸出一系列的问题,比如:HashMap碰撞原理,jdk是如何解决碰撞问题的?HashMap的key重复,那么value会被覆盖吗?等等,大家要重视

☞每日必会笔试题☜

第1题:关于以下程序代码的说明正确的
classHasStatic{
privatestaticintx = 100;
publicstaticvoidmain(String args[ ]){
HasStatichs1 = newHasStatic();
hs1.x++;
HasStatichs2 = newHasStatic();
hs2.x++;
hs1=newHasStatic();
hs1.x++;
HasStatic.x–;
System.out.println( “x=”+x);
}
}
A.第5行不能通过编译,因为引用了私有静态变量
B.第10行不能通过编译,因为x是私有静态变量
C.程序通过编译,输出结果为:x=103
D.程序通过编译,输出结果为:x=102

第2题. J2EE中,当把来自客户机的HTTP请求委托给servlet时,会调用
HttpServlet的( )方法
A.service
B.doget
C.dopost
D.init

答案解析:
第1题:D
解析:
因为x的修饰符为 static 所以x为类变量,即对于所有的实例来说,
他们访问的x为同一个x,类变量存储在方法区,不属于每个实例的私有,
刚开始x=100,
调用hs1.x++ x为101;
调用hs2.x++ x为102;
调用hs1.x++ x为103 (此时hs1指向了一个新的HasStatic实例,但是
依然访问的是同一个X)
调用HasStatic.x-- x为102
所以结果为D

第2题:A
解析:
HttpServlet容器响应Web客户请求流程如下:
1)Web客户向Servlet容器发出Http请求;
2)Servlet容器解析Web客户的Http请求;
3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http
请求信息;
4)Servlet容器创建一个HttpResponse对象;
5)Servlet容器调用HttpServlet的service方法,这个方法中会根
据request的Method来判断具体是执行doGet还是doPost,
把HttpRequest和
HttpResponse对象作为service方法的参数传给HttpServlet对象;
6)HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
7)HttpServlet调用HttpResponse的有关方法,生成响应数据;
8)Servlet容器把HttpServlet的响应结果传给Web客户。
doGet() 或 doPost() 是创建HttpServlet时需要覆盖的方法.
常见java面试题

原创 包子 MyDreamItPossible 2019-11-22
冒泡排序
public static void main(String[] args) {
//冒泡
int[] a = {5, 3, 4, 2, 6, 1, 8, 7, 9};
for (int i = 1; i < a.length; i++) {//8次
for (int j = 0; j < a.length - i; j++) {//8 7 6 5 4 3 2 1
if (a[j] > a[j + 1]) {
int c = a[j];
a[j] = a[j + 1];
a[j + 1] = c;
}
}
}
for (int i : a) {
System.out.println(i);
}
}
输出结果
123456789

回文字符串
public static void main(String[] args) {
//回文字符串
String s = “abcdecba”;
//把字符串s变成字符数组
char[] c = s.toCharArray();
int x = 0;
for (int i = 0; i < c.length / 2; i++) {
if (c[i] != c[c.length - 1 - i]) {
x = 1;
break;//如果字符不相等不是回文
}
}
if (x == 0) {
System.out.println(“回文”);
} else {
System.out.println(“不是回文”);
}
}

字符串反转
public static void main(String[] args) {
//字符串反转
//方法1:
//创建扫描仪对象
Scanner sc = new Scanner(System.in);
System.out.println(“请输入字符串:”);
//获取输入的字符串赋值给s
String s = sc.next();
//创建StringBuffer 字符串 可变字符串
StringBuffer str = new StringBuffer(s);
str.reverse();//字符串反转
System.out.println(str);

    //方法2:
    //把字符串转换成字符数组
    char[] c = s.toCharArray();
    //交换数组中的字符位置
    for (int i = 0; i < c.length / 2; i++) {
        char temp = c[i];
        c[i] = c[c.length - 1 - i];
        c[c.length - 1 - i] = temp;
    }
    //使用字符数组c创建一个新的字符串 并且把字符串赋值给s
    s = new String(c);
    System.out.println(s);
}

请输入字符串:abcdefgh
hgfedcba
hgfedcba

统计一个用空格隔开的字符串中每个单词的数目
public static void main(String[] args) {
//统计一个用空格隔开的字符串中每个单词的数目
String s = “if else for rm ls ls for while do while like mv cd ls”;
String[] str = s.split(" ");//把字符串s按空格分割成字符串数组
//输出数组中所有元素 观察发现是所有的单词
/*
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
*/
//创建一个map集合 键值对集合 key是字符串 value是数字
Map<String, Integer> map = new HashMap<String, Integer>();
for (int i = 0; i < str.length; i++) { //遍历字符串数组中的每一个值
if (map.containsKey(str[i])) {
//如果map集合中的key中已包含该字符串,value值加1
map.put(str[i], map.get(str[i]) + 1);
} else {
//如果不包含 字符串就是key value是1 存入 map集合
map.put(str[i], 1);
}
}
System.out.println(map);//map中的key就是单词 value就是单词出现的个数
}
打印结果
{cd=1, like=1, else=1, ls=3, for=2, mv=1, rm=1, do=1, while=2, if=1}

  1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

java虚拟机是执行字节码文件(.class)的虚拟机进程。。java源程序(.java)被编译器编译成字节码文件(.class)。然后字节码文件,将由java虚拟机,解释成机器码(不同平台的机器码不同)。利用机器码操作硬件和操作系统。
因为不同的平台装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码。正是因为有JVM的存在,java被称为平台无关的编程语言。
2.JDK和JRE的区别是什么?

Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。
Java运行时环境(JRE)。它包括Java虚拟机、Java核心类库和支持文件。它不包含开发工具(JDK)、编译器、调试器和其他工具。
3.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。
4.是否可以在static环境中访问非static变量?

   static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚  拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

5.Java支持的数据类型有哪些?什么是自动拆装箱?

Java支持的数据类型包括两种:一种是基本数据类型,包含byte,char, short, boolean ,int, long, float, double;另一种是引用类型:如String等,其实是对象的引用,JVM中虚拟栈中存的是对象的地址,创建的对象实质在堆中,通过地址来找到堆中的对象的过程,即为引用类型。
自动装箱就是Java编译器在基本数据类型和对应的对象包装类型间的转化,即int转化为Integer,自动拆箱是Integer调用其方法将其转化为int的过程。
6.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。重载Override是一个类中多态性的一种表现。
方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。在java中,子类可继承父类的方法,则不需要重新编写相同的方法。但有时子类并不想原封不动继承父类的方法,而是想做一定的修改,这就采用方法重写。方法重写又称方法覆盖。
7.Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?

当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。
Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。
Java不支持复制构造方法,如果你不自己写构造方法的情况下,Java不会创建默认的复制构造方法。
8. Java支持多继承么?

    Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。
  1. 接口和抽象类的区别是什么?

关于抽象类
JDK 1.8 以前,抽象类的方法默认访问权限为 protected
JDK 1.8 时,抽象类的方法默认访问权限变为 default

关于接口
JDK 1.8 以前,接口中的方法必须是 public 的
JDK 1.8 时,接口中的方法可以是 public 的,也可以是 default 的
JDK 1.9 时,接口中的方法可以是 private 的

  1. 介绍一下反射?

JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。
实际上,我们创建的每一个类也都是对象,即类本身是 java.lang.Class 类的实例对象。这个实例对象称之为类对象,也就是 Class 对象。Class 对象的由来是将 class 文件读入内存,并为之创建一个 Class 对象。
反射就是把 java 类中的各种成分映射成一个个的 Java 对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
java基础面试题三

原创 LittleLucky499 码之人生 1周前

点击上面 “蓝字” 关注我们

java基础面试题三

01

问题1 JVM相关问题
Q:什么是JVM(Java 虚拟机)
A:Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
Q:什么是字节码?采用字节码的好处是什么?
A:在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同的计算机上运行。

Q:Java 程序从源代码到运行3 步是什么?
A:

我们需要格外注意的是 .class->机器码这一步。在这一步 jvm 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的,也就是所谓的热点代码,所以后面引进了 JIT 编译器,JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。

HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。JDK 支持分层编译和 AOT 协作使用。但是 , AOT 编译器的编译质量是肯定比不上 JIT 编译器的。

总结:Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。

02

问题2 JDK 与 JRE
Q:什么是JDK?
A:JDK 是 Java Development Kit,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。

Q:什么是 JRK?
A: JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序。

注意:
如果你只是为了运行一下 Java 程序的话,那么你只需要安装 JRE 就可以了。如果你需要进行一些 Java 编程方面的工作,那么你就需要安装 JDK 了。但是,这不是绝对的。有时,即使您不打算在计算机上进行任何 Java 开发,仍然需要安装 JDK。例如,如果要使用 JSP 部署 Web 应用程序,那么从技术上讲,您只是在应用程序服务器中运行 Java 程序。那你为什么需要 JDK 呢?因为应用程序服务器会将 JSP 转换为 Java servlet,并且需要使用 JDK 来编译servlet。

03

问题3 JAVA 面向对象三大特征
Q:什么是封装?
A: 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。
Q:什么是封装?
A: 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。

Q:什么是继承?
A: 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。
注意:
关于继承如下 3 点请记住:
1. 子类拥有父类非 private 的属性和方法。
2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
3.子类可以用自己的方式实现父类的方法。

Q:什么是多态?
A: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
在Java 中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)

java基础面试题四

原创 LittleLucky499 码之人生 1周前

点击上面 “蓝字” 关注我们

java基础面试题四

01

问题1
Q:接口和抽象类的区别是什么?
A:1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法
2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定
3. 一个类可以实现多个接口,但最多只能实现一个抽象类
4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

02

问题2
Q:成员变量与局部变量的区别有那些?
A: 1. 从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰;
2. 从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存
3. 从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。
4. 成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被 final 修饰的成员变量也必须显示地赋值);而局部变量则不会自动赋值。

03

问题3
Q:== 与 equals的区别有那些?(重要)
A:
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型比较的是值,引用数据类型比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两 个对象时,等价于通过“==”比较这两个对象。
情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

举个例子:

说明:
String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

04

问题4
Q:简述线程,程序、进程的基本概念。以及他们之间关系是什么?
A:线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。
java基础面试题二

原创 LittleLucky499 码之人生 1周前

点击上面 “蓝字” 关注我们

java基础面试题二

01

问题1
Q:java 主类定义、应用程序和小程序主类的区别?
A:一个程序中可以有多个类,但只能有一个类是主类。在 Java 应用程序中,这个主类是指包含 main()方法的类。而在 Java 小程序中,这个主类是一个继承自系统类 JApplet 或 Applet 的子类。应用程序的主类不一定要求是 public 类,但小程序的主类要求必须是 public 类。主类是 Java 程序执行的入口点。

02

问题2
Q:字符型常量和字符串常量的区别?
A:
1. 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
2. 含义上: 字符常量相当于一个整形值( ASCII 值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)
3. 占内存大小 字符常量只占 2 个字节 字符串常量占若干个字节(至少一个字符结束标志) (注意: char 在 Java 中占两个字节)

03

问题3
Q:自动装箱与拆箱
A: 装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值