Java面试题

1.什么是线程局部变量?

线程局部变量是局限于线程内部的变量,属于线程的内部变量,不与其他线程互通;

面向对象编程的基本特征 ?

封装,继承,多态

2.用java写一段线程安全的单例模式?
public calss Singleton{
    private static Singleton instance = new Singleton();
    private Singleton(){
    //do something
    }
    public static Singleton getInstance(){
        return Singleton;
    }

}
3.java 中 Sleep 方法 和wait 方法的区别有什么?

Sleep方法 和Wait 方法两者都是暂停线程的方法,但是sleep 方法实际上是短暂停顿,他不会释放锁;而wait 方法意味着条件等待,因为只有这样其他等待线程才能在满足条件时获取到锁;

4.什么是不可变对象?java中如何创建一个不可变对象?

不可变对象指对象一旦被创建,状态就不能再改编。任何修改都会创建一个新的对象;例如 String ,Integer及其他包装类型

5.存在两个类, B继承A ,C继承B,我们能将B转化为C么?如 c = (c)B

可以,向下转型,但是不建议使用,会出现类型转换异常;

6.java 中 ++ 操作是线程安全吗?

不是,其中涉及了读取变量值,增加,存储回内存。其中可能涉及多个线程

7.a = a+ b ,与 a += b 的区别

+=是隐式的将 加操作的结果强制类型转换为只有结果的类型。如果两个整型相加,如byte,short 或者 int,首先会将其提升为 int 类型,然后再进行加法操作。如果加法操作的结果比 a 的最大值要大,则 a + b 会出现编译错误;但是 a += b 不会,因为 a += b 会把 a,b都提升为 int 类型在进行强制类型转换

8.能否在不进行强制转换的情况下将一个 double 值 赋予 long类型的变量?

不可以,因为你不能在没有强制类型转换的前提下就酱一个 double的值 赋值给 long类型的变量,因为 double值的类型范围比 long类型范围更广,所以需要强转

9.int 和 Integer 哪个占用更多内存?

Integer对象占用更多内存;Integer 是一个对象,需要储存对象的元数据,但是 int 是一个原始类型的数据;

10.我们可以在 Switch 中使用 String吗?

可以 ,从java 7 开始 Switch case 就可以使用 字符串

11.在 64 位 JVM中,int的长度是多少?

不管是在 32位,还是64位,int类型的长度都是一个固定值,都是32位

12.怎么通过 Java程序判断 JVM是 32位还是 64位?

可以通过检查系统属性 如 sun.arch.data.model 或者 os.arch

13.JRE ,JDK ,JVM ,JIT有什么不同?

JRE 是表示 java运行时,是运行java 引用所必须的
JDK表示 java开发工具,是 java 程序的开发工具
JVM表示 java虚拟机,它的责任是运行 java应用
JIT代表即时翻译;

14.解释 java堆空间 及 GC

当通过 JAVA 命令启动 Java进程的时候,会为程序分配内存。内存的一部分会用于创建堆空间,当程序中创建对象的时候,就从空间中分配内存;
GC是JVM内部的一个进程,用于回收无效对象的内存用于将来的分配

15.能确保GC的执行吗?

不能

16.Java中 堆和栈有什么区别?

JVM中 堆 和 栈属于不同的内存区域,使用目的也不同;
栈用于保存方法帧 和 局部变量,而对象总是在堆上分配;

17.a == b 和 a.equals(b)的区别

如果a , b 都是对象,那么 a == b 比较的是两个对象的引用,只有当 a和 b都指向堆中的同一个对象时,才返回 true ;
而a.equals(b) 则是进行逻辑比较。

18.final , finalize,finaly 之间的不同之处

final 用于修饰 变量,方法,类;如果final 用于修饰变量,意味着该变量的值在初始化之后不能改变;
finalize 方法 是对象被回收前调用的方法;
finaly 是关键字,用于try catch处理异常,无论怎样,finaly 都会执行;

19.list ,set , map之间的区别

list是一个有序集合,允许元素重复
set是一个无序集合
map 是独立合集,才用键值对应的方法来储存,键不能重复,值可以

20.ArrayList 和 LinkedList 的区别?

ArrayList 底层的数据结构是 数据,支持随机访问;
LinkedList 底层结构是 数据结构书链表,使用下标访问元素

21.java中如何打印数组?

可以使用 Arrays.toString() 和 Arrays.deepToString()的方法来打印数组

22.LinkedList 是单向链表还是 双向链表?

双向链表

23.java 中TreeMap 是采用什么 树进行实现的?

采用 红黑树 实现

24.HashMap 和HashTable 有什么不同

最简单的 HashMap 允许出现一个 null Key;HashTable 则不可以

25.HashSet 内部是如何工作的?

HashSet 内部采用 HashMap进行实现,所以 HashSet 不允许出现重复的Key,只允许有一个 null key;

26.写一段代码,在遍历 ArrayList时候移除一个元素

正确的方法

Iterator itr = list.iterator();
while(itr.hasNext()){
    if(判断条件){
        itr.remove();
    }

}
27.简述一下 servlet执行流程

客户端发出 http 请求,web服务器将请求转发到 servlet 容器,servlet容器解析url并且根据 web.xml找到对应的 servlet,并将 request,response对象传递给找到的 servlet,servlet根据request 就可以知道是谁发出的请求,请求信息及 其他信息,当servlet处理完业务逻辑,将信息放入 response并响应回客户端

28.SpringMVC 的执行过程

1.用户发起请求到前端控制器 (controller)
2.前端控制器找到具体的模型对象处理(Handler),并且在处理器映射器(HandlerMapping)中找到对象 (Model)
3.HandlerMapping返回执行链
4.前端处理器通过处理器适配器包装 Handler对象
5.处理业务逻辑
6.Handler 处理完业务逻辑,返回 ModelAndView 对象给前端控制器
7.视图解析器返回真正的视图对象(View)
8.前端控制器根据模型对象 和视图对象,进行视图渲染
9.渲染后的视图返回给用户,产生响应

29.多线程?

1.一个进程是一个独立的运行环境,可以看做一个程序。线程则是进程的一个任务;比如QQ是一个进程,QQ的聊天窗口是一个线程;
2.在多线程中,多线程并发可以提高程序的效率,cpu不会因为某个线程等待资源而进入空闲状态,会把资源让给其他线程
3.用户线程是我们开发程序时创建的 线程,守护线程相当于 JVM虚拟机中的 GC,用于资源回收,给其他线程分配;

30.Spring 的核心(AOP 和 IOC的概念)

a.IOC 是Spring 的开源框架,而Spring 的核心是 IOC控制反转 和 AOP面向切面编程;

31.hibernate 的核心思想

ROM对象关系映射机制;他是将标语表之间的操作映射成对象和对象之间的操作

32.Tomcat 服务器的优化(内存, 并发连接数, 缓存)

内存:对Tomcat启动参数进行优化。在启动脚本中修改最大内存数;
并发连接数: 在Tomcat配置文件中 的 server.xml 中配置
缓存:打开压缩功能,修改参数

33.HTTP协议

1.常用的请求方法,有 get,post
2.get和 post 的区别,get携带参数 和访问地址传送,用户可见 ,而Psot将字段和对应值封装在实体中传送,用户不可见

34.jvm 的优化

1.设置参数,既设置JVM的最大内存数
2.垃圾回收器的选择

35.高并发处理

乐观锁:在不确定表的情况下,利用业务的控制来解决并发问题

36.运行下面的程序 写出结果

    public class ExamTest {   
        public static void main(String[] args) {          
                            String s1 = "Hello World" ;   
                String s2 = "Hello " + "World" ;   
                String temp1 = "Hello " ;   
                    String temp2 = "World" ;          
                            String s5 = temp1 + temp2 ;           
                            boolean flag1 = s1 ==s2 ;     
                        boolean flag2 = s1==s5 ;          
                            System.out.println("flag1:"+flag1);   
                System.out.println("flag2:"+flag2);   
            }   
    }   
                      打印结果:  true|false  

因为 flag1 中 s1 和 s2采用 的是 字符串比对,即 equals方法比对字符串;所以 结果 为 true
而flag2 中却 是在创建出了temp1 和temp2 这两个对象之后,再进行 和 s2 对象比对,所谓返回 false

你可能感兴趣的:(java,面试,面试)