JAVA跨平台的原理
由于各操作系统支持的指令集不是完全一致的,这会让我们在不同的操作系统上执行不同的程序代码。JAVA开发了适用于不同操作系统及位数的JAVA虚拟机来屏蔽系统之间的差异,提供统一的接口。开发者只需要在不同的系统上安装对应的JAVA虚拟机,只要编写的程序符合规范就可以在所有的操作系统上运行java程序。
Java中一共有八个基本数据类型
Int占4个字节,32位
面向对象有四大基本特征:封装、抽象、集成、多态。
==:用来判断两个变量之间的值是否相等,如果是基本数据类型的变量直接比较值,而如果是引用类型需要比较对应的引用的内存的首地址
equals:两个对象是否为同一个,其中的内容是否相同
String、StringBuilder和StringBuffer的区别
java中提供三个类String、StringBuilder和StringBuffer来表示和操作字符串。
String是内容不可变字符串,它底层使用了一个不可变的字符数组
StringBuilder和StringBuffer是内容可以改变的字符串,底层使用的是可变的字符数组
StringBuilder是线程不安全的,但是效率较高
StringBuffer是线程安全的(有同步锁),但是效率较低
Java中集合分为value、key-value(Collection、Map)两种
存储值分为List和Set
List是有序的,可以重复的
Set是无序的,不可以重复的,根据equals和hashcode判断,如果一个对象要存储在Set中必须重写equals和hashcode
ArrayList和LinkedList的区别
ArrayList底层使用的是数组,查询特定元素比较快,但是插入和删除、修改比较慢(数组在内存中是一块连续的内存,如果插入或删除需要移动内存)
LinkedList使用的是链表,链表不要求地址内存是连续地,在当前元素中存放下一个或上一个元素的地址,查询时需要从头部开始,一个一个的找,查询效率低,而插入时不需要移动内存,只需要改变引用指向,插入或者删除的效率高。
ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList使用在查询比较少而插入和删除比较多的情况。
HashMap和HashTable的区别
HashMap和HashTable都可以使用来存储key-value的数据
1.HashMap可以把null作为key或者value的,而HashTable是不可以的
2.HashMap是线程不安全的,效率较高;Hashtable是线程安全的,效率较低。
实现一个拷贝文件的工具类使用字节流还是字符流
拷贝的文件不确定只包含字符流,有可能有字节流,为了考虑到通用性,要使用字节流。
线程的几种实现方式
1. 通过继承Thread类实现一个线程,扩展性不强,java中只支持单继承
2. 通过实现Runnable接口实现一个线程
怎么启动
Thread thread = new Thread(继承了Thread的对象/Runnable对象)
Thread.start()
启动线程使用start方法,而启动了以后执行的是run方法。
怎么区分,一个线程中有很多线程,怎么区分
Thread.setName(设置一个线程名称);这是一种规范,在创建线程时都需要设置名称
有没有使用过线程并发库
简单了解过,并发库的引进给Java线程管理和使用提供了强大的便利性。
Java通过Excutors提供了四个静态方法来创建线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,吐过线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。
简单说一下servlet的生命周期
Servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init、service和destroy方法表达
Servlet启动时,开始加载servlet生命周期开始,Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet、doPost),当服务器决定将实例销毁时(服务器关闭)调用其destroy方法。
什么是设计模式,常用的设计模式有哪些
设计模式是经过千人无数次实践总结出的,设计过程中可以反复使用的、可以解决特定问题的设计方法。
单例模式:1.构造方法私有化,让除了自己类中能创建外其他地方都不能创建
2.在自己的类中创建一个单实例
3.提供一个方法获取该实例对象
工厂模式:Spring IOC就是使用了工厂模式
对象的创建交给一个工厂去创建
代理模式:Spring AOP就是使用了动态代理
Servlet:是用Java编写的服务器端程序,而这些Servlet都要实现Servlet这个接口,其主要功能在于交互式地浏览和修改数据,生成动态web内容,Servlet运行于支持Java的应用服务器中。
Get和Post的区别
GET和POST都是http的请求方式,用户通过不同的http的提交方式完成对资源(url)的操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
1. Get请求提交的数据会在地址栏显示出来,而Post请求不会再地址栏显示出来
Get提交请求的数据会附在URL之后(就是把数据放在HTTP协议中)以?分割URL和传输数据,多个参数用&连接;
Post提交,把提交的数据放置在HTTP包的包体中,因此GET提交的数据会在地址栏中显示出来,而POST提交的地址栏不会显示。
2. 传输数据的大小
Get请求由于浏览器对地址长度的限制而导致传输的数据有限制。而POST请求不会因为地址长度限制而导致传输数据限制
3. 安全性,POST的安全性要比GET的安全性高。由于数据是会在地址栏中呈现,所以可以用过历史记录找到密码等关键性信息。
Servlet API中forward()与redirect()的区别
前者是容器中控制权的转向,在客户端浏览器地址栏不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求连接。Forward还是原来的请求而redirect是重新发起请求。这样,从浏览器的地址栏中可以看到跳转后的链接地址,所以前者更加高效,在前者可以满足需要时,尽量使用forward方法,并且,这样有足浴隐藏实际的链接。在有些情况下,比如,需要跳转到一个其他服务器上的资源,则必须使用sendRedirect()方法。
1. forward是服务器端的转向而redirect是客户端的跳转
2. 使用forward浏览器的地址不会发生改变,而redirect会发生改变
3. Forward是一次请求中完成,而redirect是重新发起请求
4. Forward是在服务器端完成,而不用客户端重新发起请求,效率高;
JSP和Servlet有哪些相同点和不同点,他们之间有什么联系
相同点:JSP是Servlet技术的扩展,所有jsp文件都会被翻译为一个继承HttpServlet的类,也就是说jsp最终也是一个Servlet,这个Servlet对外提供服务。
不同点:Servlet的应用逻辑实在Java文件中,并且完全从表示层中HTML里分离开来,而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件,Jsp侧重于视图,Servlet主要用于控制逻辑。
Jsp有哪些内置对象?作用分别是什么,分别有什么方法
9个内置对象
Request 用户端请求,此请求会包含来自GET/POST请求的参数
Response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页
四大作用域:pageContext, Request,session, application
Session和cookie的区别,项目中哪些地方使用了
Session和cookie都是会话跟踪技术,Cookie通过在客户端记录信息确定用户身份,Session通过在服务器记录信息确定用户身份。
1. cookie数据存放在客户的浏览器上,session数据放在服务器上
2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行cooki欺骗,考虑到安全应当使用session
3. session会在一定时间内保存在服务器上。当访问增多,会占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
4. 单个session保存的数据不能超过4k,很多浏览器限制一个站点最多保存20个cookie
5. 将登陆信息等重要信息存放为session
其他信息如果需要保留,可以放在cookie中
MVC的各个部分有哪些技术来实现
M(Model) 模型 javabean
V(View) 视图 jsp、html
C(control) 控制器 servlet、Action
最经典的MVC模式:Jsp+servlet+javabean,就是把视图和逻辑隔离开来
使用struts2和spring这样的框架后,就是jsp+核心控制器+action+javabean
数据库的分类
关系型数据库和非关系型数据库
关系型数据库:mysql、oracle、sqlserver
非关系型数据库:redis、memcache、mogodb、hadoop
简单介绍一下关系数据库三范式
范式:就是规范,关系型数据库在设计表时要遵循的规范
要想满足第二范式必须先满足第一范式,要满足第三范式必须先满足第二范式。
第一范式:数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
第二范式:要求数据库表中的每一行必须可以被唯一的区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识(主键)
第三范式:要求一个数据库表中不包含已在其他表中已包含的非主关键字信息(外键)
事务四个基本特征ACID特性
事务是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。
四大特征:
原子性:表示事务内操作不可分割,要么都成功、要么都是失败
一致性:要么都成功,要么都失败,后面的失败了要对前面的操作进行回滚
隔离性:一个事务开始后,不能受其他事务的干扰
持久性/持续性:表示事务开始了就不能终止
Mysql数据库的默认的最大连接数
为什么需要最大连接数?特定服务器上的数据库只能支持一定数目同时连接,这时候需要我们设置最大连接数。在数据库安装时都会有一个默认的最大连接数。
100,能在my.ini文件中查看到
数据库的触发器的使用场景
触发器,需要有触发条件,当条件满足以后做什么操作
触发器用处很多,比如校园网、开心网、Facebook,发一个日志,自动通知好友,其实就是在增加日志时做一个后触发,再向通知表中写入条目。因为触发器效率高
说一下mysql的分页和Oracle 的分页?
为什么需要分页?在有很多数据时,不可能完全显示数据,所以要进行分段显示
Mysql是使用关键字limit来进行分页
Oracle的分页,大部分情况下是记不住的。要使用三层嵌套查询。
简单讲一下数据库的存储过程的使用场景
数据库存储过程的优点:
1. 存储过程只在创建时进行编译,以后每次执行存储过程不需要再重新编译,而一般的SQL语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度
2. 通常复杂的业务逻辑需要多条SQL语句。这些语句要分别从客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低负载
3. 存储过程创建一次便重复使用,从而可以减少数据库开发人员的工作量
4. 安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用EXECUTE权限调用存储过程,无需拥有访问底层数据库对象的显式权限
Jdbc怎么调用存储过程
加载驱动
获取连接
设置参数
执行
释放链接
简单说一下对jdbc 的理解
Java database connection java数据库连接。数据库管理系统(mysql、oracle)是很多的,每个数据库管理系统支持的命令是不一样的
Java只定义接口,让数据库厂商实现接口,对于我们而言,只需要对应厂商开发的实现即可,然后以接口的方式进行调用。
写一个简单的jdbc程序
加载驱动(com.mysql.jdbc.Driver,oracle.jdbc.driver.OracleDriver)
获取连接(DriverManager.getConnection(url,username,password))
设置参数
执行executeQuery,executeUpdate
释放链接(释放链接要从小到大,必须放到finnaly里)
JDBC中PreparedStatement相比Statement的好处
大多数我们都使用PreparedStatement代替Statement,因为
1. PreparedStatement是预编译的,比Statement速度快
2. 代码的可读性和可维护性高
虽然用Preparedment来代替Statement会使代码多出几行,但是这样的代码无论从可读性还是可维护性上来说,都比直接用Statement的代码高很多档次
3.PreparedStatement可以防止SQL注入攻击,而Statement却不能
数据库连接池作用
1. 限定数据库的个数,不会导致由于数据库连接过多导致系统运行缓慢或崩溃
2. 数据库连接不需要每次多去创建或销毁,节约了资源
3. 数据库连接不需要每次都去创建,响应速度快
Js和jQuery的关系
jQuery是一个js框架,封装了js的属性和方法,并且增强了js的功能,让用户使用起来更加便利
1.原来使用js要处理很多兼容性问题(注册事件等),而使用jQuery,它封装了底层,就不用处理兼容性问题
2.js的dom和事件绑定和Ajax等操作非常麻烦,jQuery封装以后操作非常方便
简单说一下html,css,javascript在网页开发中的定位
HTML(超文本标记语言)定义网页的结构
CSS(层叠样式表)用来美化页面
Javascript主要用来验证表单,做动态交互(Ajax)
jQuery的常用选择器
ID选择器 通过ID获取元素
Class选择器 通过类(css)获取元素
标签选择器 通过标签获取元素
通用选择器 获取所有元素
层次选择器
属性选择器
什么时候用上hashmap
用来存储具有键值对特征的数据。比如需要按照员工号来存储大量的员工信息,就用hashmap,员工号作为key,员工对象最为value
常见的线程安全集合类
Vector、HashTable
Mysql有哪些存储引擎、索引
用于存储和组织信息的数据结构
MyISAM:独立于操作系统,无法处理事务,适用于选择密集型和插入密集型的表
InnoDB:是一个健壮的事务型存储引擎,适用于更新密集型的表、事务、自动灾难恢复、外键约束、自动增加列AUTO_INCREMENT属性
MEMORY:响应速度快,采用的逻辑存储介质是系统内存,适用于目标数据较小而且被频繁访问、数据时临时的而且要求必须立即可用。
两种持久化方式
高并发
Thread与Runnable的关系
继承Thread是每个线程处理自己的资源,而实现Runnable是多个相同程序代码的线程去处理同一个资源
Runnable 的优势:可以避免java中的单继承的限制,增强程序的健壮性,代码可以被多个线程共享,代码和数据独立。
Wait和sleep的区别
Sleep来自Thread类,wait来自Object类
Sleep不会释放对象锁,wait释放对象锁
Sleep是暂时休眠一定时间,时间到了之后,自动恢复运行;wait需要调用notify进行唤醒
Sleep()和yield()的区别
1. sleep()方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级;但yield()方法只会给优先级相同或优先级更高的线程执行机会
2. sleep()方法会将线程转入阻塞状态,知道经过阻塞时间才会转入就绪状态;而yield()不会讲线程转入阻塞状态,他只是强制当前线程进入就绪状态。因此完全有可能某个线程调用yield()暂停之后,立即再次获得处理器资源执行机会
3. sleep()方法声明抛出InterruptedException异常,所以调用sleep()方法要么捕捉该异常,要么显式声明抛出该异常;而yield()方法则没有声明抛出任何异常
Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收内存中对象所占用的内存,所以对数据库连接、网络连接和磁盘文件等必须显式回收。
数据库函数的分类
单行函数:对每行输入值单独计算,每行得到一个计算结果返回给用户
多行函数:对多行输入值整体计算,最后只会得到一个结果,主要用于完成一些统计功能
DML:数据库操作语言,insert、update、delete
DDL:数据库定义语言,create、alter、drop、truncate
DCL:数据库控制语言,grant、revoke
什么是框架
特指为解决一个开放性问题而设计的具有一定约束性的支撑结构。在此结构上可以根据具体问题扩展、安插更多的组成部分,从而更迅捷和方便的构建完整的解决方案。
MVC模式
最经典的就是Jsp(View)+Servlet(controller)+JavaBean(model)
1. 控制器收到来自用户的请求
2. 控制器调用JavaBean完成业务
3. 完成业务后通过控制器跳转Jsp页面的方式给用户反馈信息
4. Jsp给用户作出响应
传统MVC模式问题
1. 所有的Servlet和Servlet映射都要配置在web.xml中,如果项目太大,web.xml就太庞大,并且不能实现模块化管理
2. 接收参数比较麻烦,不能通过model接受,只能单个接受,接受完成后封装model
3. 跳转页面方式单一,并且当页面名称发生改变时需要修改Servlet源代码
Struts2的执行流程
1. 客户端浏览器发送请求,经过一系列过滤器后,到达核心过滤器(StrutsPrepareAndExcuteFilter)
2. StrutsPrepareAndExcuteFilter通过ActionMapper判断当前请求是否需要某个Action处理,如果需要,把请求交给ActionProxy
3. ActionProxy通过ConfigurationManager询问框架的配置文件(Struts.xml),找到需要调用额的Action类
4. 创建一个ActionInvocation实例来调用Action的对应方法来获取结果集的name,在调用前后会执行相关拦截器
5. 通过结果集的Name知道对应的结果集来对浏览器进行响应
拦截、判断、寻找、执行、响应
Struts2中拦截器有什么作用
Java里拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供一种可以提取action中可重用部分的方法。
在AOP中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作
使用场景:1.用户登录判断,在执行action前面判断是否已经登录,如果没有登录,则跳转到登录页面
2.用户权限判断,在执行action前面判断是否具有权限,如果没有就给出提示信息
3.操作日志
Sql语句:
修改数据alert
Rename:重命名表名
Modify:修改字段的数据类型 after,first修改字段的位置
Change:修改字段名
Add:添加字段 after:(在指定字段后面添加,放在最后)
Drop:删除字段
Engine=:修改存储引擎
Between…and… 是大于等于且小于等于,包括边界值
Like运算符:
“%”:匹配任何树木的字符,包括零字符
“_”:只能匹配一个字符。
Regexp运算符用来匹配字符串:
目前评论:0