java基础面试题31~40

31.java中如何跳出多重循环

在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,
然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环

public static void method1(){
		ok:
    for(int i=0;i<3;i++){
			for(int j=0;j<3;j++){
				System.out.println("xxx");
				if(j==2){
					break ok;//跳到循环外的ok,终止整个循环
				}
			}
		}
	}

32.java 容器都有哪些?

在这里插入图片描述

33.Collection 和 Collections 有什么区别?

1、java.util.Collection 是一个集合框架的父接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。如:

  • public boolean add(E e):把给定的对象添加到当前集合中 。
  • public void clear():清空集合中所有的元素。
  • public boolean remove(E e):把给定的对象在当前集合中删除。
  • public boolean contains(E e):判断当前集合中是否包含给定的对象。
  • public boolean isEmpty():判断当前集合是否为空。
  • public int size():返回集合中元素的个数。
  • public Object[] toArray():把集合中的元素,存储到数组中。

Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等),大多数方法都是用来处理线性表的。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

34.List、Set、Map 之间的区别是什么?

List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合

List中存储的数据是有顺序的,并且值允许重复;

Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;

Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。

35.HashMap 和 Hashtable 有什么区别?

HashMap和Hashtable都实现了Map接口,主要的区别有:线程安全性,同步(synchronization),以及速度。

  • HashMap是非synchronized的,可以接受为null的键值和值,而Hashtable不行
  • 因为HashMap是非synchronized的,而Hashtable是synchronized,这说明Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。
  • HashMap的迭代器是fail-fast迭代器,Hashtable不是,所以当其他线程改变了HashMap的结构,将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。
  • 因为Hashtable是线程安全也是synchronized,单线程环境下Hashtable比HashMap慢。如果不需要同步,只需要单一线程,HashMap性能比Hashtable好。

36.如何决定使用 HashMap 还是 TreeMap?

HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。

37.说一下 HashMap 的实现原理?

HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

如果两个不同的元素,通过哈希函数得出的实际存储地址相同怎么办?也就是说,当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞

哈希冲突的解决方案有多种:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法,而HashMap即是采用了链地址法,也就是数组+链表的方式。

38.说一下 HashSet 的实现原理?

HashSet基于哈希表实现,无序,不允许重复,允许值为null,但是只能有一个,没有索引所以不包含索引操作的方法。

  • HashSet的值存放于HashMap的key上
  • HashMap的value统一为PRESENT

39.ArrayList 和 LinkedList 的区别是什么?

ArrayList是基于数组实现的,查询快,增删慢。

查询快是因为数组的空间是连续的,只需要通过首地址和下标就可以很快找到元素。

增删慢是因为数组不能扩容,增加或删除元素,就是新开辟一个数组把元素copy到新的数组,旧数组等待被回收。

LinkedList底层采用双向链表实现,相比于ArrayList其特点是查询慢,增删快。

查询慢是因为链表开辟的空间基本上不是连续的,链表的实现方式是每个元素节点存放自己的地址、数据和下一个节点的地址,所以要查询是只能一个一个往下找,相比数组找首地址和下标慢上不少。

40.如何实现数组和 List 之间的转换?

  • List转换成为数组:调用ArrayList的toArray方法。
  • 数组转换成为List:调用Arrays的asList方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值