JAVA基础面试题

mac2024-05-08  40

&和&& 的区别

&是按位与,而&&是逻辑与。

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语句拼接,

${}是以字符串拼接的方法完成,所以存在不安全隐患,容易被恶意注入。

最新回复(0)