基础面试题

1、List,Map,Set 三个接口,存取元素时,各有什么特点?

存放:

  1. List存放元素有序,可重复
  2. Set存放元素序,值不能重复
  3. Map元素以键值对形式存放,键无序且不能重复(set集合),值可重复

取出:

  1. List取出元素for循环,foreach循环,Iterator迭代器迭代
  2. Set取出元素foreach循环,Iterator迭代器迭代
  3. Map取出元素需要将key值转换为Set集合,然后进行Iterator迭代器迭代,或者转换为Entry对象进行Iterator迭代器迭代

2、ArrayList 和 Vector 的区别

ArrayList

Vector

实现原理: 采用动态对象数组实现,默认构造方法创建一个空数组

实现原理: 采用动态数组对象实现,默认构造方法创建了一个大小为10的对象数组

第一次添加元素: 扩展容量为10,之后扩充算法: 原来数组大小+原来数组的一半

扩充的算法: 当增量为0时,扩充为原来的2倍,当增量大于0时,扩充为原来大小+增量

不适合删除或者插入操作

不适合删除或者插入操作

为了防止数组动态扩充次数,建议创建ArrayList时给定初始容量

为防止数组动态扩充次数过多,建议创建vector时给定初始容量

多线程使用不安全,适合在单线程访问时使用,效率较高

线程安全,适合多线程访问使用,效率低

 

3、HashSet 和 TreeSet 有什么区别?

      HashSet: 底层使用了哈希表来支持的,特点: 存取速度快

      实现原理: 往HashSet添加元素时,HashSet会先调用元素的HashCode方法得到元素的哈希值,经过一系列的运算,就可以计算出该元素在哈希表中存储的位置

  1. 如果算出元素的的位置目前没有存储任何元素,那么元素就可以直接存储到该位置
  2. 如果算出该元素存储位置目前有其他元素,那么会调用该元素的equals方法与该元素在比较一次,如果equals返回的是true,那么该元素与这个位置上的元素会被视为重复元素,不允许添加,反之,则可以添加

TreeSet: 底层使用了红黑树(二叉树)数据结构实现,特点: 会对元素进行排序存储

  1. 往TreeSet添加元素时,如果元素本身具备自然顺序的特性,那么就会自动对元素进行排序
  2. 如果元素本身不具备自然排序的特性,那么元素所属的类必须要实现Comparable接口,把元素的比较规则定义在CompareTo方法
  3. 往TreeSet添加元素时,如果元素本身不具备自然顺序特性,而且元素所属的类没有实现Comparable接口,必须要在创建TreeSet对象的时候传入比较器(实现Comparator接口)
  4. 如果比较的方法(CompareTo或Compare)返回值是0,那么该元素被视为重复元素,不允许添加

4、 数组和列表(ArrayList)有什么区别?有什么时候应该使用 Array 而不是 Array List?

区别:

  1. Array可以包含基本类型和对象类型,ArrayList只能包含对象类型
  2. Array大小是固定的,ArrayList的大小是动态变化的
  3. ArrayList提供了更多的方法和特性,比如: addAll(),removeAll(),Iterator()等,对于基本类型的数据,集合使用自动装箱来减少工作量,但是当处理固定大小的基本数据类型的数据的时候,这种放回寺比较慢

当能确定长度并且数据类型一致的时候可以用数组,其他使用ArrayList

5、为什么集合类没有实现 Cloneable 和 Serilalizable 接口?

Cloneable接口的作用: 将一个对象的属性值赋值给另一个对象,而不是一个对象的引用

Serilalizable接口: 序列化的用途

  1. 如果想让一个对象持久的存储下来(存储到磁盘),或者进行远程的对象调用,那么就要使用序列化实现这些作用,我们必须对所有支持持久化存储的类实现Serilizable接口,读取的时候也要进行反序列化
  2. 对于JVM来说,进行持久化的类必须有一个标记,就是实现Serializable接口,关联serialVersionUID,这个变量就是在反序列化中确定用哪个类加载这个对象
  3. 持久化的数据都是在存在于java堆中,static类型的数据存在方法区中,不能被持久化,如果不想让某个成员变量持久化,就要使用transient关键字
  4. 序列化的serialVersionUID可以自定义

Cloneable是复制对象的,序列化也是针对对象的操作,集合类只是管理对象的一个工具,应该由集合类的具体实现类来决定如何被克隆或者序列化

6、Collection 和 Collections 的区别?

   Collection (java.util.Collection)是集合类的上级接口,继承与他有关的接口主要有List和Set,为各种具体集合提供了最大化的统一操作方式

      Collections(java.util.Collections)是针对集合类的一个工具类,它提供一系列静态方法实现对各种集合的搜索,排序,线程安全等操作

7、HashMap 源码? 

   

8、遍历 HashMap 的三种方式?

a) 先将所有的key值取出,通过key值遍历(hashMap.keySet() – 返回Set )

b) 直接取出所有的value(HashMap.values()  --  返回 对应数据)

c) 一次取出一个键值对(HashMap.entrySet()  -- 返回Entry)

9、HashMap 和 HashTable 的区别?

  1. 线程安全
    1. Hashtable是线程安全的,HashMap不是线程安全的

Hashteble所有元素的操作如put,get等都是synchronized修饰的,HashMap并没有

  1. 性能优劣

Hashtable是线程安全的,每个方法都要阻塞其他线程,所以Hashtable

性能较差,HashMap性能较好,使用更广

  1. null

Hashtable不允许键和值是null的,HashMap的键和值都可以是null,因为Hashtable key值为null时会直接抛出空指针异常,value为null手动抛出空指针异,HashMap的逻辑对null做了特殊处理

  1. 实现方式
    1. Hashtable继承了Dictionary类
    2. HashMap继承的是AbstractMap类
  2. 容量扩容
    1. Hashtable初始容量是11,负载因子为0.75,扩容规则: 当前容量翻倍+1
    2. HashMap初始容量16,负载因子0.75,扩容规则: 当前容量翻倍
  3. 迭代器
    1. Hashtable的Enumerator不是fail-fast的
    2. HashMap的Iterator迭代器是fail-fast的

10、ConcurrentHashMap 的原理?

ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每一个段其实就是一个小的HashMap,他们都有自己的锁.只要修改操作发生在不同的段上,他们就可以并发进行.把一个整体分成了16个段(Segment,也就最多支持16个线程的并发修改操作),这也是在重线程场景时减小锁的粒度从而降低锁竞争的一种方案,并且在代码中大多共享变量使用volatile关键字声明,目的是第一时间获取修改的内容,,性能较好

11、Java 有哪些容器?

Collection: List(Vector, ArrayList, LinkedList) , Set(HashSet, TreeSet) , Queue(LinkedList, PriorityQueue)

Map: HashMap , Hashtable

12、String s=new String(“abc”)分别在堆栈上新建了哪些对象?

首先使用了new调用String类中的构造方法创建一个对象,并且将它的引用赋值给s变量,所以共创建2个对象,一个在栈中创建s指向堆内存,一个是在堆中常量池创建的 “abc”

13、String 和 StringBuffer 的区别。  

String:

a ) 是对象不是原始类型

b) 是不可变对象,一旦被创建,就不能修改他的值

c) 对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去

d) String是Final类,不能被继承

StringBuffer

  1. 是一个可变对象,当对它进行修改时不会像String那样重新建立对象,
  2. 他只能通过构造函数来建立, StringBuffer sb=new StringBuffer();
  3. 对象被建立后,在内存中就会分配内存空间,并初始保存一个null,通过他的append方法向其赋值; sb,append(“hello”);

14、什么是多线程并发安全问题?这种问题的原因是什么?如何去解决?

定义: 当多个线程同时执行时,多个线程之间互相抢占资源执行,并且抢占是发生在线程执行的每一步过程中,导致出现非法数据,

原因: 多个线程互相抢占资源执行

解决:

利用线程同步方式(三种)

  1. 同步方法
  2. 同步代码块
  3. Lock锁(JDK1.5新出的锁)

15、Synchronized 用过吗?其原理是什么?

Synchronized关键字解决的是多个线程之间访问资源的同步性,Synchronized关键字可以保证被他修饰的方法或者代码块在任意时刻只能有一个线程在执行.

Synchronized原理:

每一个对象有一个监视器(monitor),当monitor被占用时会处于锁定状态

monitorenter:

线程执行monitorenter指令时尝试获取mintor的所有权,如果monitor的进入数为0,则该线程进入monitor,将其设置为1,该线程即为monitor的所有者,如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数+1; 如果其他线程占有了monitor,则该线程处于阻塞状态,直到monitor的进入数为0,,在次尝试获取monitor的所有权

monitorexit:

执行monitorexit的线程必须是Objectref所对应的monitor的所有者,执行指令时,monitor的进入数会-1,如果-1后进入数为0,则线程退出monitor,不再是这个monitor的所有者,其他阻塞线程会获取这个monitor的所有权

16、Synchronized 加在方法上是用的什么锁?

Synchorized在静态方法上,锁住的是对象,一个对象的静态方法在jvm中只有一个,都在jvm的栈区

Synchronized在非静态方法,锁住的是对象的实例,实例可以有很多,在jvm的堆区

17、volatile 的用途?

volatile是一个特殊的修饰符,只有成员变量能使用.在java并发程序缺少同步类的情况下,多线程对成员变量的操作是透明的,volatile变量可以保证下一个读取操作会再前一个写操作之后发生

18、ThreadLocal 的使用场景?

ThreadLocal提供可本地的实例,它与普通变量的区别在于每个使用该变量的线程都会初始化为一个完全独立的实例副本,ThreadLocal变量通常被private static修饰,当一个线程结束时,他使用的所有ThreadLocal相对应的实例副本都可被回收,所以ThreadLocal适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,即变量在线程间隔离而在方法或者类间共享的场景

19、说一下你常用的设计模式?

 

20、Java 内存模型? 

java内存模型(JMM)决定了一个线程对共享变量的写入时,能对另一个线程可见,从抽象角度来看,JMM定义了线程和主内存的抽象关系: 线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程读/写的共享变量的副本.

JMM定义了一个线程对另一个线程可见,共享变量存储在主内存中,每个线程都有自己的本地内存,当多个线程同时访问一个数据时,可能本地内存没有及时刷新到主内存,所以发生线程安全问题

21、垃圾回收机制和不可达算法?

 

22、了解哪些排序算法?二分查找算法是什么?

二分查找是一种高效的查找方法,但是他的条件是数组是有序的,在查找时,先将被查找的数和数组的中间键比较,因为数组是有序的,所以若干被查找的数小于数组的中间键,这个数只能是在数组的左部分,然后将中间键的左边数组作为一个数组来进行二分查找,永阳也将右侧数组作为一个数组来二分查找,若相等,则命中

23、Java 的反射是如何实现的?

1.通过Class.forName()方法加载字符串,得到该字符串所代表的类的Class对象.

2.通过 .class也可以得到该类的Class对象

3.调用实例的getClass()方法(Object类的getClass()方法)

4.如果是基本类型的包装类,通过调用包装类的Type属性获取包装类的Class对象

24、谈谈 final, finally, finalize 的区别?

final:

修饰在变量上,一旦被赋值就不可修改

修饰在类上,这个类不能被继承

修饰在方法上,方法不能被重写

finally:

主要用于处理异常过程中的资源释放,无论是否发生异常都会执行

finalize:

是Object类的方法,Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前作必要的清理工作.这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象进行调用.finalize()方法是在垃圾收集器删除对象之前对这个对象调用的子类覆盖finalize()方法以整理系统资源或者执行其他清理操作

25、用 JAVA SOCKET 编程,读服务器几个字符,再写入本地显示?

  

26、请从 100 万个数字中找到最大的 10 个数字?

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值