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