线性表、顺序表以及ArrayList、Iterable、Collection、List中重要的方法
線性表基本概念
線性表(linear list)是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構,常見的線性表:順序表、鏈表、棧、隊列、字符串
線性表在邏輯上是線性結構,也就說是連續的一條直線。但是在物理結構上并不一定是連續的,線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲
- > 線性表不允許中間有空洞
注意: 順序表中一定要區分兩個概念 容量(capacity) vs 元素個數(size);線性表的所有下標只和元素個數相關,和容量無關 .
順序表基本概念
順序表是在計算機內存中以數組的形式保存的線性表,線性表的順序存儲是指用一組地址連續的存儲單元,依次存儲線性表中的各個元素、使得線性表中再邏輯結構上響鈴的數據元素存儲在相鄰的物理存儲單元中,即通過數據元素物理存儲的相鄰關系來反映數據元素之間邏輯上的相鄰關系。
數組中存在的問題:
1.無法嚴格區分容量和已有元素的個數
2.數組無法做到自行擴容
java中已經提供的順序表—java.util.ArrayList
ArrayList是一個泛型類,元素類型使用泛型表示
ArrayList重要方法
public boolean add(E e);向順序表中進行尾插,一定 會返回true。注意:放在目前最后一個元素的后邊,而不是 容量的最后一個位置。 public void add(int index,E element);向順序表 中插入e元素,放到下標為index的位置,注意index的合 法下標是0~size 如:順序表 [a,b,c]現在調用方法add(1,元素),此時會將b,c依次向后移,將要插入的元素放在1下標。舉個栗子:
ArrayList<String> list = new ArrayList<>(); list.add("1"); list.add(2,"1"); System.out.println(list.size()); 報錯: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 1上面這個代碼會報錯,因為此時的size是1,下標2超出了范圍,所以越界報錯了。
改為以下代碼就不會報錯了,因為插入index的合法范圍是0~size
問:index的取值范圍是什么?和容量有關還是和size有關?
回答:和size有關,和容量無關。
public E remove(int index);刪除index位置的元素,返回被刪除的元素;刪除的時候合法的下標取值范圍是[0,size-1]。刪掉一個元素后該元素后面的元素會依次向前移動一位,順序表的元素個數減一。 public boolean remove(Object o);刪除指定元素 1.如果該元素在順序表中并且只有一個,則刪除該元素,并且將 后面的元素依次補上,返回true 2.如果該元素沒有在順序表中,什么都不做,返回false,表示 該元素不在順序表中 3.如果在元素在順序表中存在且不止一個,則刪除第一個遇到 的元素,并且返回true。 public E get(int index);獲取順序表中index位置的元素 并且返回該元素 public E set(int index,E element);向順序表中index 位置設置元素進去,并且返回該下邊位置原來的元素下標的取值范圍都是[0,size) 栗子: [a,b,c] get(1) 得到b set(1,"d") 將1下標設置為d并且返回b public boolean contains(Object o); 判斷順序表中是否包含該元素,包含返回true,不包含返回 false; public int indexOf(Object o);返回此列表中第一次 出現的指定元素的索引,如果列表不包含該元素,則返回 -1; 返回該元素怒從前往后找的首次遇到的下標,如果沒找到就 返回-1 public int lastIndexOf(Object o);返回列表中最后出現 的指定元素的索引;如果列表不包含此元素,則返回 -1 返回 該元素怒從后往前找的首次遇到的下標,如果沒找到就返回-1 public void clear();清空一個順序表,無論原來順序表 中有沒有元素,調用改方法后,size==0 public int size();返回順序表中當前已有的元素個數 public boolean isEmpty();等價于size == 0,如果此列表 中沒有元素,則返回 trueIterable中的方法
public interface Iterable<T> {Iterator<T> iterator();//通過iterator()方法返回迭代器,通過迭代器可以進一步的進行迭代default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}default Spliterator<T> spliterator() {return Spliterators.spliteratorUnknownSize(iterator(), 0);} }使用栗子:
import java.util.ArrayList; import java.util.Iterator;public class ArrayListDemo {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("1");list.add(1,"2");list.add("3");Iterable<String> r1 = list; //r1指向的對象具備迭代能力//1.通過r1得到迭代器對象Iterator<String> iterator = r1.iterator(); // System.out.println(iterator.hasNext()); // String s1 = iterator.next(); //返回“1”,iterator內部走到了“2” // // System.out.println(s1); // System.out.println(iterator.hasNext()); // String s2 = iterator.next(); // System.out.println(s2); // // System.out.println(iterator.hasNext()); // String s3 = iterator.next(); // // System.out.println(s3); // System.out.println(iterator.hasNext());//不知道元素個數進行迭代while (iterator.hasNext()){String s = iterator.next();System.out.println(s);}} }Iterator類似于之前學過的Scanner
public interface Iterator<E> {boolean hasNext(); //返回true:還有下一個/沒有迭代完,返回false:沒有下一個了/迭代完了E next(); //1.返回下一個元素 2.同時跳過該元素(這個元素被迭代過了),基于hasNext()返回true的前提default void remove() {throw new UnsupportedOperationException("remove");}default void forEachRemaining(Consumer<? super E> action) {Objects.requireNonNull(action);while (hasNext())action.accept(next());} }Collection中的方法
public interface Collection<E> extends Iterable<E> {boolean add(E e);//Collection代表的不一定是線性表,所以沒有次序的概念,add可以返回false也可以返回true,但List一定返回truevoid clear();//清空集合int size(); //返回集合中元素的個數boolean isEmpty();//判斷是否是一個沒有元素的集合boolean contains(Object o);//判斷是否存在,和equals方法相關boolean remove(Object o);//從集合中刪除o元素Iterator<E> iterator(); }Collection接口的栗子:
public class CollectionDemo {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");Collection<String> collection = list;System.out.println(collection);for (String s : collection){System.out.println(s);}collection.remove("1");System.out.println(collection.isEmpty());System.out.println(collection.add("4"));collection.clear();System.out.println(collection.isEmpty());} }通過引用可以執行哪些方法------引用類型決定
通過引用執行方法后真正執行的是哪個類的方法-----引用指向的對象類型決定
只有線性表才有是否有序這個概念。
List接口中的方法
public interface List<E> extends Collection<E> {void sort(Comparator 比較器);List subList(int fromIndex, int toIndex); //包含fromIndex不包含toIndexboolean addAll(Collection 集合);boolean addAll(int index, Collection 集合);boolean containsAll(Collection 集合);boolean removeAll(Collection 集合);boolean retainAll(Collection 集合);Object[] toArray(); }排序栗子:
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List;public class ListSortDemo {private static class IntegerComparator implements Comparator<Integer>{@Overridepublic int compare(Integer o1, Integer o2) {return o1.intValue() - o2.intValue();}public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(4);list.add(2);list.add(7);//方法1System.out.println(list);list.sort(new IntegerComparator());System.out.println(list);//方法2//Collections里面放的是給集合對象用的常見方法Collections.sort(list);System.out.println(list);//方法3Collections.sort(list,new IntegerComparator());System.out.println(list);//如果要實現逆序排序,可以修改實現方法compareTo,然后使用上面的方法1和3就能達到逆序排序}} }總結
方法:
增(向容器中添加元素)add
刪(從容器中刪除元素)remove
查(不修改容器的情況下,獲取元素get/contains/indexOf/lastIndexOf
改(修改個別元素)set
還有size/isEmpty
核心:
順序表中不允許出現空洞 index的下標的合法取值,肯定和size()有關
add:[0,size]
remove/get/set:[0,size)
總結
以上是生活随笔為你收集整理的线性表、顺序表以及ArrayList、Iterable、Collection、List中重要的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中的解压文件命令有哪些(Lin
- 下一篇: 苹果8p电池容量多少毫安