java基础面试题1

1,hashMap与hashTable区别

    使用Entry数组来实现hash表

    hashTable是线程安全的,hashMap不是,但是hashTable已基本废弃,如果要使用同步的话可以使用concurrenthashmap或者使用其他方法,这里可以深入探究;

    hashMap支持null键和null值


2,JVM启动过程

一:JVM装入环境,JVM提供的方式是操作系统的动态连接文件.

二:装载JVM.dll

三:初始化JVM,获得本地调用接口

四:运行Java程序

这方面需要加深理解



3,怎么避免死锁

1,加锁顺序

2,加锁限时

3,死锁检测


4,synchronized同步方法和同步代码块的区别

同步代码块获取一个对象的监视器,更加灵活;

同步方法相当于在获取this这个对象的监视器;

非静态的同步方法是锁定类的实例,静态的同步方法是锁定类的。



5,java new 一个对象的的过程

分配内存空间;

初始化对象置为0;

设置必要的对象信息(对象头中的一些信息);

 Java程序执行init进行初始化赋值。


6,如何判断一个单向链表是不是循环链表(不能更改链表的状态)

用两个指针,一个指针一次跳一步,另一个指针一次跳两步,如果它们能相遇,说明存在环。


如何将一个单向链表反转?



8,排序算法代码实现过程



9,sleep(),wait(),notify(),notifyAll()

sleep()不会释放对象锁,wait()会释放对象锁。

notify()唤醒wait()阻塞住的线程,但并不立即释放对象锁,需要等synchronized代码块执行完或者wait()方法调用来释放对象锁。

notifyAll()唤醒所有等待的线程。


10,StringBuffer和StringBuilder的区别





12,如何书写一个单例模式

public class Singleton4 {//我们通过volatile声明变量来禁止指令重排序

    private Singleton4(){}

    private static volatile Singleton4 single;

    public static Singleton4 getInstance(){

        if(single==null){

        synchronized (Singleton4.class) {

        if(single==null)

        single=new Singleton4();

        }

    }

        return single;

    }

}

13,ArrayList和LinkedList比较以及适用于什么场景

ArrayList查询更快,LinkedList插入删除更快。

原因:ArrayList是基于索引的数据结构,插入删除需要更新索引,更改数组大小等,尽量给定合适的初始大小,



14,equals()和hashcode()的关系。

       equals()方法未重写的话,比较的是两个对象地址是否相等,即是否是同一个对象,和==效果一样。

        一般我们覆盖equals()方法,来比较两个对象的内容是否相等。

        hashCode(),获取对象hash码,确定对象在散列表中的存储位置,散列表包括hashMap,hashTable,hashSet.

        hashCode()只有在对象需要存储在散列表中才起作用。

        如果对象不存储在散列表的数据结构中,equals()和hashcode()没有任何关系,

        如果需要存储在散列表的数据结构中,重写equals方法,一定也要重写hashcode方法。

原因:在散列表中,hashcode相同的两个对象,equals不一定相同

                                equals相同,hashcode一定要相同

hashcode相同是equals相同的必要条件,那么在散列表添加的时候先判断一下hashcode是否相同,如果hashcode不相同,equals即使相同也不起作用,例如hashSet中可能存在重复元素。

        当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。



15,哪些Java集合不允许具有重复元素

Set < E > 是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。



16,字符串常量池,运行时常量池,class文件常量池,intern()方法,它们之间的关系


        直接使用双引号声明出来的String对象会直接存储在字符串常量池中.

API中描述如下:

public String intern()

        返回字符串对象的规范化表示形式。

        一个初始为空的字符串池,它由类 String 私有地维护。

        当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

        它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

        所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义。

返回:

        一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。

注意:jdk7 以后字符常量池不在Perm区域了,这块做了调整。字符串常量池中不需要再存储一份对象了,可以直接存储堆中的引用。


18,java异常分类,RuntimeException和Exception关系


java基础面试题1_第1张图片

runtimeException(运行时异常):是未检查异常,程序员的错,不需要try..catch...或者throws处理。


19,final关键字的作用及用法

        修饰类:该类不能被继承

        修饰方法:明确禁止该方法在子类中被覆盖

        修饰变量:对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

20,静态代码块,构造代码块,构造函数。

静态代码块在类加载时被执行,只执行一次;构造代码块依托构造函数,但先于构造函数执行。


单个类时:静态代码块>构造代码块>构造函数


 父子类使用时:1,new一个父类对象(代码在子类中执行,会加载子类),父类静态代码块,子类静态代码块,父类构造代码块,父类构造函数

                        2,new一个子类对象,父类静态代码块,子类静态代码块,父类构造代码块,父类构造函数,子类构造代码块,子类构造函数。

                    3,new一个父类对象,接着new一个子类对象。父类静态代码块,子类静态代码块,父类构造代码块,父类构造函数,父类构造代码块,父类构造函数,子类构造代码块,子类构造函数

你可能感兴趣的:(java基础面试题1)