面试题 ------ 基础篇
1、面试流程
1、简单的自我介绍
我是xxx,工作xxx年,我现在在xxx公司,先后做过xxx个项目,yyy项目。
2、你简单介绍一下xxx项目。为了解决xxx问题,开发了一套xxx系统,该系统主要有哪些部分组成。简单介绍项目的整体架构。参与某个模块得开发。就要求你说一下这个模块得业务及设计。
3、会问一下Java 的专业技能
4、你还有什么需要询问我的吗?
公司要做项目?项目中会使用一下什么技术/
经历多轮面试后,对于你的自我介绍和项目、项目经验面试官就不太关心了。
你说一下你最擅长的是什么?你简单说一下?
最终技术面试完成后,都会让你回家等消息。或者等 Hr 来和你谈薪资和福利。
2、Java 得跨平台原理
Java 通过不同的系统、不同版本、不同位数的Java 虚拟机(jvm)、来屏蔽不同的系统的指令集差异而对
外体统一接口(Java API),对于我们不同的Java 的开发语言而言,只需要按照接口开发即可,如果我系统需要
部署到不同的开发环境时,只需在系统上面按照对应版本得虚拟机即可。
3、搭建一个java的开发环境
1、适用于我们开发环境的jdk
2、对应开发环境 eclipse
3、还需要 web 服务器(tomcat)
下载对应组件
安装
jdk 安装正常流程安装即可,配置我们得 JAVA_HOME, 因为后面 eclipse 和 tomcat 会依赖这个变量
Eclipse 正常解压就 ok,设置 workspace 的默认编码
Tomcat 正常解压就 ok,把 tomcat 集成到 eclipse 中,安装插件就 ok
Svn/git
3、java中int占几个字节
java 中有几种基本数据类型?8种
1、整型
类型 存储需求 bit数 取值范围 备注
int 4字节 4*8
short 2字节 2*8 -32768~32767
long 8字节 8*8
byte 1字节 1*8 -128~127
2、浮点型
类型 存储需求 bit数 取值范围 备注
float 4字节 4*8 float 类型的数值后缀F(例如:3.14F)
double 8字节 8*8 没有后缀F的浮点数(如3.14)默认为double类型
3、char 类型
类型 存储需求 bit数 取值范围 备注
char 2字节 2*8
4、boolean 类型
类型 存储需求 bit数 取值范围 备注
boolean 1字节 1*8 false,true
int 占 4个字节,32 位
bollean 1位
5、java面向对象的特征
有四大基本特征:封装、继承、多态、抽象
1、封装:即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。
2、抽象:找出一些事物的相似和共性之处,然后将这些事物归为一类,这个类只能考虑这些事的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关方面。就是把现实生活中的对象,抽象为类。
3、继承:定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义得内部作为自己的内容,并且加入若干新的内容,或修改原来的方法使之更适合特殊的需要。
4、多态:是指程序定义得引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象。该引用变量发出的方法调用到底是哪个类的实现的方法,必须在由程序运行期间才能决定。
靠的是父类或接口定义得引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
6、有了基本数据类型,为什么还需要包装类型
基本数据类型。java 中提供了 8 中基本的数据类型。boolean int float 等
包装类型:每一个得数据类型都会一一对应一个包装类型
boolean ---> Boolean
int -----> Integer
装箱和拆箱
装箱:把基本的数据类型转换成对应的包装类型.
Integer i = 1; 自动装箱:实际上在编译时会调用 Integer.valueOf 方法来装箱
拆箱:把包装类型转换为基本数据类型,基本数据类型 名称 = 对应的包装类型。
int j = i; 自动拆箱:编译时会调用 i.intValue();
Java 是一个面向对象的语言,而基本的数据类型,不具备面向对象的特性。
null Integer ----> null int ----> 用Integer 和 int 分别表示 Person 这个类的Id
Max 最大值
Min 最小值
缓存值:对象缓存, Integer i = 1; Integer j = 1; i==j;
7、说一下“==” 和 equals 方法究竟有什么区别?
== 用来判断两个变量之间的值是否相等、变量就可以分为基本数据类型变量,引用类型。如果是基本数据类型的变量直接比较值而引用类型要比较对应的引用的内存的首地址。
equals 用来比较两个对象长得是否一样,判断两个对象的某些特征是否一样。实际上就是调用对象的 equals 方法进行比较。
8、String 和StringBuilder 的区别(final)?StringBuffer 和 StringBuilder 的区别?
在java 中提供三个类String、StringBuilder、StringBuffer 来表示和操作字符串。字符串就是多个字符的集合。
String 是内容不可变的字符串。String 底层使用了一个不可变字符串数组(final char[])
String str = new String("bbb");
而StringBuffer、StringBuilder 是内容可以改变的字符串。
StringBuilder、StringBuffer 底层使用得可变的数组(没有使用final 修饰)
最经典就是拼接字符串
1、Stirng 进行拼接,String c = "a" + "b";
2、StringBuilder 或者 StringBuffer StringBuffer sb = new StringBuffer();
sb.append("b").append("a");
StringBuilder 是线程不安全的,效率高。
StirngBuffer 是线程安全的,效率低。
9、Java 中的集合
Java 中的集合分为value(Conllection), key-value(Map)两种
存储值分为 List 和 Set:
List 是有序的,可以重复的。
Set 是无序的,不可重复的。(根据equals 和 hashcode 判断,也就是如果一个对象要存储在Set 中,必须重写 equals 和 hashCode 方法)
存储key-value 的为map:
10、ArrayList 和 LinkeList 的区别 和 使用场景?
ArrayList 底层使用得是数组。LinkList 使用的是链表。
数组查询具有索引查询特定元素比较快。而插入和删除和修改比较慢(数组在内存中是一块连续的内存。如果插入和删除是需要移动位置)。
链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址。查询时需要从头部开始,一个一个的找。所以查询效率低。插入时不需要移动内存,只需改变引用指向即可。所以插入或删除效率高。
ArrayList 使用在查询比较多,但是插入和删除比较少的情况,而LinkedList 使用在查询比较少而插入和删除比较多的情况
11、HashMap 和 HashTable 的区别?HashMap 和 ConcurrentHashMap 的区别?
相同点:HashMap 和 HashTable 都可以使用来存储 key-value 的数据。
区别:
1、HashMap 是可以把null 作为key 或者value的,而 HashTable 是不可以的。
2、HashMap 是线程不安全的,效率较高。而HashTable 是线程安全的,效率较低。
通过把整个Map 分为N 个 Segment (类似 HashTable),可以提供相同的线程安全,但是效率提升N 倍,默认提升16倍。
12、实现一个拷贝文件类使用字节流还是字符流?
我们拷贝的文件不确定是只能包含字符流,有可以能有字节流(图片、声音、图像)。为了考虑到通用性,要使用字节流。
13、讲一下线程的几种实现方式?
1、通过继承 Thread 类实现一个线程
2、通过实现 Running 接口实现一个线程
继承扩展性不强,java 只支持单继承,如果一个类继承 Thread 就不能继承其他类了。
1)怎么启动?
Thread thread = new Thread(继承了 Thread的对象/实现了 Running对象);
thread.setName("设置一个线程名称");
thread.start();
启动线程使用 start 方法,而启动以后执行的是 run 方法
2)怎么区分?在一个系统中有很多线程,每个线程都会打印日志,我想区分是那个线程打印?
thread.setName("设置一个线程名称"); 这是一种规范,在线程完成后,都需要设置名称
14、线程并法库和线程池的作用?
JDK5 中增加了 Doug Lea的并法库,这一引进给Java 线程的管理和使用提供了强大的便利性。java.util.current 包中提供了对线程优化。管理的各项操作,使得线程的使用变得心应手。该包提供了线程的运行,线程池的创建,线程生命周期的控制。
Java 通过Executors 提供四种静态方法创建线程池。分别为:
newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程。若无可回收,则新建线程。
newFixedTreadPool 创建一个定长的线程池,可控制线程最大并发数,超过的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行
newSingleThreadPoolExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行
线程池的作用?
1、限定线程的个数,不会导致由于导致线程过多导致系统运行缓慢或崩溃。
2、线程池不需要每次都去创建或销毁,节约了资源。
3、线程池不需要每次都去创建,响应时间更快。
连接池也是一样?
15、设计模式和常用的设计模式?
设计模式:经过前人无数次的实践总结出,设计过程中可以反复使用的、可以解决特定问题的设计方法。
单例模式:饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程安全,同步代码块)、双重检查、静态内部类、枚举
1、构造方法私有化,让出了自己类中能创建外其他地方都不能创建
2、在自己的类中创建一个单实例
3、提供一个方法获取该实例对象
工厂模式:Spring IOC 就是使用了工厂模式。
对象的创建交给一个工厂去创建。
代理模式:Spring AOP 就是使用的动态代理。