Java面试题

文章目录

  • Java面试题
    • 一、简答题
      • 1、Java创建线程有几种方式?
      • 2、线程池有哪几种状态?每种状态分别表示什么?
      • 3、Java集合有哪些?
      • 4、==和equals的区别和联系
      • 5、OSI七层模型
      • 6、对称加密与非对称加密算法区别
      • 7、十大排序算法
      • 8、解释Java中一下关键字的作用:static、final、ThreadLocal、AtomicInteger、volatile、synchronized ?
      • 9、解释Linux中一下命令的作用:chmod、vim、pwd、mv、tail、touch、tar、reboot、su、cut、grep、top ?
      • 10、HTTP协议中get和post的区别?HTTPS协议的原理?
      • 11、简述Java内存模型与类加载机制?
      • 12.一个”.java”源文件中是否可以包括多个类?有什么限制(明*数据)
      • 13.Java 的优势(阿**巴)
      • 14.常用的几个命令行操作都有哪些?(至少4个)(北京数字**)
      • 15.Java 中是否存在内存溢出、内存泄漏?如何解决?举例说明(拼*多)
      • 16. 如何看待Java是一门半编译半解释型的语言(携*)
    • 二、变量与运算符
      • 1. 高效的方式计算2 * 8的值 (文\*\*辉、轮*科技)
      • 2. &和&&的区别?(恒\*电子、\*度)
      • 3. Java中的基本类型有哪些?String 是最基本的数据类型吗?(恒*电子)
      • 4. Java中的基本数据类型包括哪些?(*米)
      • 5. Java开发中计算金额时使用什么数据类型?(5*到家)
      • 6. char型变量中能不能存储一个中文汉字,为什么?(*通快递)
      • 7. 代码分析(君\*科技、新\*陆)
      • 8. int i=0; i=i++执行这两句化后变量 i 的值为(*软)
      • 9. 如何将两个变量的值互换(北京\*彩、中外\*译咨询)
      • 10. boolean 占几个字节(阿**巴)
      • 11. 为什么Java中0.1 + 0.2结果不是0.3?(字*跳动)
      • 12.读代码写结果
    • 二、读程序写结果题
      • 1、 考察 i++ 与 ++i
      • 2、输出a、b的值
  • 待更新……

Java面试题

一、简答题

1、Java创建线程有几种方式?

四种!

第一种继承Thread类 重写run方法 因为Java是单继承我们通常会采用第二种方法。想要用的话就new一个Thread对象调用start方法

第二种方式是实现Runnable接口 同样实现的run方法 想要用的话就new一个Thread对象调用start方法。

第三种:实现Callable接口 与第二种方法的区别是 开启一个线程 我们是可以拿到任务的结果的。

要使用Callable的话要结合FutureTask

我们需要将当前类对象传给FutureTask,将FutureTask对象传给Thread

第四种方式:利用线程池创建线程。实现Callable接口orRunnable接口,由ExecutorService来创建线程。

以上几种方式底层都是实现Runable接口

2、线程池有哪几种状态?每种状态分别表示什么?

  • running 表示线程池正常运行,既能接受新任务也会正常处理队列中的任务
  • shoutdown当调用线程池shutdown方法时 线程进入shutdown状态表示线程池处于关闭状态,此状态下线程池不会接受新任务,但是会把队列中的任务执行完。
  • stop 当调用线程池的shutdownnow()方法时,线程池就进入stop状态,表示线程池处于正在停止的状态,此状态线程池既不会接受新任务了也不会处理队列中的任务,并且正在运行的线程也会中断。
  • tidying 线程池没有线程在运行后,线程池的状态就会变成tidying,并且会调用terminated(),改方法时空方法,留给程序员进行扩展
  • Terminated terminated()方法执行完之后就会变成terminated

3、Java集合有哪些?

java有哪些集合类型?

java的集合类型主要有3种:set(集)、list(列表)和map(映射)。

1、List(有序、可重复)

List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。

2、Set(无序、不能重复)

Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。

3、Map(键值对、键唯一、值不唯一)

Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。

Java面试题_第1张图片

4、==和equals的区别和联系

1)对于==,比较的是值是否相等

如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

5、OSI七层模型

详情:
https://baike.baidu.com/item/%E4%B8%83%E5%B1%82%E6%A8%A1%E5%9E%8B/1441391?fr=aladdin

Java面试题_第2张图片

Java面试题_第3张图片

1>、物理层

建立、维护、断开物理连接。(由底层网络定义协议)

2>、数据链路层

建立逻辑连接、进行硬件地址寻址、差错校验 [3] 等功能。(由底层网络定义协议)

将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。

3>、网络层

进行逻辑地址寻址,实现不同网络之间的路径选择。

协议有:ICMP IGMP IP(IPV4 IPV6)

4>、传输层

定义传输数据的协议端口号,以及流控和差错校验。

协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层

5>、会话层

建立、管理、终止会话。(在五层模型里面已经合并到了应用层)

对应主机进程,指本地主机与远程主机正在进行的会话

6>、表示层

数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)

格式有,JPEG、ASCll、EBCDIC、加密格式等

7>、应用层

网络服务与最终用户的一个接口。

协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

6、对称加密与非对称加密算法区别

1、区别:加密一般分为两种,对称加密和非对称加密。对称加密就是加密解密都用同一个秘钥,比如DES、3DES(TripleDES)和AES等。
非对称加密就是加密和解密不是用的同一种秘钥,比如RSA算法、DSA算法、ECC算法、DH算法等。
在非对称加密中,用来加密的秘钥叫公钥,用来解密的秘钥叫私钥。公钥和私钥都是成对生成的,公钥分发给其他人用来加密,私钥用来解密。
2、优缺点:
对称加密:解密速度快,但保密性差。
非对称加密:加密算法保密性好,它消除了最终用户交换密钥的需要。但是加解密速度要远远低于对称加密。

7、十大排序算法

冒泡排序、选择排序、归并排序、堆排序、快速排序、
希尔排序、插入排序、基数排序、桶排序、计数排序。

十大排序详解

8、解释Java中一下关键字的作用:static、final、ThreadLocal、AtomicInteger、volatile、synchronized ?

  • static

  • final

  • ThreadLocal

  • AtomicInteger

  • volatile

  • synchronized

9、解释Linux中一下命令的作用:chmod、vim、pwd、mv、tail、touch、tar、reboot、su、cut、grep、top ?

  • chmod:修改文件/目录访问权限
  • vim:文本编辑器
  • pwd:显示当前的路径,有连接文件时,直接显示连接文件的路径
  • mv:移动文件或改名 tail:显示文件结尾内容
  • touch:创建空文件或修改文件时间
  • tar:压缩or解压
  • reboot:重启
  • su:用户间的切换
  • cut:用于显示每行从开头算起num1 到 num2 的文字
  • grep:用于查找文件里符合条件的字符串
  • top:实时监控系统中各个进程资源占用的情况

10、HTTP协议中get和post的区别?HTTPS协议的原理?

  • Http与Https的区别:

    1、https协议需要到CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(原来网易官网是http,而网易邮箱是https。)

    2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

    3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

    4、http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

原文链接:https://blog.csdn.net/qq_38289815/java/article/details/80969419

  • get和post都是http请求方式。 它们的区别如下:

    区别一,get请求重点在从服务器上获取资源,而post请求重点在向服务器发送数据。
    
    区别二,get传输数据是通过URL请求,以字段=value的形式,用?连接置于URL之后,多个请求数据之间用&连接,这个过程用户可见,因此是不安全的。
    
        post传输数据是通过http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程用户不可见,因此是安全的。
    
    区别三,get传输的数据量小,受URL长度的限制,但是效率高。
    
        post传输数据量不受限制,可以传输大量数据,所以传输文件时只能使用post,但是效率较低。请求较多时可能形成一个请求队列。
    
    区别四,get方式只支持ASCII字符,因此向服务器传输中文有可能出现乱码。
    
           post支持标准字符集,可以正确传递中文字符。
    

原文链接:https://www.cnblogs.com/jasonboren/p/11053889.html

11、简述Java内存模型与类加载机制?

几篇文章供参考:
文章一: https://www.cnblogs.com/gslgb/p/14724879.html
文章二:https://blog.csdn.net/weixin_47994845/article/details/126899448
文章三:https://blog.csdn.net/l688899886/article/details/126726498

12.一个”.java”源文件中是否可以包括多个类?有什么限制(明*数据)

是!

一个源文件中可以声明多个类,但是最多只能有一个类使用public进行声明
且要求声明为public的类的类名与源文件名相同

13.Java 的优势(阿**巴)

  • 跨平台型
  • 安全性高
  • 简单性
  • 高性能
  • 面向对象性
  • 健壮性

14.常用的几个命令行操作都有哪些?(至少4个)(北京数字**)

dir 、 cd 、md、rd、cls

15.Java 中是否存在内存溢出、内存泄漏?如何解决?举例说明(拼*多)

存在!

不能举例。

16. 如何看待Java是一门半编译半解释型的语言(携*)

因为在字节码文件运行阶段时 可能时解释器执行,也有可能时JIT(即时编译器)编译器执行。
也是因为JIT使Java的运行效率更高。
Java面试题_第4张图片

Java面试题_第5张图片

二、变量与运算符

1. 高效的方式计算2 * 8的值 (文**辉、轮*科技)

使用 <<

2. &和&&的区别?(恒*电子、*度)

3. Java中的基本类型有哪些?String 是最基本的数据类型吗?(恒*电子)

8种基本数据类型。(略)

String不是,属于引用数据类型。

4. Java中的基本数据类型包括哪些?(*米)

类似问题:
> Java的基础数据类型有哪些?String是吗?(贝壳)

5. Java开发中计算金额时使用什么数据类型?(5*到家)

不能使用float或double,因为精度不高。

使用BigDecimal类替换,可以实现任意精度的数据的运算。

6. char型变量中能不能存储一个中文汉字,为什么?(*通快递)

可以的。char c1 = ‘中’;

char c2 = ‘a’。

因为char使用的是unicode字符集,包含了世界范围的所有的字符。

7. 代码分析(君*科技、新*陆)

short s1=1; 
s1=s1+1;  //有什么错?  =右边是int类型。需要强转
short s1=1;
s1+=1; //有什么错?   没错

8. int i=0; i=i++执行这两句化后变量 i 的值为(*软)

0。

9. 如何将两个变量的值互换(北京*彩、中外*译咨询)

String s1 = "abc";
String s2 = "123";

String temp = s1;
s1 = s2;
s2 = temp;

10. boolean 占几个字节(阿**巴)

编译时不谈占几个字节。

但是JVM在给boolean类型分配内存空间时,boolean类型的变量占据一个槽位(slot,等于4个字节)。
细节:true:1  false:0

>拓展:在内存中,byte\short\char\boolean\int\float : 占用1个slot
              double\long :占用2个slot

11. 为什么Java中0.1 + 0.2结果不是0.3?(字*跳动)

在代码中测试0.1 + 0.2,你会惊讶的发现,结果不是0.3,而是0.3000……4。这是为什么?

几乎所有现代的编程语言都会遇到上述问题,包括 JavaScript、Ruby、Python、Swift 和 Go 等。引发这个问题的原因是,它们都采用了IEEE 754标准

IEEE是指“电气与电子工程师协会”,其在1985年发布了一个IEEE 754计算标准,根据这个标准,小数的二进制表达能够有最大的精度上限提升。但无论如何,物理边界是突破不了的,它仍然不能实现“每一个十进制小数,都对应一个二进制小数”。正因如此,产生了0.1 + 0.2不等于0.3的问题。

具体的:

整数变为二进制,能够做到“每个十进制整数都有对应的二进制数”,比如数字3,二进制就是11;再比如,数字43就是二进制101011,这个毫无争议。

对于小数,并不能做到“每个小数都有对应的二进制数字”。举例来说,二进制小数0.0001表示十进制数0.0625 (至于它是如何计算的,不用深究);二进制小数0.0010表示十进制数0.125;二进制小数0.0011表示十进制数0.1875。看,对于四位的二进制小数,二进制小数虽然是连贯的,但是十进制小数却不是连贯的。比如,你无法用四位二进制小数的形式表示0.125 ~ 0.1875之间的十进制小数。

所以在编程中,遇见小数判断相等情况,比如开发银行、交易等系统,可以采用四舍五入或者“同乘同除”等方式进行验证,避免上述问题。

12.读代码写结果

public class InterviewTest {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println(arr); // 地址值
        
        char[] arr1 = {'a','b','c','d'};
        System.out.println(arr1); // abcd
        
        boolean[] arr2 = {false, true, false};
        System.out.println(arr2); // 地址
    }
}

二、读程序写结果题

1、 考察 i++ 与 ++i

public static void main(String[] args) {
    int i = 1;
    i = i++;
    int j = i++;
    int k = i + ++i * i++;
    System.out.println("i="+i);
    System.out.println("j="+j);
    System.out.println("k="+k);
}

i=4
j=1
k=11

2、输出a、b的值

题目:

public class InterviewTest {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        method(a, b); // 需要在method方法被调用之后,仅打印出a=100,b=200,请写出method方法的代码
        System.out.println("a="+a);
        System.out.println("b="+b);
    }
    // 代码编写处
}

答案:

//method
// 方法一:System.exit(0); // 退出程序
public static void method(int a, int b) {
    a *= 10;
    b *= 10;
    System.out.println("a=" + a);
    System.out.println("b=" + b);
    System.exit(0); // 退出程序
}

// 方法二 重写println方法
public static void method2(int a, int b) {
    PrintStream ps = new PrintStream(System.out) {
        @Override
        public void println(String x) {
            if ("a=10".equals(x)) {
                x = "a=100";
            }else if("b=20".equals(x)){
                x = "b=200";
            }
            super.println(x);
        }
    };
    
    System.setOut(ps);
}

// 错误的做法
public static void method3(int a, int b){
    a*=10;
    b*=10;
}

待更新……

你可能感兴趣的:(面试题,java,面试,jvm)