这周还是主要学习了泛型和容器类。
实现List<E>接口的类有两个:链表类LinkedList<E>和数组列表类ArrayList<E>;都是线性类。
<E>链表类采用链表结构保存对象,使用循环表实现List<E>。特点:这种结构向链表中任意位置插入,删除元素是不需要移动其他他元素,链表的大小可以动态增大或减小的,但不具有随机存储特性。
ArrayList<E>数组列表类使用一堆数组实现LIstanbul<E>,该类实现的是可变数组,允许所有元素,包括null。特点:具有随机存取特性,插入,删除其他元素时需要移动其他元素,当元素很多是插入,删除操作的速度较慢添加元素时会自动增大,不会自动缩小,可以使用trimToSize()方法将数组的容量减小到数组列表的大小。
选用线性表原则:若要通过下标随机访问元素,但除了在末尾处之外,不在其它位置插入或删除操作,则应选择ArrayList<E>类;但需要在线性表的任意位置进行插入或删除操作,用选择LinkedList<E>。
LinkedList<E>类与ArrayList<E>类的大部分方法是继承其父类或祖先类,除此之外还各自定义了自己的方法。
对容器中元素进行访问时,经常需要按照某种次序对容器中的每个元素访问且仅访问一次,这就是遍历(迭代);遍历是指从容器中获取当前元素的后续元素。
LinkedList<E>集合:底层数据结构是双链表,查询慢,增删快,但是如果是操作的是首位元素,速度也是极快的
迭代器:iterator():生成一个迭代器对象,默认和指向集合的0索引处
对容器遍历的方式:
(1)foreach循环语句
(2)利用Collection<E>接口中定义的toArray()方法将容器对象转换为数组,然后利用循环语句对数组中的每个元素进行访问。
(3)利用size()和get()方法进行遍历。
(4)利用java提供的迭代功能
对于容器中元素的遍历次序,迭代器接口Iterator<E>支持对List<E>对象从前往后的遍历,但对于其子接口ListIterator<E>支持对List<E>对象的双向遍历.
集合接口Set<E>
Set<E>是一个不含重复元素的集合接口;Set<E>集合的对象不按特定的方式排序,只是简单的把对象加入集合中即可,但加的对象一定不能重复。
实现Set<E>接口的两个主要类是哈希集合类HashSet<E>及数集合类TreeSet<E>。
哈希集合类 HashSet<E>
哈希集合:是在元素的存储位置和元素的值k之间建立一个特定的对应关系f,使这个元素与一个唯一的存储位置相对应。(根据哈希码来存取集合中的元素。)(对应关系f称为哈希函数,该函数计算出的数值称为哈希码或散列索引,按这种关系建立的表称为哈希表,也称散列表)
HashSet<E>集合类是基于哈希表的Set<E>接口实现的。HashSet<E>集合不保证迭代顺序,但允许元素值为null。
比较两个加入哈希集合HashSet<E>中的元素是否相同:先比较哈希码方法hashCode()的返回值是否相同。若相同则再使用equals()方法比较其存储位置(即内存地址)。
对于哈希集合来说:若重写了元素对应类的equals()方法或hashCode()方法中的某一个,则必须重写另一个,以保证其判断的一致性。
数集合类TreeSet<E>
数集合类TreeSet<E>不仅实现了Set<E>接口,还实现了java.util.SortedSet接口,可以保证集合中的元素总是处于有序状态。TreeSet<E>类的大多数继承自其父类或祖先类
映射接口Map<K,V>
Map<K,V>11中的元素都是成对出现的,它提供了键(key)到值(value)的映射
映射接口Map<K,V>常用的实现类有哈希映射HashMap<K,V>和数映射TreeMap<K,V>
当然了,这周也进行了第二次考核,成绩也是整体较差,但较于上一次,这次有点略微进步,这次在进行编程题时可以有点下手的感觉,我总结的经验是还是要多练多做。
这是一道不完整,也有错误的编程,但是有一些套路
这也有问题,还是要多练。
下周继续学习Java基础,也要合理安排时间可以试试每天练一道算法,继续努力!