20175214 《Java程序设计》第8周学习总结

20175214 《Java程序设计》第4周学习总结


前言:由于个人原因回家了两周,java学习进程落下了两周,且目前需交的实验报告较多,暂时无法补上前两次的博客,在将来会陆续补上,这次直接跳到当前课堂进度。


本周学习任务总结

1、根据《java2实用教程》和蓝墨云学习视频学习第十五章;

2、尝试将课本重点内容用自己的话复述手打;

3、输入课本代码并上传码云;

4、使用IDEA调试代码;

5、学习使用API。


教材学习重点内容总结

  • 15.1 泛型

    初步的了解:主要用于建立具有类型安全的集合构架,如链表、散列映射等数据结构。

    • 15.1.1 泛型类声名

      • eg:class People<E>

      • analysis:People泛型类的名称,E是其中的泛型,但并没有指定E是何种类型的数据,它可以是任何对象或接口,但不能是基本类型数据

    • 15.1.2 使用泛型类声明对象

      • 泛型类声明和创建对象时,类名后多了一对<>,而且必须要用具体的类型替换<>中的泛型。例如:
Cone<Circle> coneOne;
coneOne =new Cone<Circle>(new Circle());
  + 使用泛型类的优点在于,使用这些泛型类建立的数据结构时,不必进行强制类型转换,即不要求进行运行时类型检查。
  • 15.2 链表

    • 链表:由若干个称作结点的对象组成的一种数据结构

      • 单链表(图15.2):每个结点含有一个数据和下一个结点的引用;
      • 双链表(图15.3):每个结点含有一个数据并含有上一个结点的引用和下一个结点的引用;
    • 15.2.1 LinkedList泛型类

      • java.util包中的LinkedList<E>泛型类创建的对象以链表结构存储数据,习惯上称LinkedList类创建的对象为链表对象

      • eg: LinkedList<String> mylist=new LinkedList<String>();

      • analysis:即创建一个空双链表。

      • 使用LinkedList<E>泛型类声名创建链表时,必须要指定E的具体类型,然后链表就可以使用add(E obj)方法向链表依次增加结点。例如,上述链表mylist使用add方法添加结点

      • 结点中的数据必须是String对象,如下列代码所示:

mylist.add ("How") ;
mylist.add("Are") ;
mylist.add ("You") ;
mylist. add ("Java") ;

这时,链表mylist就有了有4个结点,结点是自动链接在起的,不需要我们做链接,
也就是说,不需要操作安排结点中所存放的下一个或上一个结点的引用。

  • 15.2.2 LinkedList泛型类常用方法

    • LinkedList<E>泛型类是实现了泛型接口List<E>的泛型类,而泛型接口List<E>又是Collection<E>泛型接口的子接口。LinkedList<E>泛型类中的绝大部分方法都是泛型接口方法的实现。

    • 编程时,可以使用接口回调技术,即把LinkedList<E>对象的引用赋值给Collection<E>接口变量或List<E>接口变量,借口就可以调用类实现的接口方法

    LinkedList<E>泛型类实现Lis<E>泛型接口中的一些常用方法:
    
    public boolean add(E element)  向链表末尾添加一个新的节点,该节点中的数据是参数elememt指定的数据。
    
    public void add(int index ,E element)  向链表的指定位置添加一个新的节点,该节点中的数据是参数elememt指定的数据。
    
    public void clear()  删除链表的所有节点,使当前链表成为空链表。
    
    public E remove(int index)  删除指定位置上的节点。
    
    public boolean remove(E element)  删除首次出现含有数据elemen的节点。
    
    public E get(int index)  得到链表中指定位置处节点中的数据。
    
    public int indexOf(E element)  返回含有数据element的节点在链表中首次出现的位置,如果链表中无此节点,则返回-1。
    
    public int lastIndexOf(E element)  返回含有数据element的节点在链表中最后出现的位置,如果链表中无此节点,则返回-1。
    
    public E set(int index, E element)   将当前链表index位置节点中的对象element替换为参数element指定的对象,并返回被替换的对象。
    
    public int size()   返回链表的长度,即节点的个数。
    
    public boolean contains(Object element)   判断链表中节点中是否有节点含有对象element。
    
    
    LinkedList<E>泛型类本身新增加的一些常用方法:
    
    public void addFirst(E element)  向链表的头添加新节点,该节点中的数据是参数elememt指定的数据。
    
    public void addLast(E element)  向链表的末尾添加新节点,该节点中的数据是参数elememt指定的数据。
    
    public E getFirst()  得到链表中第一个节点中的数据。
    
    public E removeFirst()  删除第一个节点,并返回这个节点中的数据。
    
    public E removeLast()  删除最后一个节点,并返回这个节点中的数据。
    
    public Object clone()  得到当前链表的一个克隆链表,该克隆链表中节点数据的改变不会影响到当前链表中的节点数据,反之亦然。
    
    • 由于LinkedList不是顺序结构,调用get(int index)方法较慢,故而当用户需要遍历集合中的对象时,应当使用该集合提供的迭代器,而不是让集合本身来遍历其中的对象。

    • 由于迭代器遍历集合的方法在找到集合中的一个对象的同时,也得到待遍历的后继对象的引用,因此迭代器可以快速地遍历集合。

    • 链表对象可以使用iterator()方法获取一个Iterator对象,该对象就是针对当前链表的迭代器。

    • 使用get()获取一个结点中的对象时,要用类型转换运算符转换回原来的类型。

  • 15.2.4 排序与查找

Collections类提供的用于排序和查找的类方法如下:

public static sort(List<E> list) 该方法可以将list中的元素升序排列。

int binarySearch(List<T> list, T key,CompareTo<T> c) 使用折半法查找list是否含有和参数key相等的元素,如果key链表中某个元素相等,方法返回和key相等的元素在链表中的索引位置(链表的索引位置从0开始),否则返回-1。
  • String类实现了Comparable接口,规定字符串按字典序比较大小。

  • 若链表中存放的是非字符串数据,那么创建对象的类必须实现Comparable接口,即实现该接口中的方法int compareTo(Object b)来规定对象的大小关系。

  • 15.2.5 洗牌与旋转

    Collections类还提供了将链表中的数据重新随机排列的类方法以及旋转链表中数据的类方法。
    
    public static void shuffle(List<E> list) 将list中的数据按洗牌算法重新随机排列。
    
    static void rotate(List<E> list, int distance) 旋转链表中的数据。
    
    public static void reverse(List<E> list) 翻转list中的数据。
    
  • 15.3 堆栈

    堆栈是一种“后进先出”的数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。

    • 堆栈将第一个进入的数据放在最底下,而把后续放入的数据放在已有数据的顶上。

    • 向堆栈中输入数据的操作称作“压栈”,输出称为“弹栈”,弹栈即输出(删除)最后压入栈中的数据。

Stack<E>泛型类创建一个堆栈对象,堆栈对象常用方法:

public E push(E item);实现压栈操作

public E pop();实现弹栈操作。

public boolean empty();判断堆栈是否还有数据。

public E peek();获取堆栈顶端的数据,但不删除该数据。

public int search(Object data);获取数据在堆栈中的位置。
  • 15.4 散列映射

    • 15.4.1 HashMap<K,V>泛型类

      • HashMap<K,V>对象采用散列表这种数据结构存储数据,习惯上称HashMap<K,V>对象为散列映射

      • eg: HashMap<String,Student> hashtable= HashSet<String,Student>();

      • hashtable可以存储“键/值”对数据。

        • 相关方法:
    public V put(K key,V value)      将键/值对数据存放到散列映射中,该方法同时返回键所对应的值。
    
  • 15.4.2 常用方法

    public void clear() 清空散列映射。
    
    public Object clone() 返回当前散列映射的一个克隆。
    
    public boolean containsKey(Object key) 如果散列映射有“键/值”对使用了参数指定的键,方法返回true,否则返回false。
    
    public boolean containsValue(Object value) 如果散列映射有“键/值”对的值是参数指定的值。
    
    public V get(Object key) 返回散列映射中使用key做键的“键/值”对中的值。
    
    public boolean isEmpty() 如果散列映射不含任何“键/值”对,方法返回true,否则返回false。
    
    public V remove(Object key) 删除散列映射中键为参数指定的“键/值”对,并返回键对应的值。
    
    public int size() 返回散列映射的大小,即散列映射中“键/值”对的数目。
    
  • 15.4.3 遍历散列映射

    • public Collection<V> values()方法返回一个实现Collection<V>接口类创建的对象。

    • 使用接口回调技术,即将该对象的引用赋给Collection<V>接口变量,该接口变量可以回调iterator()方法获取一个Iterator对象,这个Iterator对象存放着散列映射中所有“键/值”对中的“值”。

  • 15.4.4 基于散列映射的查询

    • 对于经常需要进行查找的数据可以采用散列映射来存储这样的数据,即为数据指定一个查找它的关键字,然后按着“健-值”对,将关键字和数据一并存入散列映射中。
  • 15.5 树集

    • 15.5.1 TreeSet泛型类

      • TreeSet类创建的对象称作树集。

      • eg: TreeSet<String> mytree=new TreeSe<String>();

        • 然后使用add方法为树集添加节点,例如:mytree.add("boy");
    • 15.5.2 结点的大小关系

    • 树集用add方法添加节点,节点会按其存放的数据的“大小”顺序一层一层地依次排列,在同一层中的节点从左到右按“大小”顺序递增排列,下一层的都比上一层的小。

    • 15.5.3 TreeSet类的常用方法

    public boolean add(E o) 向树集添加加节点。
    
    public void clear() 删除树集中的所有节点。
    
    public void contains(Object o) 如果树集中有包含参数指定的对象,该方法返回true,否则返回false 。
    
    public E first() 返回树集中的第一个节点中的数据(最小的节点)。
    
    public E last() 返回最后一个节点中的数据(最大的节点)。
    
    public isEmpty() 判断是否是空树集,如果树集不含任何节点,该方法返回true 。
    
    public boolean remove(Object o) 删除树集中的存储参数指定的对象的最小节点。
    
    public int size() 返回树集中节点的数目。
    

   - 15.6 树映射

      - `TreeMap<K,V>`类实现了`Map<K,V>`接口,称`TreeMap<K,V>`对象为树映射。

      - 树映射使用`public V put(K key,V value);`方法添加节点。

   
   - 15.7 自动装箱与拆箱

      - JDK1.5新增的基本类型数据和相应的对象之间相互自动转换的功能,称作基本数据类型的自动装箱与拆箱(Autoboxing and Auto-Unboxing of Primitive Types)。

---

## 教材学习中的问题和解决过程

- **问题1**:Example5_10中的注释`自动装箱,实际添加到list中的是new Integer(i)`是什么意思。
- **问题1解决方案**:查阅资料[详解Java的自动装箱与拆箱(Autoboxing and unboxing)](https://www.cnblogs.com/wang-yaz/p/8516151.html) ,基本数据类型进入类似链表的数据结构时会发生`new Integer()`的调用。拆箱同理,即逆过程。

- **问题2**:`junit` 无法使用,报红
- **问题2解决方案**:双击`testcase`,出现红色小灯泡,点击后根据提示添加`junit3 path`。

- **问题3**:编译时提示:使用未经检查或不安全的的操作
- **问题3解决方案**:在类前面加`@SuppressWarnings("unchecked")`。

- **问题4**:运行`Example15_7`时,无论输入哪个单词都显示`没有此单词`

![](https://img2018.cnblogs.com/blog/1592121/201904/1592121-20190421142821518-1149327861.png)

- **问题4解决方案**:如图,添加路径。

![](https://img2018.cnblogs.com/blog/1592121/201904/1592121-20190421142827884-1113079566.png)

---

## [代码托管](https://gitee.com/fzlzc/java2019)

![](https://img2018.cnblogs.com/blog/1592121/201904/1592121-20190421142846408-1357171532.png)
posted @ 2019-04-21 14:38  20175214lzc  阅读(111)  评论(0编辑  收藏  举报