1、JAVA 就业课程1、面试整体流程1.1 简单的自我介绍我是 xxxx,工作 xxx 年.我先后在 xxxx 公司、yyyy 公司工作。先后做个 xxxx 项目、yyyy 项目。1.2 你简单介绍一下 xxxx 项目为了解决 xxxx 问题,开发了一套 xxxx 系统,该系统主要有那些部分组成。简单介绍项目的整体架构。参与某个模块的开发。就要求你说一下这个模块的业务及设计。1.3 会问一下 JAVA 的专业技能后面详细讲解1.4 你还有什么需要询问我的吗公司要做的项目?项目中会使用一下什么技术?注意:经历了多轮面试后,对于你的自我介绍和项目项目经验面试官就不太关心了。你说一下你最擅长的什么?你
2、简单说一下?最终技术面试完成后,都会让你回家等消息,或者等 hr 来和你谈薪资和福利。2、java 的专业技能2.1 java 的基础部分2.1.1 简单讲一下 java 的跨平台原理由于各操作系统(windows,liunx 等)支持的指令集,不是完全一致的。就会让我们的程序在不同的操作系统上要执行不同程序代码。Java 开发了适用于不同操作系统及位数的 java 虚拟机来屏蔽个系统之间的差异,提供统一的接口。对于我们 java 开发者而言,你只需要在不同的系统上安装对应的不同 java 虚拟机、这时你的 java 程序只要遵循 java 规范,就可以在所有的操作系统上面运行 java 程序
3、了。Java 通过不同的系统、不同版本、不同位数的 java 虚拟机(jvm), 来屏蔽不同的系统指令集差异而对外体统统一的接口(java API),对于我们普通的 java 开发者而言,只需要按照接口开发即可。如果我系统需要部署到不同的环境时,只需在系统上面按照对应版本的虚拟机即可。2.2.2 搭建一个 java 开发环境的步骤Java 开发环境需要些什么?1、 适用于我们开发环境的 jdk2、 对应开发环境 eclipse3、 还需要 web 服务器(tomcat)1、 下载对应组件2、 安装Jdk,安装正常流程安装即可,配置我们的 JAVA_HOME,因为后面的 eclispe 和 to
4、mcat 会依赖于这个变量.Eclispe 正常解压就 ok,设置 workspace 的默认编码Tomcat 正常解压就 ok,把 tomcat 集成到 eclispe 中,安装插件就 OK。.Svn/git2.1.3 讲一下 java 中 int 数据占几个字节Java 中有几种基本数据类型?8 种Int 占 4 个字节,32 位Boolean 1 位2.1.4 面向对象的特征有哪些方面有四大基本特征:封装、抽象、继承、多态面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。张三这个人,他的姓名等属性,要有自己提供的获取或
5、改变的方法来操作。private name setName getName抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。 就是把现实生活中的对象,抽象为类。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。遗产继承多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定
6、,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。Object obj = new xxx();UserDao userDao = new UserDaoJdbcImpl();UserDao userDao = new UserDaoHibernateImpl();靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。 原则:回答比较抽象问题的时候,要举例说明2.
7、1.5 有了基本数据类型,为什么还需要包装类型?基本数据类型,java 中提供了 8 中基本的数据类型。boolean int float 等包装类型:每一个基本的数据类型都会一一对应一个包装类型。boolean -BooleanInt -Integer装箱和拆箱装箱:把基本的数据类型转换成对应的包装类型.Integer .valueOf(1)Integer i = 1;自动装箱,实际上在编译时会调用 Integer .valueOf 方法来装箱拆箱:就是把包装类型转换为基本数据类型.基本数据类型 名称 = 对应的包装类型。Integer i = 1;int j = i;/自动拆箱/int j
8、 = i=intValue();手动拆箱自动拆箱:实际上会在编译调用 intValueJava 是一个面向对象的语言,而基本的数据类型,不具备面向对象的特性。null Integer-null int-0 用 Integer 和 int 分别表示 Person 这个类的 IDMax 最大值min 最小值缓存值:对象缓存,Integer i=1; integer j= 1;i =j2.1.6、说一下“=“和 equals 方法究竟有什么区别?非常经典的一个面试题?先说清楚一个,再来说另一个?=用来判断两个变量之间的的值是否相等。变量就可以分为基本数据类型变量,引用类型。如果是基本数据类型的变量直
9、接比较值而引用类型要比较对应的引用的内存的首地址。equals 用来比较两个对象长得是否一样。判断两个对象的某些特征是否一样。实际上就是调用对象的 equals 方法进行比较。2.1.7 讲一下 String 和 StringBuilder 的区别(final)?StringBuffer 和 StringBuilder 的区别?1.在 java 中提供三个类 String StringBuillder StringBuffer 来表示和操作字符串。字符串就是多个字符的集合。String 是内容不可变的字符串。String 底层使用了一个不可变的字符数组(final char)String st
10、r =new String(“bbbb”);而 StringBuillder StringBuffer,是内容可以改变的字符串。 StringBuillder StringBuffer 底层使用的可变的字符数组(没有使用 final 来修饰) 2.最经典就是拼接字符串。1、 String 进行拼接.String c = “a”+”b”;2、 StringBuilder 或者 StringBuffer StringBuilder sb = new StringBuilder(); sb.apend(“a”).apend(“b”)拼接字符串不能使用 String 进行拼接,要使用 StringBu
11、ilder 或者 StringBuffer3.StringBuilder 是线程不安全的,效率较高 .而 StringBuffer 是线程安全的,效率较低。2.1.8、讲一下 java 中的集合?Java 中的集合分为 value,key-vale(Conllection Map)两种。存储值有分为 List 和 Set.List 是有序的,可以重复的。Set 是无序的,不可以重复的。根据 equals 和 hashcode 判断,也就是如果一个对象要存储在 Set 中,必须重写 equals 和 hashCode 方法。存储 key-value 的为 map.8、 ArrayList 和 L
12、inkedList 的区别?List 常用的 ArrayList 和 LinkedList。区别和使用场景?ArrayList 底层使用时数组。LinkedList 使用的是链表。数组查询具有所有查询特定元素比较快。而插入和删除和修改比较慢(数组在内存中是一块连续的内存,如果插入或删除是需要移动内存)。链表不要求内存是连续的,在当前元素中存放下一个或上一个元素的地址。查询时需要从头部开始,一个一个的找。所以查询效率低。插入时不需要移动内存,只需改变引用指向即可。所以插入或者删除的效率高。ArrayList 使用在查询比较多,但是插入和删除比较少的情况,而 LinkedList 使用在查询比较少
13、而插入和删除比较多的情况。2.1.9 讲一下 HashMap 哈 HashTable 的区别 ?HashTable 和ConcurrentHashMap 的区别?相同点:HashMap 和 HasheTalbe 都可以使用来存储 key-value 的数据。区别:1、 HashMap 是可以把 null 作为 key 或者 value 的,而 HashTable 是不可以的。2、 HashMap 是线程不安全的,效率较高。而 HashTalbe 是线程安全的,效率较低。?我想线程安全但是我又想效率高?通过把整个 Map 分为 N 个 Segment(类似 HashTable),可以提供相同的线
14、程安全,但是效率提升 N 倍,默认提升 16 倍。2.1.10、实现一个拷贝文件的工具类使用字节流还是字符流?我们拷贝的文件不确定是只包含字符流,有可以能有字节流(图片、声音、图像等) ,为考虑到通用性,要使用字节流。2.1.11、讲一下线程的几种实现方式 ?启动方式?区分方式?实现方式1、 通过继承 Thread 类实现一个线程2、 通过实现 Runnable 接口实现一个线程继承扩展性不强,java 总只支持单继承,如果一个类继承 Thread 就不能继承其他的类了。怎么启动?Thread thread = new Thread(继承了 Thread 的对象/实现了 Runnable 的对
15、象)thread.setName(“设置一个线程名称”);thread.start();启动线程使用 start 方法,而启动了以后执行的是 run 方法。怎么区分线程?在一个系统中有很多线程,每个线程都会打印日志,我想区分是哪个线程打印的怎么办?thread.setName(“设置一个线程名称”); 这是一种规范,在创建线程完成后,都需要设置名称。2.1.12 有没有使用过线程并发库 ?简单了解过?JDK5 中增加了 Doug Lea 的并发库,这一引进给 Java 线程的管理和使用提供了强大的便利性。 java.util.current 包中提供了对线程优化、管理的各项操作,使得线程的使用
16、变得的心应手。该包提供了线程的运行,线程池的创建,线程生命周期的控制.Java 通过 Executors 提供四个静态方法创建四种线程池,分别为:newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级) 执行2.1.13 线程池的作用?1、 限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃2、 线程池不需要每次都去创建或销毁,节约了资源、3、 线程池不需要每次都去创建,响应时间更快。连接池也是一样?2.1.14 讲一下什么是设计模式?常用的设计模式有哪些?设计模式就是经过前人无数次的实践总结出的,设计过程中可以反复使用的、可以解决特