2018年學習總結博客總目錄:第一週 第二週 第三週 第四周
html
1.列表是對象的有序集合,在 List 界面中定義。 List 接口表示集合框架中的列表。列表能夠具備重複的元素。而且咱們能夠在列表中存儲多個空值。前端
2.列表集合 是一種概念性的表示方法,其思想是使事物以線性列表的方式進行組織,就像棧和隊列同樣,列表也可使用數組和鏈表來實現。列表集合沒有內在的容量大小,它能夠隨着須要而增大。列表集合更通常化,能夠在列表的中間和末端添加和刪除元素。java
3.列表能夠分爲有序列表、無序列表、索引列表。git
4.列表的整體UML圖
數據庫
5.Java集合API中的列表所定義的一些基本操做,見下表數組
操做 | 描述 |
---|---|
add | 向列表末端添加一個元素 |
add(int index, E element) | 在列表的指定位置插入指定元素 |
get(int index) | 返回列表中指定位置的元素 |
remove(int index) | 移除列表中指定位置的元素 |
remove(Object o) | 今後列表中移除第一次出現的指定元素(若是存在) |
set(int index, E element) | 用指定元素替換列表中指定位置的元素 |
size() | 返回列表中的元素數 |
6.①無序列表的使用:學習計劃;②索引列表的使用:Josephus問題。網絡
7.列表ADT
(1)列表的常見操做數據結構
操做 | 描述 |
---|---|
removeFirst | 從列表中刪除第一個元素 |
removeLast | 從列表中刪除最後一個元素 |
remove | 從列表中刪除某個元素 |
first | 查看位於列表前端的元素 |
last | 查看位於列表末端的元素 |
isEmpty | 肯定列表是否爲空 |
size | 肯定列表中的元素數 |
(2)接口ListADT的代碼app
import java.util.Iterator; public interface ListADT<T> extends Iterable<T> { public T removeFirst(); public T removeLast(); public T remove(T element); public T first(); public T last(); public boolean contains(T target); public boolean isEmpty(); public int size(); public Iterator<T> iterator(); public String toString(); }
(3)有序列表接口類代碼框架
public interface OrderedListADT<T> extends ListADT<T> { public void add(T element); }
(4)無序列表接口類代碼
public interface UnorderedListADT<T> extends ListADT<T> { public void addToFront(T element); public void addToRear(T element); public void addAfter(T element, T target); }
8.使用數組實現列表
public abstract class ArrayList<T> implements ListADT<T>, Iterable<T> { private final static int DEFAULT_CAPACITY = 100; private final static int NOT_FOUND = -1; protected int rear; protected T[] list; protected int modCount; public ArrayList() { this(DEFAULT_CAPACITY); } public ArrayList(int initialCapacity) { rear = 0; list = (T[])(new Object[initialCapacity]); modCount = 0; } }
public T remove(T element) { T result; int index = find(element); if (index == NOT_FOUND) throw new ElementNotFoundException("ArrayList"); result = list[index]; rear--; // shift the appropriate elements for (int scan=index; scan < rear; scan++) list[scan] = list[scan+1]; list[rear] = null; modCount++; return result; } private int find(T target) { int scan = 0; int result = NOT_FOUND; if (!isEmpty()) while (result == NOT_FOUND && scan < rear) if (target.equals(list[scan])) result = scan; else scan++; return result; }
public boolean contains(T target) { return (find(target) != NOT_FOUND); }
public void add(T element) { if (!(element instanceof Comparable)) throw new NonComparableElementException("OrderedList"); Comparable<T> comparableElement = (Comparable<T>)element; if (size() == list.length) expandCapacity(); int scan = 0; // find the insertion location while (scan < rear && comparableElement.compareTo(list[scan]) > 0) scan++; // shift existing elements up one for (int shift=rear; shift > scan; shift--) list[shift] = list[shift-1]; // insert element list[scan] = element; rear++; modCount++; }
public void addAfter(T element, T target) { if (size() == list.length) expandCapacity(); int scan = 0; // find the insertion point while (scan < rear && !target.equals(list[scan])) scan++; if (scan == rear) throw new ElementNotFoundException("UnorderedList"); scan++; // shift elements up one for (int shift=rear; shift > scan; shift--) list[shift] = list[shift-1]; // insert element list[scan] = element; rear++; modCount++; }
9.使用鏈表實現列表
public abstract class LinkedList<T> implements ListADT<T>, Iterable<T> { protected int count; protected LinearNode<T> head, tail; protected int modCount; /** * Creates an empty list. */ public LinkedList() { count = 0; head = tail = null; modCount = 0; } }
問題1:對於書上97頁所說起的「Serializable接口是爲了某個對象能使用串行化進行存儲」,什麼是串行化,又是怎麼實現的?
a) Java對象:在java中要想使一個java對象能夠實現序列化與反序列化,必須讓該類實現java.io.Serializable接口,java.io.Serializable接口定義以下:
publicinterface Serializable { }
b) 序列化主要依賴java.io.ObjectOutputStream類,該類對java.io.FileOutputStream進一步作了封裝,這裏主要使用ObjectOutputStream類的writeObject()方法實現序列化功能
/** *將對象序列化到磁盤文件中 *@paramo *@throwsException */ publicstaticvoid writeObject(Object o) throws Exception{ File f=new File("d:""user.tmp"); if(f.exists()){ f.delete(); } FileOutputStream os=new FileOutputStream(f); //ObjectOutputStream 核心類 ObjectOutputStream oos=new ObjectOutputStream(os); oos.writeObject(o); oos.close(); os.close(); }
問題1:Josephus問題中的代碼中numPeople,skip分別表明什麼意思?
問題1解決方案:把書上代碼敲入後,運行了兩次,去對比書上給出的那個7個元素的結果,
這時即可理解numPeople表明總的人數,而skip表明的則是每隔幾個元素刪除一個元素,每3我的在這裏其實是每隔2我的。
問題2:作PP6.17時,關於compareTo方法如何去編寫遇到了些問題
if (prefix.compareTo(course.prefix) > 0) { return 1; } else { if (prefix.compareTo(course.prefix) < 0) { return -1; } else { if (number > course.number) { return 1; } else { return -1; } } }
add方法:
public void addCourse(Course course) { int i=0; for(Course course1:list) { if (course1.compareTo(course)<0) i++; } list.add(i,course); }
上週代碼行數爲8867行,如今爲10335行,本週共1468行,
博客中值得學習的或問題: 博客中代碼問題解決過程記錄較詳細,可適當添加教材內容總結。
結對學習內容:學習第6章內容——列表
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 15/15 | |
第二週 | 572/572 | 1/2 | 16/31 | |
第三週 | 612/1184 | 1/3 | 13/44 | |
第四周 | 1468/2652 | 2/5 | 13/57 |