Java基础周测-05


一、单选题    1. 下列关于栈的叙述正确的是 栈是非线性结构 栈是一种树状结构 栈具有先进先出的特征 栈有后进先出的特征 参考答案:D
知识点:栈是一种只能从表的一端存取数据且遵循“先进后出”原则的线性存储结构。
  2. 链表不具有的特点是 不必事先估计存储空间 可随机访问任一元素 插入删除不需要移动元素 所需空间与线性表长度成正比 参考答案:B
解析:链表采用的是链式存储结构(数据元素随机存储,并通过指针表示数据之间逻辑关系的存储结构)。 它的结点空间可以动态申请和释放; 它的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。   链式存储结构的不足之处: ①每个结点中的指针域需额外占用存储空间; ②链式存储结构是一种非随机存储结构。
  3. 线性表若采用链式存储结构时,要求内存中可用存储单元的地址 必须是连续的 部分地址必须是连续的 一定是不连续的 连续不连续都可以 参考答案:D                            4. 下列叙述中,错误的是 数据的存储结构与数据处理的效率密切相关 数据的存储结构与数据处理的效率无关 参考答案:B
题目解析:一般来说,一种数据结构根据需要可以表示成多种存储结构。常用的存储结构有顺序、链接、索引等,而采用不同的存储结构,其数据处理的效率是不同的;一个数据结构中的各数据元素在计算机存储空间中的位置关系与逻辑关系是有可能不同的。 
  5. 下列数据结构中,按先进后出原则组织数据的是 线性链表 循环链表 顺序表 参考答案:B   6. 下列关于栈的叙述中正确的是 在栈中只能插入数据 在栈中只能删除数据 栈是先进先出的线性表 栈是先进后出的线性表 参考答案:D   7. 下列关于队列的叙述中正确的是 在队列中只能插入数据 在队列中只能删除数据 队列先进先出线性表 队列是先进后出的线性表 参考答案:C   8. 下列叙述中,正确的是 线性链表中的各元素在存储空间中的位置必须是连续的 线性链表中的表头元素存储在内存中一定在其他元素的前面 线性链表中的各元素在存储空间中的位置不一定是连续的,但在内存中表头元素一定存储在其他元素的前面 线性链表中的各元素在存储空间中的位置不一定是连续的,且在内存中各元素的存储顺序也是任意的 参考答案:D   9. 单列集合的顶层接口是 java.util.Map? java.util.Collection?? java.util.List???? java.util.Set 参考答案:B   10. ArrayList类的底层数据结构是 数组结构 链表结构 哈希表结构 红黑树结构 参考答案:A   11. LinkedList类的特点是 查询快 增删快 元素不重复 元素自然排序 参考答案:B
知识点:
  1. 有序,可重复,非同步
  2. 底层使用双链表存储,所以查找慢(LinkedList不能随机访问,从开头或结尾遍历列表)
  3. 添加和删除快(找到指定位置或者找到指定元素后,添加和删除操作快
  12. 关于迭代器说法错误的是 迭代器是取出集合元素的方式? 迭代器的hasNext()方法返回值是布尔类型? List集合有特有迭代器? 参考答案:D     13. 对于HashMap集合说法正确的是 底层是数组结构? 底层是链表结构? 可以存储null值和null键? 不可以存储null值和null键 参考答案:C
知识点:
  1. 底层实现1.7之前:数组+链表 ; 1.8以后:数组+链表+红黑树

  2. key不允许重复,如果key的值相同,后添加的数据会覆盖之前的数据

  3. HashMap是非线程安全的,允许存放null键,null值

  14. 在()中,只要指出表中任何一个结点的位置,就可以从它出发依次访问到表中其他所有结点。 线性单链表 双向链表 线性链表 循环链表 参考答案:D   15. 以下数据结构属于非线性数据结构的是 队列 线性表 二叉树 栈 参考答案:C   16. 链表不具有的特点是 可随机访问任一元素 插入删除不需要移动元素 所需空间与线性表长度成正比 参考答案:B   17. 下列叙述中,错误的是 数据的存储结构与数据处理的效率密切相关 数据的存储结构与数据处理的效率无关 数据的存储结构在计算机中所占的空间不一定是连续的 一种数据的逻辑结构可以有多种存储结构 参考答案:B   18. LocalDateTime类型的日期格式化字符串使用哪个类 Calendar SimpleDateFormat DateTimeFormatter 参考答案:D
解析: Date类及时间格式化SimpleDateFormat类线程不安全。 LocalDateTime类及其时间格式化DateTimeFormatter类线程安全
  19. LocalDate表示的是 日期和时间? 时间? 日期 都不是 参考答案:C   20. 两个BigDecimal对象相加使用什么? + add subtract divide 参考答案:B
知识点:BigDecimal:加addsubtractmultiplydivide
  21. Math.ceil(2.365) 2 2.37 2.4 3 参考答案:D 
知识点:向上取整ceil向下取整floor四舍五入roundpow比大max比小min随机值random
  22. 使用File创建文件是使用哪个方法? mkdir() mkdirs() createNewFile()? 以上都不对 参考答案:C   23. 使用File判断是否为目录使用哪个方法 isFile() isDirectory()??? exists() 以上都不对 参考答案:B     二、多选题   1. 重写equals和hashCode后,下面关于这两个方法说法正确的是 两个对象的hashCode值相同,那么他们调用equals()方法返回值一定为true? 两个对象的hashCode值相同,那么他们调用equals()方法返回值可以为false? 两个对象的equals()方法返回值为true,那么hashCode值可以不同 只要重写equals方法,原则上就要重写hashCode方法 参考答案:B,D   2. Java中的集合类包括ArrayList、LinkedList、HashMap等类,下列关于集合类 描述正确的是 ArrayList和LinkedList均实现了List接口? ArrayList的查询速度比LinkedList快??? 添加和删除元素时,ArrayList的表现更佳? HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值 参考答案:A,B,D   3. 下面关于Collection?和?Collections的区别错误的是 Collections是集合顶层接口 Collection是针对Collections集合操作的工具类 List、Set、Map都继承自Collection接口 Collections是针对Collection集合操作的工具类 参考答案:A,B,C
知识点:

1、Collection是集合顶层接口,Collection派生了两个子接口List和Set,分别定义了两种不同的存储方式。

2、Collections是一个包装类,它包含各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等)。

      此类不能实例化,就像一个工具类,服务于Collection框架。

      三、判断题   1. 栈和队列通常采用的存储结构是链式存储和顺序存储(√)   2. 当线性表采用顺序存储结构实现存储时,其主要特点是逻辑结构中相邻的结点在存储结构中仍相邻(√)   3. 两个对象的hashCode值相同,那么他们调用equals()方法返回值必须为true(×)   4. Vector是非线程安全的(×)   5. ArrayList底层是链表结构(×)   6. InputStreamReader是字节流通向字符流的桥梁,它使用指定的charset读取字节并将其解码为字符(√)   7. ? extends Number : 表示泛型必须是Number子类(×)   8. 流按照类型分为字节流和字符流(√)   9. 字节流继承inputStream和OutputStream,字符流继承自Reader和Writer(√)   10. File类型中定义了mkdirs方法来创建多层目录(×)     四、简答题    1. 编写一段程序完成文件的复制功能(使用FileOutputStream和FileInputStream)
import java.io.*;
public class TestFileCopy {
    public static void main(String[] args) {
        //定义FileInputStream类型变量
        FileInputStream fis = null;
        //定义FileOutputStream类型变量
        FileOutputStream fos = null;
        try {
            //实例化FileInputStream文件输入流
            fis = new FileInputStream("data.txt");
            //实例化FileOutputStream文件输出流
            fos = new FileOutputStream("data_copy.txt");
            // 定义byte数组存储读取的数据 
            byte[] bytes = new byte[1024];
            int len = 0;
            //循环读取数据到byte数组中
            while ((len = fis.read(bytes)) != -1) {
                //把byte数组中的数据写入到输出流文件中
                fos.write(bytes, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  2. 将集合变量list中的重复元素去掉,保证如下list集合中添加顺序不变,不能使用循环遍历操作

ArrayList list = new ArrayList<>();

list.add("a"); list.add("b"); list.add("b"); list.add("c"); list.add("b"); list.add("b");

list.add("b"); list.add("c"); list.add("c"); list.add("d"); list.add("c"); list.add("c");

list.add("c"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); list.add("d");

单独定义方法去除重复,方法定义public void getSingle(ArrayList list);不能修改变方法的名称返回值和参数
private static void getSingle(List list) {
    //1,创建一个LinkedHashSet集合
    LinkedHashSet lhs = new LinkedHashSet<>();
    //2,将List集合中所以的元素添加到LinkedHashSet集合中
    lhs.addAll(list);
    //3,将List集合中的元素清除
    list.clear();
    // 4,将LinkedHashSet集合中元素添加到List集合中
    list.addAll(lhs);
}