营销型企业网站建设与推广,网站数据库怎么恢复,个人网页设计页眉,蓝色风格网站模板一、 数组1、数组是保存一组对象的最有效的方式。但数组有固定的尺寸而受限(p216)2、数组与其他种类的容器之间的区别有三方面#xff1a;效率、类型和保存基本类型的能力。在Java中#xff0c;数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性…一、 数组1、数组是保存一组对象的最有效的方式。但数组有固定的尺寸而受限(p216)2、数组与其他种类的容器之间的区别有三方面效率、类型和保存基本类型的能力。在Java中数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列这使得元素访问非常快速。但是为这种速度所付出的代价就是数组对象的大小被固定并且在其生命周期中不可改变。3、无论使用哪种类型的数组数组标识符其实只是一个引用指向在堆中创建的一个真实对象这个(数组)对象用以保存指向其他对象的引用。4、对象数组和基本类型数组在使用上几乎是相同的唯一的区别就是对象数组保存的是引用基本类型数组直接保存基本类型的值。新建一个对象数组未赋值时自动初始化为null同样基本类型的数组如果是数值型的就被自动初始化为0如果是字符型(char)的就被自动初始化为(char)O如果是布尔型(boolean)就被自动初始化为false。5、多维数组//创建多维数组public static void main(String[] args) {int[][] a {{ 1, 2, 3}, { 4, 5, 6}};System.out.println(Arrays.deepToString(a));//deepToString返回指定数组“深层内容”的字符串表示形式。如果数组包含作为元素的其他数组//则字符串表示形式包含其内容等。此方法是为了将多维数组转换为字符串而设计的。int[][][] b new int[2][2][4];System.out.println(Arrays.deepToString(b));}public static void main(String[] args) {Integer[][] a;a new Integer[6][];for (int i 0; i a.length; i) {a[i] new Integer[3];for (int j 0; j a[i].length; j)a[i][j] i * j; // Autoboxing}System.out.println(Arrays.deepToString(a));//Output: [[0, 0, 0], [0, 1, 2], [0, 2, 4], [0, 3, 6], [0, 4, 8], [0, 5, 10]]}6、数组与泛型通常数组与泛型不能很好地结合。你不能实例化具有参数化类型的数组擦除会移除参数类型信息而数组必须知道它们所持有的确切类型以强制保证类型安全。但是你可以参数化数组本身的类型//类泛型class ClassParameter {public T[] f(T[] arg) {return arg;}}class MethodParameter {// 方法泛型public static T[] f(T[] arg) {return arg;}}public class ParameterizedArrayType {public static void main(String[] args) {Integer[] ints { 1, 2, 3, 4, 5 };Double[] doubles { 1.1, 2.2, 3.3, 4.4, 5.5 };Integer[] ints2 new ClassParameter().f(ints);Double[] doubles2 new ClassParameter().f(doubles);ints2 MethodParameter.f(ints);doubles2 MethodParameter.f(doubles);System.out.println(Arrays.deepToString(ints2));}}7、Arrays实用功能Arrays有六个基本方法(1)equals()用于比较两个数组是否相等(deepEquals()用于多维数组)(2)fill()(3)sort()用于对数组排序(4)binarySearch()使用二分搜索法在已经排序的数组中查找元素必须在进行此调用前对数组进行排序如果没有对数组进行排序则结果是不确定的。如果数组包含多个带有指定值的元素则无法保证找到的是哪一个。如果元素包含在数组中则返回搜索元素的索引否则返回搜索键的索引(好像就是得到搜索数组的长度的负值)否则返回(-(插入点) - 1)。插入点 被定义为将键插入数组的那一点即第一个大于此键的元素索引如果数组中的所有元素都小于指定的键则为a.length。注意这保证了当且仅当此键被找到时返回的值将 0 。(5)toString()产生数组的String表示(6)hashCode()产生数组的散列码(7)asList()转变成List容器(8)copyOf(9)System.arraycopy()该方法不会执行自动包装和自动拆包两个数组必须具有相同的确切类型。8、利用Comparable进行比较利用该接口来进行比较很简单只需实现该接口然后实现compartTo方法即可。如果当前对象小于参数则返回负值如果相等则返回零如果当前对象大于参数则返回正值。二、 集合类集合类也称Java容器类1、Java容器类类库的用途是“保存对象”并将其划分为两个不同的概念。(p219)(1)Collection。该容器类类库包括List、Set、Queue。List必须按照插入的顺序保存元素Set不能有重复的元素Queue按照排队规则来确定对象产生的顺序(通常与他们被插入的顺序相同)。(2)Map。它被称为“关联数组”因为它将某些对象与另外一些对象关联在一了一起。Map是强大的编程工具。2、Collection接口概括了序列的概念(一种存放一组对象的方式。)(p219)3、每个java.util容器都有其自己的Abstract类它们提供了该容器的部分实现。4、为了创建只读的Map可以继承AbstractMap并实现entrySet()为了创建只读的Set可以继承AbstractSet并实现iterator()和size()为了创建只读的List可以继承AbstractList并实现get()和size()。3、在java.util包中的Arrays和Collections类中都有很多实用方法。public static void main(String[] args) {Collection collection new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,0));Integer[] moreInts {43,82,98,90,21};//Arrays.asList()方法接收一个数组或是一个用逗号分隔的元素列表(使用可变参数) -- 转成List对象collection.addAll(Arrays.asList(moreInts));//Collections.addAll()方法接受一个Collection对象以及一个数组或者是可变参数将元素添加到Collection中Collections.addAll(collection, 11,12,34,843,90,80,3);Collections.addAll(collection, moreInts);List list Arrays.asList(73,92,84,93,26,78,79);list.set(1, 0);//将索引为1的元素的值修改为0}4、完整的容器分类由上图可以看出Hashtable、Vector、Stack的特征是它们是过去遗留下来的类目的是为了支持老的程序(最好不要在新的程序中使用它们)不同类型的Queue只在它们接受和产生数值的方式上有所差异List1、ArrayList它长于随机访问元素但是在List的中间插入和移除元素时比较慢(p223)2、LinkedList它通过代价较低的在List中间进行的插入和删除操作提供了优化的顺序访问。但是在随机访问方面相对比较慢但是它的特性集较ArrayList更大。LinkedList还添加了可以使其用作栈、队列或双端队列的方法。(p228)LinkedList具有能够直接实现栈的所有功能的方法3、如果要进行大量的随机访问就使用ArrayList如果要经常从表中间插入或删除元素则应该使用LinkedList。(p245)4、Arrays.asList会生成一个List它基于一个固定大小的数组仅支持那些不会改变数组大小的操作因此add等操作方法会抛出一个不可选操作的异常。我们应该吧Arrays.asList的结果作为参数传递给任何Collection(或者使用addAll()方法或Collections.addAll()静态方法)这样可以生成允许使用所有的方法的普通容器。Stack1、“栈”通常是指“后进先出”(LIFO)的容器。有时栈也被称为叠加栈因为最后“压入”栈的元素第一个弹出栈。Set1、Set不能保存重复的元素Set中最常被使用的是测试归属性你可以很容易地询问某个对象是否在某个Set中。正因为如此查找就成为了Set中最重要的操作。Set具有与Collection完全一样的接口因此没有任何额外的功能不像List会有两个不同的List。实际上Set就是Collection只是行为不同。Set是基于对象的值来确定归属的 (p231)(1)HashSet无序的查找元素最快HashSet使用的是相当复杂的方式来存储元素的(p222)出于速度的原因HashSet使用了散列。HashSet所维护的顺序与TreeSet或LinkedHashSet都不同因为他们的实现具有不同的元素的存储方式。TreeSet将元素存储在红-黑树数据结构中而HashSet使用的是散列函数LinkedHashSet因查询速度的原因也使用了散列但是看起来它使用了链表来维护元素的插入顺序。(2)TreeSet它按照比较结果的升序保存对象保持元素处于排序状态(3)LinkedHashSet它按照被添加的顺序保存对象以插入顺序保存元素。Map1、Map也被称为关联数组就像一个简单的数据库。Map是一种将对象(而非数字)与对象相关联的设计。HashMap设计用来快速访问而TreeMap保持“键”始终处于排序状态所以没有HashMap快。LinkedHashMap保持元素插入的顺序但是也通过散列提供了快速访问能力。如何解释散列(p245)Map保存的顺序并不是他们插入的顺序HashMap也提供了最快的查找技术无序保存键和值在Map中的保存顺序并不是他们的插入顺序因为HashMap实现使用的是一种非常快的算法来控制顺序TreeMap按照比较结果的升序保存键LinkedHashMap按插入顺序保存键同时还保留了HashMap的查询速度。Queue1、Queue队列是一个典型的先进先出(FIFO)的容器。即从容器的一端放入事物从另一端取出并且事物放入容器的顺序与取出的顺序是相同的。队列常被当作一种可靠的将对象从程序的某个区域传输到另一个区域的途径。队列在并发编程中特别重要因为他们可以安全地将对象从一个任务传输到另一个任务。LinkedList提供了方法以支持队列的行为并且它实现了Queue的接口(p236)各种Queue以及栈的行为由LinkedList提供支持(p245)public static void main(String[] args) {Queue queue new LinkedList();Random rand new Random(47);for(int i0; i10; i){queue.offer(rand.nextInt(i 10));//offer方法是一个元素插入到队尾或者返回false}while(queue.peek() ! null){//peek获取栈顶第一元素pop弹栈push压栈System.out.println(queue.remove() );}}2、先进先出描述了最典型的队列规则。队列规则是指在给定一组队列中的元素的情况下确定下一个弹出队列的元素的规则。先进先出声明的是下一个元素应该是等待时间最长的元素。优先级队列声明下一个弹出元素是最需要的元素(具有最高的优先级)。(p237)迭代1、迭代器也是一种设计模式迭代器通常被称为轻量级对象创建它的代价小。(p226)2、Java的Iterator只能单向移动public static void main(String[] args) {Map map new HashMap();map.put(100, jack);map.put(200, marry);map.put(300, sisi);/* 1、Set迭代 */System.out.println(******Set迭代******);Set set new HashSet();Collections.addAll(set, 100,200,300);Iterator setIt set.iterator();while (setIt.hasNext()) {Integer key setIt.next();System.out.print(key \t);}/* 2、Map迭代一keySet */System.out.println(\r\r******Map迭代keySet******);Set keySet map.keySet();// 将Map集合的Key转成Set集合再通过key获取对应的值Iterator map1It keySet.iterator();while (map1It.hasNext()) {Integer key map1It.next();String value map.get(key);System.out.print(key - value \t);}/* 3、Map迭代二entrySet */System.out.println(\r\r******Map迭代entrySet******);Set entrySet map.entrySet();Iterator it entrySet.iterator();while (it.hasNext()) {Entry entry it.next();Integer key entry.getKey();String value entry.getValue();System.out.print(key value \t);}/* 4、Map迭代三增强for循环 */System.out.println(\r\r******Map迭代增强for循环******);for(Integer key : map.keySet()){//注意这里Key的类型是由map的泛型决定否则是objectSystem.out.print(key : map.get(key) \t);}/* 5、增强for循环迭代List */List newDeptList new ArrayList();List deptName new ArrayList();for(Department dept:deptList){if(!deptName.contains(dept.getDepartmentName())){deptName.add(dept.getDepartmentName());newDeptList.add(dept);}}}输出结果3 、ListIteratorListIterator是一个更加强大的Iterator的子类型是一个接口它只能用于各种List类的访问。Iterator只能向前移动但是ListIterator可以双向移动。它还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引并且可以使用set()方法替换它访问过的最后一个元素。你可以通过调用listIterator()方法产生一个指向List开始处的ListIterator并且还可以通过调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。public static void main(String[] args) {List list new ArrayList();Collections.addAll(list, java,c,c,oracle,mysql);ListIterator it list.listIterator();while(it.hasNext()){System.out.println(it.next() it.nextIndex() , it.previousIndex() ;);}System.out.println();//Backwardswhile(it.hasPrevious()){System.out.print(it.previous() );//previous前一个元素}}另外还可以通过ListIterator实现动态向List中添加数据public static void main(String[] args) {List list new ArrayList();Collections.addAll(list, jack,marry,sisi);/* 1、使用iterator动态添加数据 */Iterator it list.iterator();while(it.hasNext()){String key it.next();//这行在第二次循环时会出错因为在创建迭代器的时候(it list.iterator())list通知迭代器的是长度为3而在执行完list.add(“qq”)时list长度已经是4但是没有及时通知迭代器所以会出错。System.out.print(key\t);//list.add(qq);//迭代时向List集合中添加数据在第一次循环最后会想list中添加数据在验证iterator动态添加数据时需吧这行注释去掉}System.out.println(\r**************************);/* 2、使用ListIterator动态添加数据 */ListIterator it2 list.listIterator();//ListIteratorwhile (it2.hasNext()) {String key it2.next();System.out.print(key \t);// 动态通知迭代器加入了新元素从而迭代器自动通知List集合。it2.add(qq);//现在添加进去的数据在下次迭代时才会被迭代出来}System.out.println(\r**************************);/* 3、再次对集合迭代验证数据是否被添加进去 */ListIterator it3 list.listIterator();while (it3.hasNext()) {String key it3.next();System.out.print(key \t);}}输出结果三、 总结1、新程序中不应该使用过时的Vector、Hashtable 和Stack。(p245)2、Java容器简图(p246)3、程序的输出是从Object默认的toString()方法产生的该方法将打印类名后面跟随该对象的散列码的无符号十六进制表示(这个散列码是通过hashCode()方法产生的)。你将在第17章中了解到有关散列码的内容(p218)4、优化是一个很棘手的问题最好的策略就是置之不顾直到你发现需要担心它了(尽管理解这些问题总是一种好的思路)5、通过针对接口而非具体实现来编码我们的代码可以应用与更多的对象类型。(p239)6、将保持不变的事物与会发生改变的事物相分离7、Collections常用方法(不包括Object继承而来的方法)下列方法也是可通过Set或List执行的所有操作(List还有额外的功能)Map不是继承自Collection会另行介绍。