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方法。