一、Java
1、Java跨平台原理
详细说明:
由于各操作系统支持的指令集,不是一致的、会让我们的程序在不同的操作系统上执行不同的代码。而Java开发了适用于不同操作系统及位数的Java虚拟机来屏蔽个系统之间的差异、提供统一接口。对于Java开发者来说,只需在不同的系统上安装对应的不同Java虚拟机,这时我们的Java程序只需遵循Java规范即可在所有系统上运行。
简单说明:
Java通过不同的系统、版本、和位数的虚拟机来屏蔽不同的系统指令及差异而对外统一接口API、对于开发者来说,只需按照接口开发即可,如果系统部署到不同环境时,只需在系统上安装对应版本的虚拟机即可。
2、搭建Java开发环境的步骤
Java环境需要啥?
- 开发环境的JDK
- 开发工具
- Web服务器
一、下载组件
二、安装JDK,配置JAVA_HOME变量,因为开发工具和服务器需要依赖该变量。
3、int占几个字节?
Java中有几种数据类型? 8种
int占4位字节、二进制32位数;
4、面向对象的特征
四大特征:封装、继承、抽象、多态
封装:将类的信息封装到类内部、不允许外部程序访问、而是通过该类提供的get/set方法来实现对隐藏信息的操作和访问,通过private 来隐藏;
继承:将子类中共有的属性和方法提取到父类、通过extends继承父类、使用继承时必须符合is-a的关系,java只能单继承、Object类是java中的基类、所有类默认继承该类、子类不能继承到的有使用private修饰的属性和方法、父类构造、默认访问修饰符并不在同包中。
抽象:使用abstract修饰的类为抽象类,目的是限制该类实例化(不能new)。
多态:指同一个引用类型,使用不能的实例而执行不同的操作。
5、有了基本数据类型,为啥还需要包装类?
java提供了8种基本数据类型:byte、short、int、long、float、double、char、boolean
包装类:每个基本数据类型都会对应一个包装类、比如:int–>Integer。
装箱和拆箱
装箱:将基本的数据类型转换成对应的包装类。比如:
Integer i = 1; 自动装箱,在编译时会调用valueOf(值)方法来装箱;
拆箱:将包装类转换为对应的基本数据类型、比如:
基本数据类型 变量名 = 对应包装类;自动拆箱,在编译时调用intValue()
Integer i = 1; // 自动装箱
Integer.valueOf(2); // 手动装箱
int j = i; // 自动拆箱
int j = i.intValue(); // 手动拆箱
为什么需要?
Java是面向对象的语言、而基本数据类型、不具备面向对象的特征。
基本数据类型没有好的方法,不能判断是否为空或最大最小值、缓存值。
缓存值:
Integer i = 1;
Integer j = 1;
System.out.println(i==j);
// 结果为true
6、"=="和equals()的区别?
==
比较两个变量之间的值是否相等、但是变量分为基本数据类型和引用类型、
如果是基本数据类型的变量会比较变量值是否相等返回boolean类型。
如果是引用类型而会判断它的内存地址是否相等。
equals()
比较两个对象的某些特征是否一致。
7、String、StringBuilder的区别?StringBuffer和StringBuilder的区别?
java中提供的三个类String、StringBuilder、StringBuffer都表示操作字符串的。
-
String:是内容不可变的字符串。底层使用了不可变的字符数组(final char[])
-
StringBuilder、StringBuffer :是内容可变的字符串。底层使用了可变的字符数组(没有final修饰)。
拼接字符串的效率:
-
String:拼接 String str = “a” + “b”; 这是三个对象。效率低;
-
StringBuilder或StringBuffer。效率高;
StringBuilder sb = new StringBuilder().sb.append(“a”).append(“b”);
-
拼接字符串不能用String、要用StringBuilder、StringBuffer。
-
-
StringBuilder线程不安全、效率高。
-
StringBuffer线程安全,效率低。
8、Java中的集合
java中的集合分为value、key-value(Conllection、Map)两种。
存储值分为:List和Set。
List和Set的区别:
List:有序、可重复。
Set:无序、不可重复。根据equals和hashCode判断、如果一个对象要存储在Set中,必须重写equals和hashCode方法。
存储key-value的为Map。
9、ArrayList和LinkedList的区别?
List常用的有ArrayList和LinkedList。
先说数据底层实现原理、再说区别、场景。
- ArrayList底层使用数组。
- LinkedList底层使用链表。
- 数组和链表的区别:
- 数组:有索引查询快、插入和删除或修改比较慢。
- 原因:数组在内存中有一块专门的内存,如果插入或删除时需要移动内存。
- 链表:不要求地址内存是连续的,在当前元素中存放上一个或下一个元素的地址。
- 查询时要从头部开始,逐个查询,所以查询效率低。
- 插入时不用移动内存,只需改变引用指向即可,所以插入或删除效率高。
- 数组:有索引查询快、插入和删除或修改比较慢。
- ArrayList使用在查询比较多,插入和删除较少的情况。
- LinkedList使用在查询比较少,插入和删除较多的情况。
10、HashMap和HashTable的区别?HashTable和ConcurrentHashMap的区别?
HashMap和HashTable
-
相同点:都可用来存储key-value的数据。
区别:
-
HashMap可把null作为key或value的。HashTable是不可的。
-
HashMap是线程不安全的、效率高。HashTable是线程安全的,效率低。
想线程安全又想效率高?
通过把整个Map分为多个Segnent(类似HashTable)可提供相同的线程安全,效率提升N倍、默认提升16倍。
11、实现拷贝文件的工具类使用字节流还是字符流?
首先明白什么是字节流和字符流?
- 字符流:传递字符,字符最终会转换为字节
- 字节流:传递二进制位字节。
拷贝文件不确定只包含字符流,有可能有字节流(图片、音频等),为考虑通用性,使用字节流。
12、线程
实现线程的方式?
-
继承Thread类,重写run方法,实现一个线程。
-
实现Runnable接口实现一个线程。
继承缺点:继承扩展性不强,java只支持单继承,如果一个类继承了Thread类就不能继承其他类了。
如何启动线程?
Thread thread = new Thread(继承的Thread对象/实现Runnable对象);
thread.start();
启动线程使用start()方法,启动后执行的是run()方法。
如何区分线程?
问题:在一个系统中多个线程,每个线程都会打印日志,如何区分是那个线程打印的?
thread.setName("设置一个线程名");
在创建Thread对象时通过setName()方法设置一个线程名,这是一种规范,都要设置名称。
什么是线程并发库?
JDK5中增加了DougLea的并发库,方便了线程的管理和使用提供了便利性。
java.util.current包中提供了对线程优化,管理的各项操作,该包提供了线程的运行,线程池的创建,线程生命周期的控制。
通过Executors类提供四种静态方法可创建线程池:
- newCachedThreadPool:创建一个可缓存的线程池,如果线程池长度超过处理需要,可回收空闲线程,若无可回收,则新建线程。
- newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- newScheduledThreadPool:创建一个定长线程池,支持定时及周期任务执行。
- newSingleThreadExecutor:创建一个单线程化的线程池,只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。(FIFO、LIFO,优先级)
线程池的作用?
- 限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃、
- 提供了附加功能,比如定时,延时来执行某些线程。
13、什么是设计模式?常用的设计模式有什么?
设计模式就是经过前人的多次实践总计出的,设计过程中可反复使用的,可解决特定问题的设计方法。
-
单例模式(饱汉模式、饥汉模式)
1、构造方法私有化、除了自己的类中能创建外其它地方都不能创建。
2、在自己的类中创建一个单实例(饱汉模式是一出来就创建单实例,饥汉模式需要的时候才会创建)
3、提供一个方法获取该实例对象(创建时需要进行方法同步)
-
工厂模式:SpringIOC、对象的创建交给一个工厂去创建,无需自己创建。
-
代理模式:SpringAOP动态代理
-
包装模式
二、JavaWeb
1、get和post的区别?
共同点: get和post都是http的请求方式,用户通过不同的请求方式完成对url的不同操作。
区别:
1、get提交的数据在地址栏显示、post提交的数据在地址栏中不显示。
get请求以?分割URL,多个参数用&号拼接。
2、get请求对地址长度输入有限制、post无限制。
3、post安全性比get高。
2、什么是Servlet?
Servlet是用Java编写的服务器端程序、这些Servlet都要实现Servlet接口、主要用于数据交互、生成动态网页内容、运行于支持java的应用服务器中。
HttpServlet重写doGet和doPost方法或重写service方法完成对get/post请求的响应。
3、Servlet的生命周期
-
加载和实例化
将Servlet部署到容器中,容器启动后接受请求时,容器会在内存中查找是否有该Servlet实例,如果没有则创建,如果有直接取出响应请求,执行一次。
-
初始化
实例化完容器调用init()方法初始化、将Servlet处理请求前完成的一些资源加载,jdbc连接等,执行一次。
-
就绪状态(服务)
接收请求时调用service()方法、根据请求类型调用doGet()/doPost()方法、执行多次。
-
销毁
容器会判断Servlet是否要被资源回收、调用destroy()方法指明哪些资源回收。
简单描述:
- 调用构造,实例化,一次。
- 调用init()、初始化,一次。
- 调用service()、根据请求类型调用doGet()/doPost(),多次。
- 当服务器重启或关闭时,调用destroy()进行资源回收。
4、forward()与redirect()的区别?
forward():在服务器上执行、浏览器的地址栏URL不变、数据不丢失、一次请求。
redirect():在客户端上执行、浏览器的地址栏URL改变、数据会丢失、两次请求。
5、JSP和Servlet有什么区别?有什么关系?
JSP是Servlet的扩展,所有JSP文件都会被翻译为一个继承HttpServlet的类。
JSP主要用于视图样式、Servlet主要用于逻辑控制。
Servlet如果要实现HTML功能、需要使用Writer输出HTML标签太麻烦、而JSP是Java和HTML组合为一个扩展名为.jsp的文件、做页面展示比较方便而嵌入逻辑比较复杂。
6、JSP有哪些内置对象?分别有什么作用域和方法?
9个内置对象:
- request:客户端请求信息、包含get/post请求参数。
- response:服务器响应给客户端的信息。
- pageContext:页面属性管理jsp页面。
- session:一次会话、关闭浏览器结束。
- application:整个应用程序。
- out:页面输出数据
- config:本质是一个ServletConfig对象。
- page:当前页
- exception:异常页面对象。
四大作用域:
- page:在当前页面使用
- request:每次新的请求都会创建request对象、一次转发时使用。
- session:再一次会话期内有效。
- application:服务器启动时。
常用方法:
setAttribute(String key , Object value):key-value、存储在request或session中。
getAttribute(String key):通过key取value。
removeAttribute():从作用域中删除key
invalidate():设置session立即失效。
getRequestDispatcher("*.jsp").forward(request,response);转发
sendRedirect("*.jsp"):重定向;
7、Session和Cookie的区别?分别在项目哪里使用?
session和cookie都是会话跟踪技术。Cookie通过在客户端记录信息确定用户身份。
Session通过在服务器端记录信息确定用户身份、但Session的实现依赖于Cookie、sessionId(session唯一标示存放在客户端)。
区别:
session: 在服务器上保存数据、类型为Object、会话结束后数据销毁、保存重要数据。
cookie: 在客户端上保存数据、类型为String、长期保存在客户端、保存不重要的数据。
单个cookie保存的数据不超过4K、很多浏览器都限制一个站点最多保存20个cookie
8、MVC的部分有哪些技术来实现?
- M(Model)模型:JavaBean
- V(View)视图:JSP、html、freemaker、volicity…
- C(Controller)控制器:Servlet、Action
三、数据库
1、数据库的分类
数据库分为:关系型数据库和非关系型数据库
常用的关系型数据库
- MySql 免费
- Oracle 收费
- SqlServe