JAVA知识要点

标签:         


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