天天看点

怎么判断自己启动的线程是否执行完成 java_Java面试笔记(上)

面试整体流程(HR 或技术面)

1.请简单的自我介绍

我叫***,工作*年了,先后做过**项目、**项目。

2.请你简单的介绍一下**项目

该系统主要有哪些部分组成,简单介绍项目的整体架构,具体参与某个模块的开发,关于这个模块的业务及设计。

3.会问一下 Java 相关的专业技能

见第二部分,Java 的专业技能。

4.你还有什么需要询问我的吗?

公司要做的是什么项目?项目中会使用到什么技术?

注意:经历了多轮面试后,对于你的自我介绍和项目项目经验,面试官就不太关心了,你应该说一下你最擅长的什么?简单描述一下。最终技术面试完成后,一般都会让你回家等消息,或者等 hr 来和你谈薪资和福利。

怎么判断自己启动的线程是否执行完成 java_Java面试笔记(上)

Java 的专业技能

1.Java 的基础部分

1.1 简单讲一下 java 的跨平台原理

由于各操作系统(windows,liunx等)支持的指令集,不是完全一致的。就会让我们的程序在不同的操作系统上要执行不同程序代码。Java 开发了适用于不同操作系统及位数的 java 虚拟机来屏蔽各系统之间的差异,提供统一的接口。对于我们 java 开发者而言,你只需要在不同的系统上安装对应的不同 java 虚拟机、这时你的 java 程序只要遵循 java 规范,就可以在所有的操作系统上面运行 java 程序了。 Java 通过不同的系统、不同版本、不同位数的  java 虚拟机 (jvm),来屏蔽不同的系统指令集差异而对外体统统一的接口(java API),对于我们普通的 java 开发者而言,只需要按照接口开发即可。如果我系统需要部署到不同的环境时,只需在系统上面按照对应版本的虚拟机即可。

怎么判断自己启动的线程是否执行完成 java_Java面试笔记(上)

1.2 讲一下 java 中 int 数据占几个字节

数据类型 缺省值 长度(1字节8位) 范围
byte 8位 -128 ~ 127
short 16位 -32768 ~ 32767
int 32位 -2147483648 ~ 2147483648
long 64位 -9223372036854775808 ~ 9223372036854775807
float 0.0 32位 3.4E-038 ~ 3.4E+038
double 0.0 64位 1.7E-308 ~ 1.7E+308
char ‘\u0000’ 16位 ‘\u0000’ ~ ‘u\ffff’
boolean false 1位 true/false

1.3 面向对象的特征有哪些方面

有四大基本特征:封装、抽象、继承、多态

面向对象的封装性,即将对象封装成一个 高度自治和相对封闭 的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。例如: 张三这个人,他的姓名等属性,要有自己提供的获取或改变的方法来操作。private name setName getName 抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。  就是把现实生活中的对象,抽象为类。 在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行, 把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要, 这就是继承。 多态是指程 序中 定 义的引 用变量 所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量 到底 会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

Object obj = new xxx();

UserDao userDao = new UserDaoJdbcImpl();

UserDao userDao = new UserDaoHibernateImpl();

靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在 运行期 才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。 原则:回答比较抽象问题的时候,要举例说明

1.4 有了基本数据类型,为什么还需要包装类型?

Java 基本数据类型,对应的都有其包装类型,例如 boolean -> Boolean,int -> Integer,在 Java 中存在一种操作,叫装箱和拆箱, 装箱 :把基本的数据类型转换成对应的包装类型, 拆箱 :就是把包装类型转换为基本数据类型。 Java是一个面向对象的语言,而基本的数据类型,不具备面向对象的特性。

1.5 说一下"=="和equals方法究竟有什么区别?

==用来判断两个变量之间的的值是否相等,变量就可以分为基本数据类型变量,引用类型,如果是基本数据类型的变量直接比较值,而引用类型要比较对应的引用的内存的首地址; equals 用来比较两个对象长得是否一样,判断两个对象的某些特征是否一样,实际上就是调用对象的 equals 方法进行比较。

1.6 讲一下 String 和 StringBuilder 的区别,StringBuffer 和 StringBuilder 的区别又是什么?

String  是内容不可变的字符串, String 底层使用了一个不可变的字符数组 (final char[]) ; 而StringBuillder StringBuffer, 是内容可以改变的字符串 。StringBuillder、StringBuffer 底层使用的可变的字符数组(没有使用 final 来修饰); 拼接字符串不能使用String进行拼接,要使用 StringBuilder 或者 StringBuffer。 StringBuilder 是线程不安全的,效率较高;而 StringBuffer 是线程安全的,效率较低。 1.7 讲一下java中的集合? Java中的集合分为 value,key--vale(Conllection Map) 两种; 存储值有分为 List 和  Set: List 是有序的,可以重复的。 Set 是无序的,不可以重 复的,根据 equals 和 hashcode 判断,也就是如果 一个对象要存储在 Set 中,必须重写 equals 和 hashCode 方法。 存储 key-value 的为 map;

List常用的 ArrayList 和 LinkedList,区别和使用场景?

ArrayList 底层使用时数组,LinkedList 使用的是链表。 数组查询具有所有 查询特定元素比较快。而插入和删除和修改比较慢 (数组在内存中是一块连续的内存,如果插入或删除是需要移动内存)。 链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址。查询时需要从头部开始,一个一个的找。 所以查询效率低 。插入时不需要移动内存,只需改变引用指向即可。所以 插入或者删除的效率高。 ArrayList 使用在查询比较多,但是插入和删除比较少的情况,而 LinkedList 使用在查询比较少而插入和删除比较多的情况。

1.8 HashMap 和 HashTable 的区别,HashTable 和 ConcurrentHashMap 的区别?

相同点:HashMap 和 HasheTalbe 都可以使用来存储 key-value 的数据;

区别:

1、HashMap 是可以把 null 作为 key 或者 value 的,而 HashTable 是不可以的。

2、HashMap 是线程不安全的,效率较高,而 HashTalbe 是线程安全的,效率较低。

ConcurrentHashMap 属于线程安全的 HashMap;

1.9 讲一下线程的几种实现方式,启动方式?区分方式?

①实现方式

1、通过继承 Thread 类实现一个线程

2、通过实现 Runnable 接口实现一个线程

②怎么启动?

   Thread thread = new Thread(继承了 Thread 的对象/实现了 Runnable 的对象)

   thread.setName(“设置一个线程名称”);

   thread.start();

   启动线程使用 start 方法,而启动了以后执行的是 run 方法。

③怎么区分线程?在一个系统中有很多线程,每个线程都会打印日志,我想区分是哪个线程打印的怎么办?

   thread.setName(“设置一个线程名称”); 这是一种规范,在创建线程完成后,都需要设置名称。

1.10 有没有使用过线程并发库?

简单了解过; JDK5 中增加了  Doug Lea  的并发库,这一引进给 Java 线程的管理和使用提供了强大的便利性。 java.util.current  包中提供了对线程优化、管理的各项操作,使得线程的使用变得的心应手。该包提供了线程的运行,线程池的创建,线程生命周期的控制。 Java 通过  Executors  提供四个静态方法创建四种线程池,分别为:

newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长的线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长的线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。

1.11 线程池的作用?

1、限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃;

2、线程池不需要每次都去创建或销毁,节约了资源;

3、线程池不需要每次都去创建,响应时间更快。

1.12 讲一下什么是设计模式?常用的设计模式有哪些?

设计模式就是 经过前人无数次的实践总结出的 ,设计过程中可以反复使用的、可以解决特定问题的 设计方法 。

单例(饱汉模式、饥汉模式)

1、构造方法私有化,除了自己类能创建外,其他地方都不能创建

2、在自己的类中创建一个单实例(饱汉模式是一出来就创建创建单实例,而饥汉模式需要的时候才创建)

3、提供一个方法获取该实例对象(创建时需要进行方法同步)

工厂模式:Spring IOC 就是使用了工厂模式,对象的创建交给一个工厂去创建。

代理模式:Spring AOP 就是使用的动态代理。

2.Java Web 相关

2.1 讲一下 http get 和 post 请求的区别?

见《Http中的几种请求方式》

2.2 说一下你对 servlet 的理解?或者 servlet 是什么?

Servlet(Server Applet),全称 Java Servlet,是用Java编写的服务器端程序,而这些 Sevlet 都要实现 Servlet 这个接口,其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容,Servlet 运行于支持 Java 的应用服务器中。

2.3 简单说一下 servlet 的生命周期?

servlet 有良好的生存期的定义,包括 加载 和 实例化 、 初始化 、 处理请求 以及 服务结束, 这个生存期由 javax.servlet.Servlet 接口的 init、service 和 destroy 方法表达。 加载 Servlet 的 class -> 实例化 Servlet -> 调用 Servlet 的 init 完成初始化 -> 响应请求(Servlet 的 service 方法) -> Servlet 容器关闭时( Servlet 的 destory 方法) Servlet 启动时,开始 加载 servlet 生命周期开始,Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法,service 方法自动派遣运行与请求对应的 doXXX 方法(doGet,doPost)等,当服务器决定将实例销毁的时候 (服务器关闭) 调用其 destroy 方法。

2.4 Servlet API 中 forward() 与 redirect() 的区别?

1、forward 是服务器端的转向,而 redirect 是客户端的跳转;

2、使用 forward 浏览器的地址不会发生改变,而 redirect 会发生改变;

3、forward 是一次请求中完成。而 redirect 是重新发起请求;

4、forward 是在服务器端完成,而不用客户端重新发起请求,效率较高。

2.5 JSP 和 Servlet 有哪些相同点和不同点?

JSP 是  Servlet 技术的扩展,所有的 jsp 文件都会被翻译为一个继承 HttpServlet 的类, 也就是jsp 最终也是一个 Servlet,这个 Servlet 对外提 供服务。 Servlet 和 JSP 最主要的不同点在于  JSP 侧重于视图,Servlet 主要用于控制逻辑。

2.6 JSP 有哪些内置对象?作用分别是什么?

9个内置的对象:

request 用户端请求,此请求会包含来自GET/POST请求的参数

response 网页传回用户端的回应

pageContext 网页的属性是在这里管理

session 与请求有关的会话期

application servlet 正在执行的内容

out 用来传送回应的输出

config servlet 的构架部件

page JSP 网页本身

exception 针对错误网页,未捕捉的例外

四大作用域: pageContext、request、session、application  可以通过  jstl  从四大作用域中取值。 Jsp传递值:request、session、application、cookie 也能传值

2.7 说一下 session 和 cookie 的区别?

Session 和 cookie 都是会话(Seesion)跟踪技术, Cookie 通过在客户端记录信息确定用户身份,Session 通过在服务器端记录信息确定用户身份。 但是 Session 的实现依赖于 Cookie 的 sessionId(session 的唯一标识需要存放在客户端)。

2.8 MVC 的各个部分都有那些技术来实现? 

M(Model) 模型:javabean

V(View) 视图:html、jsp、volicity、freemaker

C(Control) 控制器:Servlet,Action

Jsp + Servlet + javabean 最经典 mvc 模式,实际上就是model2的实现方式,就是把视图和逻辑隔离开来

Model1的方式:jsp + service + dao

MOdel2的方式:jsp + servlet + service + dao

预告:Java面试笔记(中)

怎么判断自己启动的线程是否执行完成 java_Java面试笔记(上)
怎么判断自己启动的线程是否执行完成 java_Java面试笔记(上)