【Java面试课程】Java基础,
【Java面试课程】Java基础,
一、面试整体流程
1.1 自我介绍
1.2 简要介绍一下你的项目
为了解决XXX问题,开发了一套XXX流程。有哪些部分组成,参与某个模块的开发。
1.3 java基础
1.4 有什么要问我的,
公司的项目,项目中会使用什么技术?
你说一下你最擅长的什么? 你简单说一下 选择你最熟悉的
1.简单讲一下java的跨平台原理
对于不同的系统安装不同的虚拟机,程序只需要遵循java规范,就可以在多处执行。
java通过不同的系统版本、不同位数的java虚拟机来屏蔽不同的系统指令集差异。而对外提供统一的接口(java API).对于普通的java程序员,只需要按照接口开发即可,
不同的环境上只需要在系统上安装对应的版本即可。
2. 搭建一个简单的java开发环境
java开发环境需要什么?
1.适用于开发环境的jdk
2.对应开发环境的idea
3.还需要web服务器tomcat
3. java中int数据占几个字节
java中有几种的数据类型 8种
int占4个字节 32位
bool占1位
4.java面向对象的特征
回答比较抽象的问题的时候,要举例说明
封装、抽象、继承、多态
Object obj = new XXX();
UserDao userDao = new UserDaoJdbcImp();
UserDao userDao = new UserDaoHibernateImp();
5. 有了基本的数据类型,为什么还需要包装类型?
8种数据类型,包装类型
每一个基本的数据类型都会一一对应一个包装类型
int -> Integer
java是一个面向对象的语言,而基本的数据类型不具有面向对象的特性。
比如用Integer和int分别表示Person这个类的ID
Integer-> null int-> 0 Integer表示形式更好
而且包装类型还有max.min等操作
装箱和拆箱
把基本的数据类型转换为对应的数据类型
Integer i =1 自动装箱 实际上编译时会调用Interger.valueOf 自动装箱
int j = j;自动拆箱 包装类型转换为基本数据类型 i.intValue(); 手动拆箱
6. 说一下"=="和equals的区别
非常经典
先说清楚一个,再说另一个
==判断两个变量之间的值是否相等(基本数据类型、引用)
变量可以分为基本数据类型和引用。如果是基本数据类型直接判断值,如果是引用则比较引用的内存的首地址
内存分为栈和堆
上面的int的i和j为基本类型,比较值
Integer的i和j为对象的引用,比较内存的首地址(0x00001)
Equals用来比较两个对象长得是否一样,判断两个对象的某些特征是否一样?
实际上就是调用对象的equals的方法。这时候需要重写Object的equals方法
8.String和StringBuiider的区别
String是内容不可变的字符串
String str = new String("bbbb");
而StringBuilder和StringBuiffer是内容可以改变的字符串
因为String底层使用了一个不可变的字符数组(final char[])。StringBuilder和StringBuiffer底层使用的不可变的字符数组(没有使用final修饰),
private final char values[]; # String
char[] values; # SB
- 最经典的是拼接字符串。SB可以使用append追加。这里的append需要重新开创数组空间。
String : String c="a"+"b";
StringBuilder或StringBuffer: StringBuilder sb = new StringBuilder(); sb.append("a");
拼接字符串不能使用String去拼接,要使用StringBuilder(或StringBuffer)来拼接。
因为String会创建很多的中间对象而StringBuilder不用,效率高
- StringBuilder是线程不安全的,但效率较高。
StringBuffer是线程安全的,但效率较低。
因为保证线程安全需要加锁,这样效率就低了。
以append方法为例,StringBuffer需要加同步锁synchronized
,而StringBuilder不需要,所以效率不同。
9.讲一下java中的集合
java中的集合分为存值的集合(Collections)和存key-value的集合(Map)。
存值的分为List和Set
存key-value的为Map
List是有序的,可重复的。
Set无序、不可重复的
根据equals和hashCode来判断,也就是一个对象要存储在Set中,必须要重写equals和hashCode方法
10.ArrayList和LinkedList的区别
List分为ArrayList和LinkedList。
说明区别和使用场景
ArrayList底层使用的是数组.
LinkedList底层使用的是链表
数组优点在于有索引,查询特定的元素比较快。而插入删除比较慢(数组在内存中是一块连续的内存,插入或删除会移动内存)
链表不要求地址内存是连续的。在当前元素中存上一个元素或下一个元素的地址。(这样的话查找特定元素比较慢,查询效率低,插入和删除比较快)
使用场景
ArrayList使用在查询比较多,但插入和删除比较少的情况
LinkedList使用在查询比较少,但插入和删除比较多的情况
所以ArrayList使用较多
11. HashMap和HashTable的区别
相同点
HashMap和HashTable都可以用来存储key-value的数据。
不同点
我想线程安全,但也想效率高怎么办?
ConcurrentHashMap
通过把整个Map分为N个Segment(类似HashTable),可以提高相同的线程安全,但是效率提高N倍,默认提高16倍。原理类似于并发。
12 实现拷贝文件的工具类使用字节流和字符流
我们拷贝的文件不确定是只包含字符流,有可能有字节流(图片、声音、图像等),为考虑到通用性,要使用字节流。
13. 讲一下线程的几种实现方式?
1 实现方式
1的缺点是 继承扩展性不强,java只支持单继承,如果一个类继承了Thread就不能继承其他的类了。
怎么启动一个线程。
2怎么启动
Thread thread = new Thread(继承了Thread的对象/实现了Runnable的对象);
thread.start();
启动线程使用start方法,而启动了以后执行的是run方法
3 怎么区分线程
问题
在一个系统中有多个线程,每个线程都会打印日志,我想区分是哪个线程打印的怎么办
thread.setName("设置一个线程的名称");
这是一种规范,在创建完线程之后,都需要设置名称。
14.有没有使用过线程并发库
简单了解过
JDK5中增加的并发库。这一引进给Java线程的管理和使用提供了强大的便利性
java.util.current包中提供了对线程优化、管理的各项操作,使线程的操作变得得心应手。该包提供了线程的运行、线程池的创建、线程生命周期的控制
Java中通过Executors提供了四个静态方法来创建线程池,分别为:
- newCachedThreadPool创建一个可缓存的线程池。如果线程池长度超过处理长度,可灵活回收空闲线程,若无可回收,则新建线程
- newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- newScheduledThreadPool 创建一个定长线程池。支持定时及周期性任务执行
- newSingleThreadExecutor创建一个单线程化的线程池,它只会唯一的工作线程来执行任务,保证所有任务按照指定顺序执行
线程池的作用?
连接池也一样
15.讲一下什么是设计模式?常用的设计模式有哪些
设计模式是经过前人无数次的实践总结出的在设计过程中可以反复使用的、可以解决特定问题的设计方法。
主要讲单例模式
单例模式
步骤:
饱汉模式
饥汉模式
几种模式的比较:
1、饿汉模式是线程安全的,因为实例对象在类加载过程中就会被创建,在getInstance()方法中只是直接返回对象引用。之所以被称为“饿汉”,是因为这种模式创建实例对象比较“急”,真的是饿坏了……
好处:简单明了,无需关注线程安全问题。
缺点:如果在一个大环境下使用了过多的饿汉单例,则会生产出过多的实例对象,无论你是否要使用他们。
2、饱汉模式不是线程安全的,因为是在需要的时候才会产生实例对象,生产之前会判断对象引用是否为空,这里,如果多个线程同时进入判断,就会生成多个实例对象,这是不符合单例的思想的。所以饱汉模式为了保证线程安全,就用synchronized关键字标识了方法。之所以被称为“饱汉”,因为它很饱,不急着生产实例,在需要的时候才会生产。
好处:延时加载,用的时候才会生产对象。
缺点:需要保证同步,付出效率的代价。
工厂模式
Spring的IOC就是使用了工厂模式
专门提供一个工厂来创建一个对象的实例。
对象的创建交给一个工厂去创建,自己不用创建。
代理模式
Spring AOP 就是使用的动态代理
包装模式
相关文章
- 暂无相关文章
用户点评