java编程思想重点章节及问题

文章目录

第十二章:异常处理

12.2、编码测试

1)异常跟错误的区分

异常指的是可以被程序员处理的问题,例如数组下标越界,算数异常等
错误指的是不可以被程序员处理的问题,一般是系统问题,比如内存溢出

2)重新抛出异常、finally的使用,return跟finally关系

1、重新抛出异常指的是在捕获一个异常后又抛出了一个新的异常
2、finally通常与try catch连用 表示无论是否发生、捕获异常都会执行
3、如果rerun位于try和catch中,那在执行return之前,会先执行finally中的操作,不过此时return返回的数据已经被压栈

第十六章:数组

16.1、理论问题

1)数组的优缺点

	可以通过下标快速访问,长度不可变

2)数组与集合的映射关系(结合泛型理解)???

3)数组中存储的是对象吗?

	数组中存储的是引用,该引用执行堆中的一个真是的对象

4)Arrays有哪些功能

Arrays.equals():用于比较两个数组是否相等。

Arrays.deepEquals():用于比较两个多维数组是否相等。

Arrays.fill():用于向数组中填充指定的数值。

Arrays.fill(a, val); ——向a数组中填充val只直到写满为止。
Arrays.fill(a, fromIndex, toIndex, val);——在a数组fromIndex到 toIndex的区间内填充val值。

Arrays.sort():用于对数组的排序。

Arrays.sort(a);——对a数组进行正向排序。
Arrays.sort(a, comparator);——对数组a按照comparator定义的规则进行排序。
Arrays.sort(a, fromIndex, toIndex);——对a数组fromIndex到 toIndex区间内的值进行正向排序。
Arrays.sort(a, fromIndex, toIndex,comparator);——对a数组fromIndex到 toIndex区间内的值按照comparator定义的规则进行排序。

Arrays.binarySearch():使用二分法在已经排序的数组中查找元素,有就返回响应的索引值,没有返回(-插入点-1)

Arrays.binarySearch(a, key);——在数组a中查询是否有key元素
Arrays.binarySearch(a, key,comparator);——在数组a中查询是否有key元素,前提是a数组用comparator进行升序排列。
Arrays.binarySearch(a, fromIndex, toIndex, key);——在a数组fromIndex到 toIndex区间中查询是否有key元素。
Arrays.binarySearch(a, fromIndex, toIndex, key,comparator);——在a数组fromIndex到 toIndex区间中查询是否有key元素,前提是a数组用comparator进行升序排列。

Arrays.toString():产生数组的String表示。

Arrays.hashCode():产生数组的散列码。

Arrays.deepHashCode():用于多维数组产生散列码。

Arrays.asList():将任意的序列或数组转变为list

System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。其函数原型是: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) src:源数组; srcPos:源数组要复制的起始位置; dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。

	char[] c1 = new String("123456").toCharArray();  
        char[] c2 = new String("abcdef").toCharArray();  
        System.arraycopy(c1,2 , c2, 1, 2);  
        for(char c : c1){  
            System.out.print(c);  
        }  
        System.out.println();  
        for(char c : c2){  
            System.out.print(c);  
        }  //结果:123456 a34def

值得注意的一点是系统提供的这种复制方式只是一种浅复制(复制对象数组是只会复制对象的引用),而不是对象本身的拷贝。

arraycopy()需要目标数组,将原数组拷贝到你自己定义的数组里,而且可以选择拷贝的起点和长度以及放入新数组中的位置
copyOf()是系统自动在内部新建一个数组,调用arraycopy()将original内容复制到copy中去,并且长度为newLength。返回copy; 即将原数组拷贝到一个长度为newLength的新数组中,并返回该数组。
Array.copyOf()可以看作是受限的System.arraycopy(),它主要是用来将原数组全部拷贝到一个新长度的数组,适用于数组扩容。
Arrays.toString();
Arrays.sort();
Arrays.asList();
Arrays.deeptoString()
Arrays.binarySeach()
Arrays.copyOf()
Arrays.equals();
Arrays.deepEquals()
Arrays.fill()

5)简述数组的使用场景

 需要快速根据下标进行访问 且长度确定

16.2、编码测试

1)声明不同类型数组并遍历其中一个,尝试对数组扩容的处理方式。


```java
public class Exercise1 {
	public static void main(String[] args) {
		int[] a = {1,2,4,6,5};
		int[] s = new int[5];
		s[0] = 2;
		s[1] = 5;
		s[2] = 7;
		s[3] = 3;
		s[4] = 8;
		for (int i : s) {
			System.out.print(i+" ");
		}
		System.out.println();
		System.out.println("方式一扩容");
		//方式一调用Arrays.copyOf(原数组,新数组长度)方法 返回一个新数组
		//将原数组s复制进来,指定新数组长度为8,会设默认值
		int[] newArr = Arrays.copyOf(s, 8);
		for (int i : newArr) {
			System.out.print(i+" ");
		}
		//方式二:还可以声明一个新数组 将原有数组遍历赋值
		int[] newArr2 = new int[8];
		for (int i = 0; i < newArr2.length; i++) {
			if(i<s.length){
				newArr2[i] = s[i];
			}
			
		}
		System.out.println();
		System.out.println("方式二扩容");
		for (int i : newArr2) {
			System.out.print(i+" ");
		}
	}
}

第十七章:容器深入研究

17.1、理论问题

1)容器与数组对比的优劣。容器对比,重写的hashCode()、equals()、toString()方法

数组:随机访问效率高 长度固定
容器:长度可变 具有多种实现类 可以满足多种需求

2)查看ArrayList源码实现方式

3)LinkedList与ArrayList的区别

ArrayList底层由数组构成,因此随机访问速度快
LinkedList底层由链表构成,增删速度快

4)为什么Iterator可遍历HashMap(查看源码并解释)

			Map map = new HashMap<String, String>();
		map.put("name", "杰克马");
		map.put("age", "52");
		map.put("sex", "男");
		map.put("company", "alibaba");
		Iterator<String> iterator = map.keySet().iterator();
		while (iterator.hasNext()) {
			String key = iterator.next();
			System.out.println("key:"+key+"   value:"+map.get(key));
		}

HashMap中存在一个KeySet()方法,该方法可以返回一个set。可以借助这个set对hashmap进行遍历。

5)HashMap与LinkedHashMap的区别及使用场景

HashMap:访问速度快
LinkedHashMap: 具有HashMap访问速度快的优势,同时可以保证遍历输出时按照插入的顺序进行输出

6)Collections具备哪些功能

 Collections.fill()
 Collections,binarySearch()
 Collections。Copy()
 Collections.reverse()
 Collections.reverseOrder()
 Collections。shullfe()
 Collections。sort()
 Collections.unmodifiableList()
 Collections.synchronizedSet()

7)队列Queue的使用及说明

添加、删除、查询这些个操作都提供了两种形式,其中一种在操作失败时直接抛出异常,而另一种则返回一个特殊的值:
方法
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
  remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  offer 添加一个元素并返回true 如果队列已满,则返回false
  poll 移除并返问队列头部的元素 如果队列为空,则返回null
  peek 返回队列头部的元素 如果队列为空,则返回null
  put 添加一个元素 如果队列满,则阻塞
  take 移除并返回队列头部的元素 如果队列为空,则阻塞

17.2、编码测试

1)分别声明上面提及到的容器并初始化,熟识容器的遍历及方法测试。
 2)HashMap与LinkedHashMap存储方式,分别初始化并输出值,查看排列方式。
 3)Queue相关容器的初始化及测试
 4)说出数组与集合的区别与联系,自己封装一个简单的集合类
 5)列举list中的子类,并说明不同
 6)列举map中的子类,并说明不同
 7)多线程访问时,如何保证集合数据的同步
 8)如何把list中元素顺序打乱或者按一定规则排序

第十八章:Java I/O系统

18.1、理论问题

1)简述流的概念及输入输出流是相对谁说的

流是个抽象的概念,是对输入输出设备的抽象,java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。可以将流想象成一个“水流管道”
    java 中的“输入流”、“输出流”是相对的,以自己编的程序为基准,如果流是将数据从文件或者终端(电脑)读到程序,则该流就叫做输入流;如果流将数据从程序写到文件或者终端,则该流叫做输出流。

2)字节流与字符流的区别

字节流操作字节 1 byte = 8 bit
字符流操作字符 1 char = 2 byte = 16 bit
字符流适合处理纯文本文件
编码方式不同决定处理文件类型不同,字节流(ASCII)处理二进制文件,字符流(Unicode)处理文本文件,仅此而已。

3)列出常用的字节读写流、字符读写流

在这里插入图片描述

18.2、编码测试

1)按照行进行读取文件并存储到List容器中

2)测试上面列出的流进行读写

3)把文件从一个位置复制到另一个位置,并说明IO流处理时标准的异常处理方法

4)写一个字符流与字节流复制文件的方法,体验不同之处

字节流不需要刷新缓冲区,字符流需要刷新缓冲区
字节流可以复制图片,字符流无法复制图片

5)写一个校验文件md5的工具类

6)从网上下载一个文件(歌曲,文档)

7)比较inputstream与bufferedinputstream的不同,哪种效率高

8)写一个文件服务器,支持文件上传下载、支持md5校验、支持传输压缩

第二十一章:并发

21.2、编码测试

1)生产者消费者例子

2)学习jstack命令,抓取线程状态并分析

3)手动构造一个死锁,并分析

4)写个无限创建线程,产生oom,并分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值