1、如何理解数组在Java中作为一个类
使用Java数组的步骤:
- 声明数组,使用一个引用来操作数组;
- 使用new关键字为数组创建所需的内存空间,并且返回一个引用的值,还可以使用{}符号为数组赋初始值;
- 使用数组的下标对数组值进行操作。
Java的数组本质上是一个类,该类保存了数据类型的信息。该类通过成员变量的像是来保存数组,通过[]符号使用下标来访问数组。在处理基本数据类型时,数组保存的是变量的值,如果没有定义初始值,数组会把这些变量保存的值初始化为0(int类型数组);处理引用数据类型时(如String),数组保存的是数据的引用,如果为提供初始值数组会把这些变量初始化为null。
2、new Object[5]是否创建了5个对象
不是,new Object[5]只是创建了一个数组实例,长度为5,每个数组元素的值为null,并不是创建了5个对象。
3、如何拷贝数组的数据
使用System.arraycopy()方法,或者创建一个新的数组,把数组的元素遍历拷贝进新的数组,不能用=赋值运算符。
4、什么是集合?
集合,用来存储数据的对象,是数据结构的一种体现,也是对数组在功能上的扩展。java.util包下的集合框架主要由几个接口和实现类组成,如图:
- 列表List(对付顺序的好帮手):有序存放,允许重复,可以存放不同类型的对象;
- 集合Set(注重独一无二的性质):无需存放,不允许重复;
- 队列Queue:FIFO先入先出的数据结构;
- Map(用key来搜索的专家)实现类用于保存具有映射关系的数据。Map保存的每项数据都是key-value对。Map里的key是不可重复的,key用户标识集合里的每项数据。
所有的实现类,都能只能存放对象。
5、迭代器是什么?
可迭代是Java集合框架下的所有集合类的一种共性,也就是把集合中的所有元素遍历一遍。迭代的过程需要依赖一个迭代器对象。
迭代器模式(Itereror),提供一种方法访问一个容器对象中各个元素。从定义上看,迭代器是为容器而生,本质上就是一种遍历的算法。迭代器就是一个接口Iterotor。例子:
public class Test{
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
Iterator<String> iterator = list.Iterator();//得到list的迭代器
//调用迭代器的hasNext方法,判断是否有下一个元素
while(iterator.hasNext()){
//将迭代的下标移动一位
System.out.println(iterator.next());
}
}
6、比较器是什么?方法
Comparable和Comparator接口。
对于Comparable接口来说,仅仅包含一个compareTo()方法,只有一个参数,返回值为int类型,当前对象大于参数对象时,返回值大于0;小于参数对象时,小于0;等于参数对象时,等于0。
对于Comparatot接口来说,实现者称为比较器,包含一个compare()方法,返回值与Comparable的方法compareTo一样。不同的是,Comparator接口一般不会被集合元素类所实现,而是单独使用或者在匿名内部类中使用。比较器的运用不仅限于元素的比较,还会应与集合元素的排序。它可以提供对某个集合或数组进行整体排序的比较函数,将Comparator传递给sort方法。
7、Vector与ArrayList的区别
Vector与ArrayList都是List的实现类,都代表链表形式的数据结构。
Vector是线程安全的,操作元素的方法都是同步方法,ArrayList不是,但是执行效率没有ArrayList高。
8、HashMap和HashTable的区别
两者都是Map接口的实现类,保存元素的方式都是无序的。区别:
- HashTable的方法是同步的,HashMap不能同步;
- HashTable不允许null值,HashMap允许;
- HashTable有一个Enumeration遍历,HashMap是Iterator遍历;
- HashTable有一个contains()方法,功能和containsValue()功能一样;
- HashTable中hash数组的默认大小是11,增长方式是old*2+1;HashMap中hash数组的默认大小是16,一定是2的指数;
- 哈希值的使用不同,HashTable直接使用对象的hashCode,而HashMap会重新计算hash值。
9、集合使用泛型有什么好处?
对于集合类来说,它们可以存放各种类型的元素。如果存放之前知道元素的类型,可以让代码更加直观、简洁。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TestFanXing {
public static void main(String[] args) {
List l1 = new ArrayList();//无泛型创建链表对象
l1.add("a");
l1.add("b");
Iterator it = l1.iterator();
while(it.hasNext()) {
Object obj = it.next();//获取元素,类型为object
String val = (String) obj;
System.out.println(val);
}
List<String> l2 = new ArrayList<>();
l2.add("a");
l2.add("b");
//foreach遍历,类型直接转换为String
for(String str : l2) {
System.out.println(str);
}
}
}
以上代码中l1没有使用泛型,存放的所有类型都为Object类型,使用的时候还需要进行类型的强制转换。而泛型列表l2,它在创建的时候就用<>声明了保存的数据类型,因此获取元素的时候,类型也会自动转换。
10、如何把集合对象中的元素进行排序?
TreeSet这类集合是可以自动排序的。
对于没有排序功能的集合来说,都可以使用Java.util.Collection.sort()方法进行排序,它除了排序集合对象以外,还需要提供一个比较器。如果列表中的元素全都是相同类型的,并且这个类实现了Comparable接口,可以直接调用Collection.sort()方法。如果没有实现Comparator,就可以传递一个comparator实例作为sort()的第二个参数进行排序。如果不想使用默认的分类顺序进行排序,同样可以传递一个Comparator实例作为参数来进行排序。
11、符合什么条件的数据集合可以进行foreach循环
foreach循环就是循环遍历一个集合中的元素,起到迭代器的作用。数组或者实现了Iterable接口的类实例,都可以使用foreach循环。
数组是Java规定的内容,只能遵照语法来使用。对于“实现类Iterable接口的类实例”,可以自定义一个集合类:
- 定义一个类,包含一个整型下标成员变量和一个集合对象;
- 将该类实现Iterable接口;
- 提供一个Iterator接口的实现;
- 使用下标成员变量和集合对象来完成Iterator接口所需要的方法。
12、如何选用集合?
主要根据集合的特点来选用,比如我们需要根据键值获取到元素值时就选用Map接口下的集合,需要排序时就选择TreeMap,不需要排序时就选择HashMap,需要保证线程安全就选择ConcurrentHashMap。
当只需要存放元素值得实惠,就选择实现Collection接口,需要保证元素唯一选择实现Set接口的集合,比如TreeSet和HashSet,不需要就选择实现List接口的集合,比如ArrayList、LinkedList。