java面试
java跨平台原理
java通过不同系统,位数的jvm来屏蔽不同系统的指令集差异而对外提供统一的接口(java api),按照接口即可,系统需要部署到不同环境,在系统上装对应的jvm即可
搭建java开发环境:
安装jdk,配置环境变量,安个elipse,装tomcat,装个git啊
java中8中基本数据类型,int占4个字节,boolean占一个字节 ,
boolean 这个试编译环境而定
byte 1个字节
short 2个字节
char 2个字节
int 4个字节
long 8个字节
float 4个字节
double 8个字节
面向对象有四大特征: 继承 : 子类继承父类的特征和行为(子类对父类的扩展)
多态 : 多态就是不同类的对象,对同一消息作出不同响应就叫多态。就像你对所有人说你结婚了,每个人的反应都是不一样的。
多态存在的3个条件:
1、继承关系
2、重写父类的方法(子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 ,重写就i是一种多态::::::
重载:构造函数就是重载,参数个数不同)
3、父类引用指向子类对象
以下三种方法不能实现多态:(方法不能被重写)
1、static方法,被static修饰的方法是属于类的,而不是实例的。
2、final,被final修饰的方法不能被重写
3、private和protected方法。private修饰的方法对子类不可见。而protected修饰的方法可以被子类见到,也可以重写,但是不能被外部引用。
抽象:把现实对象(共同的属性,特征)抽象为类。
封装:对象的属性有自己的方法来读取和改变
装箱:就是把基本类型转换为包装类型Inter i=Interger.valueof(1) 自动装箱
拆箱:包装类型转为基本类型:int j=i.intValue(Interger i)
包装类型具有面向对象的特征,基本类型基于数值,对象类型基于引用,,,变量只能存储数值,而不具备操作数据的方法。对象类型则截然不同,变量实际上是某个类的实例,可以拥有属性方法等信息,不再单一的存储数值,可以提供各种各样对数值的操作方法,但代价就是牺牲一些性能并占用更多的内存空间
==除了比较内容,还比较引用地址。equals就只是比较内容
String是不可变字符,没有提供修改字符的方法(fianl属性),
StringBuilder和buffer:可改变字符串(char的定义,没有fianl属性,可通过append方法追加内容),buffer是线程安全(要加锁,故效率低),builder是线程不安全
集合:
list有序,可重----------------------arraylist底层是数组【查询快】,linkList底层是链表【增删快】
set无序,不重,(equals和hashcode判断完后再添加进来)
存储键值对的是map--------------------hashmap可把null作为键或者值,线程不安全,效率高(hashTable不可以null,线程安全) concurrentHashMap线程安全有高效
图片声音,视频只能用字节流,拷贝文本用字符流
继承Thread类开启线程-new Thread ......thread.start---------或者实现runnable接口
class Runner1 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程 16 public void run() {
通过打印日志可区分线程
线程并发库,简单了解过
什么是线程:线程是操作系统能够进行运算调度的最小单位,一个进程可包含多个线程,避免线程过多,系统崩溃
线程池作用:限定线程并发数,管理线程
Executors提供线程池
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行-------先进先出 First in, First out.
设计模式:可复用的解决问题的方法。
单例:饱汉模式:构造方法是是私有化的,提供方法获取单个的实例对象,一出来就创建实例(饱汉) 需要的时候才创建(饥汉模式)
public calss personFactory{
private personFactory(){}
private static PersonFactory instance=new PersonFactory;
publiic static PersonFactory getInstance(){
return instance}
} ---------------------------反射就是一个单例模式
工厂模式:spring工厂(容器)----------IOC(对象创建让共厂去作)
代理模式:Spring的AOP就使用了动态代理(不改变原有结构的基础上,还能为原有的新增功能,如刘德华的代理人就为刘德华增加了功能,而刘德华也不用去学习这项技能就能使用这项技能)
包装模式
get数据在http协议头中会在地址栏显示,2kb上线 post 2M上线
post放在http尾部
servlet:
java编写的服务端程序,它实现了servelt接口 生命周期:加载(tomcat启动)。。。实例化(由容器tomcat实例化创建)。。。初始化。。。处理请求。。。服务结束(tomcat关闭),
forward原请求的跳转,(不会显示转向后的地址,推荐使用) redirect重新发起请求后的跳转。jsp侧重视图(结合了html),servlet侧重逻辑(并从html中分离)
jsp9大内置对象 requeat。response,application。session 。out
cookie保存在客户端(不安全,最大为4k,购物车),session保存在服务端(安全,用户的登录信息),用于自动登录
mvc v=jsp m=javaBean m=servlet
jdbc java数据库连接
非关系型数据库:redis,mogodb,hadoop
一范式:实体的属性(是原子的)它不能有多个值和重复属性,如一对多就要分开建表
二范式:每行都有唯一标识(主键)
三范式:表中要有外键
原子,一致,持久,隔离型---------------事务四大特性
mysql最大连接数:默认是100
max_connection=100
mysql通过关键子limit offset,size进行分页从多少到多少 select * from user order by id limit "pagesize*(nuymber-1)",pageSize,
收到客户端{pageNo:1,pagesize:10} select * from table limit (pageNo-1)*pageSize, pageSize; 收到客户端{pageNo:5,pageSize:30} select * from table limit (pageNo-1)*pageSize,pageSize;
oracle通过三层嵌套查询完成分页。可以网上拷贝
触发器:条件满足就执行操作:自动通知好友,发帖,(更新发帖时间)增加日志时作后触发:create tigger after。。。。。。。。。
存储过程:创建时编译,执行不再编,常规sql执行一次,编译一次,----------------可降低网络负载,业务发杂,多sql语句,安全性较高---------会用到它
create procedure insert 。。。。。。。call insert。。。。。。。。。。。。
jdbc可通过prepareCall(call insert。。。)调用存储过程 +//registerouutParameter(3,type)
jdbc屏蔽了各个数据库的私有语言,java提供了统一的操纵数据库的api接口(让厂商自己实现接口,然后以接口方式调用)
贾琏欲执事
class。forname(com.mysql.jdbc.driver) DriverManager.getConnect("jdbc:locaalost:33406//lmeeting","username","password") connect.createStatement() statement.executequery() while(result.next){ System.ou,.... } connect.close
//1.加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //2.通过(java.sql下的)驱动管理类获取数据库连接 Connection conn= DriverManager.getConnection(URL, USER, PASSWORD); //3.通过Connection对象创建Statement对象(Statement:用于执行SQL语句的对象,通过COnnection的createStatement()方法来获取) Statement st=conn.createStatement(); //4.通过Statement执行SQL语句: /*实际运行中:应该是 定义sql语句,?表示占位符。 String sql="select * from book where name=?" PreparedStatement preparedStatement=conn.createStatement(sql) preparedStatement.setString(1,"java程序设计") ResultSet rs=preparedStatement.executeQuery*/ ResultSet rs=st.executeQuery("select * from book"); //5.处理(操作)数据库的返回结果(结果集ResultSet) while(rs.next()){ out.write(rs.getString("name")+" " +rs.getString("number")+"<br>"); } //6.释放(关闭)资源 rs.close(); st.close(); conn.close();
prepareStatement预准备:可以防止sql注入,速度快
数据库连接池,限制连接数,不会因为数太多,程序崩溃,一次连接就处于会话中,不用每次创建连接,销毁连接,时间快,节约资源
html网页结构。css美化页面,js表单验证,动态交互
ajax异步js+xml,它是用来和服务器进行数据库交互的,异步向服务器发送请求,完成局部更行。。。。。。。。。登录注册,二级联动。。。
jq封装了js,使用更方便
jq有id。class。标签等选择器,层次选择器div下的第一个p标签。。属性选择器。单选,多选的通过name获取到值
H5:增强了音视频功能,web存储功能
css:增加了盒子边框,曾强了阴影。动画
bootstrap优先用于移动设备端的ui框架,响应式布局。增加媒体查询,即设备的大小,宽度
框架:就是一个架子。项目的一个结构,半成品的程序。可帮助我们快速构建应用,扩展性很强,jar包就是对jdk的扩展,管理与维护程序
mvc框架-------解决 传统的mvc(jsp+servlet+javaBean) ,单个接收参数,不能哦通过model接收,跳转方式单一,不能实现模块化管理(所有的ervlet都陪在web.xml)
struts2和springmvc是mvc框架
struts执行流程:
客户发请求:
请求经过过滤链FilterDispatcher调用(过滤分发者)然后询问actionMapper-----调用那个action
找到了就交给actionProxy,--------------》通过configuration Manager去询问配置文件,找到对应action
action处理请求,返回结构果
浏览器放松一些请求,经过一系列过滤器来到了核心过滤器(strutsPrepareandExecuteFilter),通过actionMapper判断请求是否需要action处理,需要
actionProxy就会通过Configuration manager从struts.xml查找调用响应的action
创建ActionInvocation实例去调用action对应方法获取结果集
返回结果集给浏览器
拦截器:是动态拦截action调用的对象,定义action执行前后的断码------------------------AOP动态配置方式,可以在action执行前后,加入相关的逻辑业务,
如登录注册。。。。权限判断。。操作日志【操作日志,文件上传,编码。。。都是拦截器做的】
拦截 判断 寻找 执行 响应
springmvc:核心控制器controller捕获请求,查找handler,执行handler。选择viewResolver,通过viewResolver渲染视图并返回
DispatcherServlet捕获请求。。(解析url ) 选择合适的handleAdapter(提取requeat数据封装进modelandview) 更具modelandview查找viewResolver,他在结合modelandview渲染视图,将结果给客户端
springmvc是线程安全的,基于方法,核心控制器是servlet,,它只有这样一个实例,提供全注解,通过方法参数进行接收,intercepter拦截机制action是自己的,springmvc用的是独立的AOP方式进行拦截@ResponseBody注解可自动将对象转为json格式
struts是基于对象,每个请求都实例化action,并注入属性,通过xml配置(虽提供全注解,但不好维护,接收多种参数通过ValueStack进行传值赋值)
spring 容器(map)+反射+配置文件 通过配置文件提取键名,,并存到map,需要的时候通过map的建去找值,再反射调用
AOP: 使用动态代理的方式在执行前后或出现异常后作相应的逻辑处理,事务处理,权限判断。日志。。
事务创播特型:就是多个事务存在是整么处理的策略,存在,则执行,没有,则再找一个
通过描述对象,关系映射将对象持久化到数据库,解决对象与关系不匹配的现象------------------------jdbc可实现(但是,维护比较难)
ibatis(mybatis)与hibernate区别:
都是orm框架,屏蔽了jdbc底层的细节(创建连接,贾琏与执事)--------------sql与java代码分离,将结果集自动封装成java对象
hibernate:自动生成sql,特别复杂的,高效率的sql,hibernate很难适应
mybatis面向sql(),hibernate面向对象-------------都是orm框架,都是对jdbc的封装
不处于session的对象叫临时状态
持久化且在session中叫持久化对象------------session.save()
持久化,但不在session---游离对象 ---------------session.clear---------------
被计划删除的叫删除对象-----------------session.delete(临时状态)
缓存;为了提高访问速度。把磁盘访问或数据库访问变为内存访问【更新数据库,还要更新缓存--------------常用的数据才放在缓存中】
一级缓存:session缓存,一次事务,执行了就在session里缓存一下,不能被卸载------------------ 一级缓存是内置的,不能被卸载(即不能关闭一级缓存)
二级缓存:sessionFactory的缓存:他与应用的周期一样,集群范围的缓存---------tomcat关闭了【应用启动到应用及结束】,缓存才被清除(默认关闭)【常量数据,很少被修改的,不是很重要的数据】
它没有解决分布式缓存问题【因为session的作用在一台机子上的】-----------可使用redis的中央缓存来代替二级缓存。
webservice--------------SOA(面向服务的编程)---------不依赖平台,和语言,实现不同语言间的调用----异构整合,不同客户端整合
webservice是服务层--可调用service---------天气预报。。单点 登录。。。
activiti 业务流程和工作流程---------------类似请假流,报修流。。。
linux是长时间运行,比较稳定的操作系统,常作服务器,,,,(用于编译得到软件包,如redis) su-u切换管理员 cd进入目录 ls列出文件
pwd 获取路径 vi修改文件 mkdir建文件夹 ssh服务的端口是22,用xshell连接远程服务器(等ssh客户端),xftp上传文件
云主机:租的主机
数据库优化:
缓存使用redis,,,读写分离。。。。。。一台不能需求,采用多台服务器
分表 创建索引 查找定位