Java面试题

谈谈你对spring的理解?

容器,核心组件:IOC AOP

 

你都用哪些集合?

ArrayList HashMap

 

hashtable和hashMAP的区别,那个性能高?

前者安全,效率低,不能存null 后者取反

 

equals和==的区别,new 出来用那个比较?

前者重写比较内容 后者内容家地址 new比较后者

 

MySQL和oracle的区别

最大区别,一个收费,一个不收费,不过升级后也开始收费,一个是基于数据库 一个基于用户角色

 

xml的有几种解析方法 DOM4J   SAX解析

 

MySQL内连接和左外连接有什么区别?

内链接取交集 外连接肯定查出一张完整的表内容,没有的取null

 

为什么mysql经常使用varchar(255),

可扩展,伸缩性

 

mysql中int(8)什么意思?

Int类型 畅读为8

 

redis除了可以做缓存,还可以做什么?

Dubbo的注册中心

 

事务的隔离级别  传播行为

四种,传播应该是其中,mysql默认隔离级别第三级,杜绝不可重复读,幻读,传播用的最多的support和requered

 

solr...redis

mybatis和hibernate的区别

自己着笔记

关于springmvc的东西  如何进行数据封装,传入传出的格式(key-value,json)

自定义json转换工具

项目如何实现底层通信

什么叫底层通信。

如何实现批量添加批量删除

Mybaits自带foreach标签遍历传来的数组,批量底层都是遍历后一个个执行

类如何实现序列化

实现序列化接口

在mybatis中$和# 的区别:

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".

 

2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.

 

3. #方式能够很大程度防止sql注入。

 

4.$方式无法防止Sql注入。

 

5.$方式一般用于传入数据库对象,例如传入表名. 

 

6.一般能用#的就别用$. 

 

使用的spring的版本

4.1.7

提交的方式是表单还是json

表单

项目用了多少个服务器

没上线,开发阶段用的电脑主机做服务器,我负责的模块用了4 、5台

你负责了那些模块

优化数据库的方法

http://zhidao.baidu.com/link?url=XMyi2dxlphbzaRrMjscwPXR3c5gbZ8TwaS8g6bAeSTMHH7c_NnJYMG0JXB6RtSPaWpgmckxWBAwEgQcafU_93a

spring的配置文件中都配置了什么

事务,三层架构的创建,数据源 redis sorl 图片服务器配置

如何解决高并发的问题

集群,负载均衡 缓存 加硬件设备

为什么离职

 

集合相关的东西

其实面试主要就是框架 事务  项目

 

实现图片上传需要指定enctype=multipart/form-data;

 

二、利用Socket建立网络连接的步骤

  建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

  套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。

  为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3、连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。

Mysql设置事物的隔离级别

mysql> set tx_isolation='read-committed'

默认隔离级别:Repeatable Read

 

Session、application、request区别

2.request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象中。在这个过程中可以使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。
3.Session是用户全局变量,在整个会话期间都有效。只要页面不关闭就一直有效(或者直到用户一直未活动导致会话过期,默认session过期时间为30分钟,或调用HttpSession的invalidate()方法)。存放在HttpSession对象中
4.application是程序全局变量,对每个用户每个页面都有效。存放在ServletContext对象中。它的存活时间是最长的,如果不进行手工删除,它们就一直可以使用
总结:当数据只需要在下一个forward有用时,用request就够了;
         若数据不只是在下一个forward有用时,就用session。

 

Jsp和Servlet的区别:

JSP在本质上就是SERVLET,但是两者的创建方式不一样.

Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观.

JSP由HTML代码和JSP标签构成,可以方便地编写动态网页.
因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.

在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.

 

JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。

JSP编译后是“类servlet”。

Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP是Java和HTML组合成一个扩展名为.jsp的文件。

JSP侧重于视图,Servlet主要用于控制逻辑。

Servlet的线程是不安全的:

 

解决springMVC的线程问题:

有几种解决方法:
1、在Controller中使用ThreadLocal变量
2、在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller
所在在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的。

 

mybatis如何实现多表查询:

多表查询和单表没有任何区别,只是你需要一个对象接收返回值时,同时包括多个表的结果字段才行。其他没区别。mybatis本身不会判读是否是多表查询。

mybatis如何实现批量插入:

Xml代码  

<insert id="addTrainRecordBatch" useGeneratedKeys="true" parameterType="java.util.List">  
<selectKey resultType="long" keyProperty="id" order="AFTER">  
SELECT LAST_INSERT_ID()  
</selectKey>  
insert into t_train_record (add_time,emp_id,activity_id,flag)values 
<foreach collection="list" item="item" index="index" separator="," 
(#{item.addTime},#{item.empId},#{item.activityId},#{item.flag})  
</foreach>  
</insert>  
 

对于foreach标签的解释参考了网上的资料,具体如下:

foreach的主要用在构建in条件中,它可以在SQL语句 中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

 

1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map

关于foreach的具体例子在这里就先不举,以后有机会可以把每一种情况都举一个例子列出来。

 

mysql数据库的优化
1、表的设计要符合三范式。

2、添加适当的索引,索引对查询速度影响很大,必须添加索引。主键索引,唯一索引,普通索引,全文索引

3、添加适当存储过程,触发器,事务等。

4、读写分离(主从数据库)

5、对sql语句的一些优化,(查询执行速度比较慢的sql语句)

6、分表分区

分表:把一张大表分成多张表。分区:把一张表里面的分配到不同的区域存储,

7、对mysql服务器硬件的升级操作。

 

List、set、map区别:

Nginx负载均衡:

修改nginx.conf

upstream tomcat1{
 
#weight 权重,默认是1,权重越高,被分配的几率越大
 
server 192.168.242.129:8080 weight=2;
 
server 192.168.242.129:8282;
 
}
#配置一个虚拟主机

server {
 
listen 80;
 
server_name www.tomcat1.com;
 
location / {
 
proxy_pass http://tomcat1;
 
}
 
 
 
}
Maven解决依赖冲突问题:

打开maven的pom.xml,在某个<dependency>中通过右键菜单:maven->show dependency 打开分析的图形化页面,如下所示:

通过菜单的exclude即解决这个间接依赖。

  <!-- 此标签的作用是可以将B的传递依赖关系A不传递给C -->
 
            <!-- <exclusions> <exclusion> <groupId>org.lonecloud.A</groupId> <artifactId>A</artifactId>
                </exclusion> </exclusions> -->
 
redis中的事务和mysql中的事务有什么区别?

1、Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行。Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。

2、mysql的事务特性,要求这组操作,要不全都成功,要不全都失败,这样就避免了某个操作成功某个操作失败。利于数据的安全

 

http请求由三部分组成,分别是:请求行、消息报头、请求正文

 

TCP(Transmission Control Protocol) 传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)

Sequence number(顺序号码) Acknowledge number(确认号码)

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.

socket有几种状态

 
 

CLOSED
没有使用这个套接字
LISTEN
套接字正在监听入境连接
SYN_SENT
套接字正在试图主动建立连接
SYN_RECEIVED
正在处于连接的初始同步状态
ESTABLISHED
连接已建立
CLOSE_WAIT
远程套接字已经关闭:正在等待关闭这个套接字
FIN_WAIT_1
套接字已关闭,正在关闭连接
CLOSING
套接字已关闭,远程套接字正在关闭,暂时挂起关闭确认
LAST_ACK
远程套接字已关闭,正在等待本地套接字的关闭确认
FIN_WAIT_2
套接字已关闭,正在等待远程套接字关闭
TIME_WAIT
这个套接字已经关闭,正在等待远程套接字的关闭传送
 
java交换两个数的位置不用第三个变量

方法2:使用+,-操作来实现

int x = 10;
int y = 15;
System.out.println("x="+x+" y="+y);
x = x+y;
//x= 10+15=25
y = x-y;
//y= 25-15=10
x = x-y;
//x= 25-10=15
System.out.println("x="+x+" y="+y);
结果:
x=10 y=15
x=15 y=10
 

字符串倒叙输出:

 

String str = "abcd";
 
         // 字符串倒序方法一
  char[] ch = str.toCharArray();
  StringBuffer sb = new StringBuffer();
  for (int i = ch.length - 1; i >= 0; i--) {
   sb.append(ch[i]);
  }
  System.out.println(sb.toString());
 
  // 字符串倒序方法二
  StringBuffer sbb = new StringBuffer();
  for (int i = str.length() - 1; i >= 0; i--) {
   sbb.append(str.charAt(i));
  }
  System.out.println(sbb.toString());
 
  // 字符串倒序方法三
  System.out.println(new StringBuffer(str).reverse().toString());
 } 
 

 

Jvm运行原理:

 

去除数组中相同的元素:

public static void main(String[] args){
 
                        //定义一个有重复元素的数组
 
                        int[] arr={0,4,2,4,6,1,2,4,7,8};
 
                        //考虑到要去除重复元素,想到Set集合可以除去重复元素
 
                        TreeSet ts=new TreeSet();
 
                        //所以遍历数组,并添加到Set集合中,这样便去除了当中的重复元素
 
                        for(int x=0;x<arr.length;x++){
 
                                if(arr[x]==0)
 
                                        continue;
 
                                ts.add(arr[x]);
 
                        }
 
                        System.out.println(ts);
 
                }
去除list集合中的重复元素:

1、通过循环进行删除
 

public   static   void  removeDuplicate(List list)   { 
   for  ( int  i  =   0 ; i  <  list.size()  -   1 ; i ++ )   { 
    for  ( int  j  =  list.size()  -   1 ; j  >  i; j -- )   { 
      if  (list.get(j).equals(list.get(i)))   { 
        list.remove(j); 
      } 
    } 
  } 
  System.out.println(list); 
}
 

Java设计模式

普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建

单例模式:单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式

装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例

代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思

桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。

观察者模式::当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。

Maven+tomcat热部署使用方法

使用maven+tomcat对taotao-sso工程进行热部署。

前提:需要启动dubbo的监控中心,来监测服务层服务是否发布成功。

 

第一步:需要在maven工程的pom文件中添加tomcat7插件,然后配置以下属性:

<build>
 
<plugins>
 
<plugin>
 
<groupId>org.apache.tomcat.maven</groupId>
 
<artifactId>tomcat7-maven-plugin</artifactId>
 
 
 
<configuration>
 
<port>8087</port>
 
<path>/</path>
 
<!-- 配置tomcat服务器的配置URL -->
 
<url>http://192.168.242.195:8080/manager/text</url>
 
<username>tomcat</username>
 
<password>tomcat</password>
 
</configuration>
 
</plugin>
 
</plugins>
 
</build>
 

第二步:执行maven命令,进行热部署。

 

第一次部署命令:tomcat7:deploy

第二次部署命令:tomcat7:redeploy。

 

跳过单元测试命令:tomcat7:redeploy -DskipTests

 

第三步:访问dubbo注册中心,查看是否将sso服务发布成功。

 

Ajax的优缺点:

 优点:减轻服务器的负担,按需取数据,最大程度的减少冗余请求
局部刷新页面,减少用户心理和实际的等待时间,带来更好的用户体验
基于xml标准化,并被广泛支持,不需安装插件等
进一步促进页面和数据的分离
缺点:AJAX大量的使用了javascript和ajax引擎,这些取决于浏览器的支持.在编写的时候考虑对浏览器的兼容性.
AJAX只是局部刷新,所以页面的后退按钮是没有用的.
对流媒体还有移动设备的支持不是太好等

 

防止刷新页面表单重复提交:Ways One

一个是设置验证码,另一个方法是在表单某个字段可以设置:不允许重复。即可避免。表单大师以上两点都能做到。

防止用户后退 
这里的方法是千姿百态,有的是更改浏览器的历史纪录的,比如使用window.history.forward()方法;有的是 “用新页面的URL替换当前的历史纪录,这样浏览历史记录中就只有一个页面,后退按钮永远不会变为可用。”比如使用

javascript:location.replace(this.href); event.returnValue=false;
 

Redis重启数据会消失吗?

Redis 默认设置会开启 RDB 持久化。
有另一种持久化 AOF,两种持久化可以同时开启。

 

·   

<!--连接池中保留的最大连接数。默认值: 15 -->   
 
·            <property name="maxPoolSize" value="20"/>  
 
·            <!-- 连接池中保留的最小连接数,默认为:3-->  
 
·            <property name="minPoolSize" value="2"/>  
 
 

Linkedlist怎样才能查询和增删都快?

创建成map集合,key存下标值

 

线程A里面的方法调用线程B,怎样才能执行线程A后先执行线程C,再执行线程B(C和A、B没有关系)?

 

在controller中没有做异常处理,在不改变controller代码的情况下,怎样统一处理异常?

自定义异常处理类。

在controller中调用一个service接口,但是后来发现service接口的方法需要扩展,不改变controller不改变service怎样实现?

1、aop思想

为什么limit 1-100和9900-10000的效率不一样(原理)?

9900-10000需从头开始找第9900条。
--------------------- 
作者:多纤果冻 
来源:CSDN 
原文:https://blog.csdn.net/qq_37939251/article/details/83068606 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值