Java面试宝典

目录

JAVA基本

1、==和equals区别

2、String、StringBuffer和StringBuilder区别

3、Java中的集合

4、ArrayList和LinkedList区别?

5、JVM、JRE和JDK的关系

6、 线程创建方式  

线程池的七大参数:

线程池工作顺序:

 使用线程池的好处:

7、final 有什么用?


JAVA基本

1、==和equals区别

  • ==比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致。如果两个对象的引用相同时(指向同一对象时),“==”操作符返回true,否则返回flase。

  • equals用来比较某些特征是否一样。我们平时用的String类等的equals方法都是重写后的,实现比较两个对象的内容是否相等。

2、String、StringBuffer和StringBuilder区别

  • 数据可变和不可变

 String底层使用一个不可变的字符数组private final char value[];所以它内容不可变。

 StringBufferStringBuilder都继承了AbstractStringBuilder底层使用的是可变字符数组:char[] value;

  • 线程安全

 StringBuilder是线程不安全的,效率较高;而StringBuffer是线程安全的,效率较低。

    通过他们的append()方法来看,StringBuffer是有同步锁,而StringBuilder没有。

3、Java中的集合

  • Collection下:List系(有序、元素允许重复)和Set系(无序、元素不重复)
  • Map下:HashMap线程不同步;

4、ArrayList和LinkedList区别?

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

  2. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

  3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

5、JVM、JRE和JDK的关系

(1)JVM

Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。

(2)JRE

Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包

如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

(3)JDK

Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等 

6、 线程创建方式  

  •  方法一:继承Thread类,重写run方法
  • 方法二:实现runnable接口,必须将它放到一个线程对象里。
  • 方法三:创建带返回值<FutureTask>的线程Callable接口
  • 方法四:线程池创建线程(可控制资源,性能稳定)

以上三种启动线程的方式都不用。将所有的多线程异步任务都交给线程池执行

  • 线程池的七大参数:

(1)、corePoolSize[5]:核心线程数[一直存在,除非(allowCoreThreadTimeOut)];线程池,创建好以后就准备就绪的线程数量,就等待接收异步任务去执行

                       5个 Thread thread = new Thread(); thread.start();

(2)、maximumPoolSize[200]:最大线程数量;控制资源

(3)、keepAliveTime:存活时间。如果当前正在运行的线程数量大于core数量

                    释放空闲的线程(maximumPoolSize-corePoolSize)。只要线程空闲大于指定的keepAliveTime;

(4)、unit:时间单位

(5)、BlockingQueue<Runnable> workQueue:阻塞队列。如果任务有很多。就会将多的任务放在队列里面

                   只要有线程空闲,就会去队列里面取出新的任务继续执行

(6)、ThreadFactory:线程创建的工厂

(7)、RejectedExecutionHandler handler:如果队列满了,按照我们指定的拒绝策略,拒绝执行

  • 线程池工作顺序:

线程池创建,准备好core数量的核心线程,准备接受任务       

       1、core满了,就将再进来的任务放入阻塞队列中。空闲的core就会自己去阻塞队列获取任务执行

       2、阻塞队垒满了,就直接开新线程执行,最大只能开到max指定的数量

       3、max满了就用RejectedExecutionHandler拒绝任务

       4、max都执行完成,有很多空闲,在指定的时间keepAliveTime以后,释放空闲的线程(max-core)。

               new LinkedBlockingQueue<>(),默认是Integer的最大值。内存不够

一个线程池 core 7, max 20, queue 50, 100并发进来怎么分配的:

       7个会立即执行。50个进入队列,在开13个进行执行。剩下30个就是用拒绝策略

如果不想抛弃还要执行,CallerRunsPolicy

  •  使用线程池的好处:

  1. 降低资源消耗:通过重复利用已经创建好的线程降低线程创建和销毁带来的消耗
  2. 提高响应速度:线程池里的线程没有达到线程的最大上限时,就有线程处于等待分配任务的状态,当任务来时无需创建新的线程就可以执行
  3. 提高线程的可管理性:线程池会根据系统的特点对池内的线程进行处理,减少创建和销毁带来的系统开销。无限的创建和销毁线程不仅消耗系统资源,还会降低系统稳定性,尽量使用线程池进行统一分配

7、final 有什么用?

用于修饰类、属性和方法;

  • 被final修饰的类不可以被继承

  • 被final修饰的方法不可以被重写

  • 被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值