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