&和&& 的区别
&是按位与,而&&是逻辑与。
if(a==b & a==c)和if(a==b && a==c)的判断。
前者是当第一个条件(a==b)不满足时还会对第二个条件(a==c)进行判断
后者是当第一个条件不满足则不会再进行第二个条件的判断。
int和integer的区别
int是八大基本数据类型之一,而Integer是int的引用类型;
int可以直接使用,而Integer是需要new才能使用的;
Integer a=new Integer(1)和Integer b=new Integer(1)是不相等的,他们的值相等,但是是不同的对象,在内存中的地址不同。
String、StringBuffer、StringBuilder的区别
String一旦创建其内容不可以改变,String a="aaa"; a="bbb";这表示在内存中创建了一个String对象值为(aaa)然后将对象的引用赋值给变量a,而a="bbb"表示又创建了一个String类型的对象,值为(bbb),然后将这个对象的引用赋值给变量a,并不是将(aaa)变成了(bbb),所以用String会造成对内存空间的浪费;
StringBuffer必须通过构造方法完成对象的实例化。StringBuffer在进行字符串的处理时,不生成新的对象,如果经常对一个字符串进行修改,则用StringBuffer比较合适。
StringBuilder线程不安全,但是执行速度比较快。
Post请求和Get请求
Get适用于请求数据量比较小的情况,并且Get请求的参数会拼接在请求地址后面;
而Post适用于数据量比较大的情况下,将请求参数封在了form里面。
在安全性上post 的安全度要高于Get,因为get请求的参数都拼在了URL后面,浏览器的缓存原因等可能会被别人获取。
list和set的区别
list允许多个空元素、list集合是有序的、list集合允许有重复元素
set最多有一个空值、set集合是无序的、set集合不允许有重复元素
原因:list的底层实现是数组,而且是一个长度可变的数组,所以如果仅仅是用于查找,那么用list集合就非常合适,因为直接是按照索引查找;
set集合的底层是链表,没有索引,所以是用哈希值和equals()方法来进行查找,所以比较慢,但是进行删除和插入操作就比较快了。
集合的遍历方式:
1,迭代器:Iterator
Iterator it=list.iterator(); while(it.hasNext()){ System.out.println(it.next()); }
2,普通for循环
for(int i=0;i<list.size();i++){ System.out.print(list.get(i)+","); }面向对象编程的基本特征
多态、继承、抽象、封装
基本数据类型
有8种:分别是byte、int、short、long、float、double、char、boolean
byte:8位,表示的范围为2的(8-1)次幂-1,即-128~127;
int:32位,表示范围为2的(32-1)次幂-1,即-2147483648~2147483647;
int c=2147483648; //报错,超出范围 int b=2147483647; //正常short:16位,表示的范围为2的(16-1)次幂-1,即-32768~32767
short d=32768; //超出范围 short e=32767; //正常long:64位,表示的范围为2的(64-1)次幂-1,即9223372036854775808~9223372036854775807
float:32位
double:64位
char:16位 -128~127
Boolean:8位,取值只有true和false。
单例设计模式
优点:在整个应用程序中一个类只有一个实例(对象),
懒汉模式和饿汉模式:
懒汉模式的实现方式:构造方法私有化,提供私有的静态成员变量,最后提供一个对外访问的接口。
public class People { private People(){} private static People people; public static People init(){ if(people==null){ synchronized (People.class){ if(people==null){ people=new People(); } } } return people; } }为了保证线程安全,加一个锁进行二次判断。最佳实现方法。
恶汉模式实现方式:当类被加载的时候,会创建对象实例化参数,无论有没有用到,所以一定程度上造成了资源的一种浪费。
public class Student { private static final Student instance = new Student(); private Student(){} public static Student init(){ return instance; }
}
HashMap和HashTable
两者都实现了Map接口,区别也比较明显
线程安全,但是执行效率低,key和value都不能为空
HashMap线程不安全,但是执行的效率高。
equals和==
“==”判断的是对象在内存中的地址,即是不是同一个对象
equals判断的是内容。
如下代码示例:
package com.dxq.test;
public class Main {
/**
* @param args
*/ public static void main(String[] args) { String a ="333"; String b="333"; System.out.println("a==b="+(a==b)); //true System.out.println("a.equals(b)="+a.equals(b)); //true String c=new String("333"); System.out.println("a==c="+(a==c)); //false System.out.println("a.equals(c)="+a.equals(c)); //true
}
}
转发和重定向,request.setAttribute()和session.setAttribute()
重定向:当服务端收到客户端的请求后通知客户端去访问另一个资源,需要访问两次服务器
response.sendRedirect("index.jsp");
转发:服务端收到请求后通知服务端调用另一个资源,只访问一次服务器
request.getRequestDispatcher("index.jsp").forward(request, response);
request的生命周期是在一次请求中,而session的生命周期是一个会话内,即浏览器打开到浏览器的关闭。
实例讲解:
当时用重定向时,如果用session.setAttribute()则可以获取到值,而request.setAttribute()则获取不到值,
如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("te", "HELLO EVERY"); request.getSession().setAttribute("wq", "assaasassaas");
response.sendRedirect("index.jsp");
<%=request.getAttribute("te") %> <%=request.getSession().getAttribute("wq") %>
结果如下:
当时用请求转发时:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("te", "HELLO EVERY"); request.getSession().setAttribute("wq", "assaasassaas"); request.getRequestDispatcher("index.jsp").forward(request, response); }<%=request.getAttribute("te") %> <%=request.getSession().getAttribute("wq") %>
结果如下:
instanceof用法
instanceof用于判断某个引用(变量)是否是某个类的,主要作用可以通过判断来决定是否可以进行强制类型转换,如果可以,进行转换,否则执行其他操作,以此来保证程序不报错。
java异常
异常不是错误。但是如果发生异常不进行处理,则会导致程序终止执行。所以需要对异常进行处理。
这时候就需要捕获异常,通过try,catch和finally语句,finally语句是一定会执行的,try里面包裹的是可能会发生异常的地方。
public static void main(String[] args) { int a=10,b=0; int c=0; try{ System.out.println("START"); c=a/b; System.out.println("c="+c); }catch(Exception e){ //e.printStackTrace(); }finally{ System.out.println("OVER"); }
}
}
该段代码执行的结果是:START,OVER
说明System.out.println("c="+c);没有执行。
当然,Java中还可以自定义异常!
sql注入
将sql的语句如“OR 1=1”带入到需要传入参数的地方,使得该条件失效的一种攻击方式。
mybatis中#{}和${}的区别
#{}是经过预编译的,用占位符的方式向sql语句拼接,
${}是以字符串拼接的方法完成,所以存在不安全隐患,容易被恶意注入。