面試:在面試中關於List(ArrayList、LinkedList)集合會怎麼問呢?你該如何回答呢?

前言

在一開始基礎面的時候,很多面試官可能會問List集合一些基礎知識,比如:

  • ArrayList默認大小是多少,是如何擴容的?

  • ArrayListLinkedList的底層數據結構是什麼?

  • ArrayListLinkedList的區別?分別用在什麼場景?

  • 為什麼說ArrayList查詢快而增刪慢?

  • Arrays.asList方法后的List可以擴容嗎?

  • modCount在非線程安全集合中的作用?

  • ArrayListLinkedList的區別、優缺點以及應用場景

 

ArrayList(1.8)

ArrayList是由動態再分配的Object[]數組作為底層結構,可設置null值,是非線程安全的。

ArrayList成員屬性

//默認的空的數組,在構造方法初始化一個空數組的時候使用
private static final Object[] EMPTY_ELEMENTDATA = {};
​
//使用默認size大小的空數組實例
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
​
//ArrayList底層存儲數據就是通過數組的形式,ArrayList長度就是數組的長度。
transient Object[] elementData; 
​
//arrayList的大小
private int size;

那麼ArrayList底層數據結構是什麼呢?

很明顯,使用動態再分配的Object[]數組作為ArrayList底層數據結構了,既然是使用數組實現的,那麼數組特點就能說明為什麼ArrayList查詢快而增刪慢?

因為數組是根據下標查詢不需要比較,查詢方式為:首地址+(元素長度*下標),基於這個位置讀取相應的字節數就可以了,所以非常快;但是增刪會帶來元素的移動,增加數據會向後移動,刪除數據會向前移動,導致其效率比較低。

 

ArrayList的構造方法

  • 帶有初始化容量的構造方法

  • 無參構造方法

  • 參數為Collection類型的構造器

//帶有初始化容量的構造方法
public ArrayList(int initialCapacity) {
    //參數大於0,elementData初始化為initialCapacity大小的數組
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    //參數小於0,elementData初始化為空數組
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    //參數小於0,拋出異常
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}
​
//無參構造方法
public ArrayList() {
    //在1.7以後的版本,先構造方法中將elementData初始化為空數組DEFAULTCAPACITY_EMPTY_ELEMENTDATA
    //當調用add方法添加第一個元素的時候,會進行擴容,擴容至大小為DEFAULT_CAPACITY=10
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

那麼ArrayList默認大小是多少?

從無參構造方法中可以看出,一開始默認為一個空的實例elementData為上面的DEFAULTCAPACITY_EMPTY_ELEMENTDATA,當添加第一個元素的時候會進行擴容,擴容大小就是上面的默認容量DEFAULT_CAPACITY10

ArrayList的Add方法

  • boolean add(E):默認直接在末尾添加元素

  • void add(int,E):在特定位置添加元素,也就是插入元素

  • boolean addAll(Collection<? extends E> c):添加集合

  • boolean addAll(int index, Collection<? extends E> c):在指定位置后添加集合

boolean add(E)
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

通過ensureCapacityInternal方法為確定容量大小方法。在添加元素之前需要確定數組是否能容納下,size是數組中元素個數,添加一個元素size+1。然後再數組末尾添加元素。

其中,ensureCapacityInternal方法包含了ArrayList擴容機制grow方法,當前容量無法容納下數據時1.5倍擴容,進行:

private void ensureCapacityInternal(int minCapacity) {
    //判斷當前的數組是否為默認設置的空數據,是否取出最小容量
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    //包括擴容機制grow方法
    ensureExplicitCapacity(minCapacity);
}
​
private void ensureExplicitCapacity(int minCapacity) {
        //記錄著集合的修改次數,也就每次add或者remove它的值都會加1
        modCount++;
​
        //當前容量容納不下數據時(下標超過時),ArrayList擴容機制:擴容原來的1.5倍
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
​
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        //ArrayList擴容機制:擴容原來的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

ArrayList是如何擴容的?

根據當前的容量容納不下新增數據時,ArrayList會調用grow進行擴容:

//相當於int newCapacity = oldCapacity + oldCapacity/2
int newCapacity = oldCapacity + (oldCapacity >> 1);

擴容原來的1.5倍。

void add(int,E)
public void add(int index, E element) {
    //檢查index也就是插入的位置是否合理,是否存在數組越界
    rangeCheckForAdd(index);
    //機制和boolean add(E)方法一樣
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    size++;
}

ArrayList的刪除方法

  • remove(int):通過刪除指定位置上的元素,

  • remove(Object):根據元素進行刪除,

  • clear():elementData中每個元素都賦值為null,等待垃圾回收將這個給回收掉,

  • removeAll(collection c):批量刪除。

 

remove(int)
public E remove(int index) {
    //檢查下標是否超出數組長度,造成數組越界
    rangeCheck(index);
​
    modCount++;
    E oldValue = elementData(index);
    //算出數組需要移動的元素數量
    int numMoved = size - index - 1;
    if (numMoved > 0)
        //數組數據遷移,這樣會導致刪除數據時,效率會慢
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    //將--size上的位置賦值為null,讓gc(垃圾回收機制)更快的回收它。
    elementData[--size] = null; // clear to let GC do its work
    //返回刪除的元素
    return oldValue;
}

為什麼說ArrayList刪除元素效率低?

因為刪除數據需要將數據後面的元素數據遷移到新增位置的後面,這樣導致性能下降很多,效率低。

remove(Object)
public boolean remove(Object o) {
    //如果需要刪除數據為null時,會讓數據重新排序,將null數據遷移到數組尾端
    if (o == null) {
        for (int index = 0; index < size; index++)
            if (elementData[index] == null) {
                //刪除數據,並遷移數據
                fastRemove(index);
                return true;
            }
    } else {
        //循環刪除數組中object對象的值,也需要數據遷移
        for (int index = 0; index < size; index++)
            if (o.equals(elementData[index])) {
                fastRemove(index);
                return true;
            }
    }
    return false;
}

可以看出,arrayList是可以存放null值。

 

LinkedList(1.8)

LinkedList是一個繼承於AbstractSequentialList的雙向鏈表。它也可以被當做堆棧、隊列或雙端隊列進行使用,而且LinkedList也為非線程安全, jdk1.6使用的是一個帶有 header節頭結點的雙向循環鏈表, 頭結點不存儲實際數據 ,在1.6之後,就變更使用兩個節點firstlast指向首尾節點。

LinkedList的主要屬性

//鏈表節點的個數 
transient int size = 0; 
//鏈表首節點
 transient Node<E> first; 
//鏈表尾節點
 transient Node<E> last; 
//Node節點內部類定義
private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;
​
        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

一旦變量被transient修飾,變量將不再是對象持久化的一部分,該變量內容在序列化后無法獲得訪問

LinkedList構造方法

無參構造函數, 默認構造方法聲明也不做,firstlast節點會被默認初始化為null。

*
/** Constructs an empty list. \*/*public LinkedList() {}
​

LinkedList插入

由於LinkedList由雙向鏈表作為底層數據結構,因此其插入無非由三大種

  • 尾插: add(E e)addLast(E e)addAll(Collection<? extends E> c)

  • 頭插: addFirst(E e)

  • 中插: add(int index, E element)

可以從源碼看出,在鏈表首尾添加元素很高效,在中間添加元素比較低效,首先要找到插入位置的節點,在修改前後節點的指針。

 

 

尾插-add(E e)和addLast(E e)
//常用的添加元素方法
public boolean add(E e) {
    //使用尾插法
    linkLast(e);
    return true;
}
​
//在鏈表尾部添加元素
public void addLast(E e) {
        linkLast(e);
    }
​
//在鏈表尾端添加元素
void linkLast(E e) {
        //尾節點
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        //判斷是否是第一個添加的元素
        //如果是將新節點賦值給last
        //如果不是把原首節點的prev設置為新節點
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        //將集合修改次數加1
        modCount++;
    }
​
頭插-addFirst(E e)
public void addFirst(E e) {
    //在鏈表頭插入指定元素
    linkFirst(e);
}
​
private void linkFirst(E e) {
         //獲取頭部元素,首節點
        final Node<E> f = first;
        final Node<E> newNode = new Node<>(null, e, f);
        first = newNode;
        //鏈表頭部為空,(也就是鏈表為空)
        //插入元素為首節點元素
        // 否則就更新原來的頭元素的prev為新元素的地址引用
        if (f == null)
            last = newNode;
        else
            f.prev = newNode;
        //
        size++;
        modCount++;
    }
中插-add(int index, E element)

index不為首尾的的時候,實際就在鏈表中間插入元素。

 // 作用:在指定位置添加元素
    public void add(int index, E element) {
        // 檢查插入位置的索引的合理性
        checkPositionIndex(index);
​
        if (index == size)
            // 插入的情況是尾部插入的情況:調用linkLast()。
            linkLast(element);
        else
            // 插入的情況是非尾部插入的情況(中間插入):linkBefore
            linkBefore(element, node(index));
    }
​
    private void checkPositionIndex(int index) {
        if (!isPositionIndex(index))
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }
​
    private boolean isPositionIndex(int index) {
        return index >= 0 && index <= size;
    }
​
    void linkBefore(E e, Node<E> succ) {
        // assert succ != null;
        final Node<E> pred = succ.prev;  // 得到插入位置元素的前繼節點
        final Node<E> newNode = new Node<>(pred, e, succ);  // 創建新節點,其前繼節點是succ的前節點,後接點是succ節點
        succ.prev = newNode;  // 更新插入位置(succ)的前置節點為新節點
        if (pred == null)
            // 如果pred為null,說明該節點插入在頭節點之前,要重置first頭節點 
            first = newNode;
        else
            // 如果pred不為null,那麼直接將pred的後繼指針指向newNode即可
            pred.next = newNode;
        size++;
        modCount++;
    }

LinkedList 刪除

刪除和插入一樣,其實本質也是只有三大種方式,

  • 刪除首節點:removeFirst()

  • 刪除尾節點:removeLast()

  • 刪除中間節點 :remove(Object o)remove(int index)

在首尾節點刪除很高效,刪除中間元素比較低效要先找到節點位置,再修改前後指針指引。

 

 

刪除中間節點-remove(int index)和remove(Object o)
remove(int index)和remove(Object o)都是使用刪除指定節點的unlink刪除元素

 public boolean remove(Object o) {
     //因為LinkedList允許存在null,所以需要進行null判斷        
     if (o == null) {
         //從首節點開始遍歷
         for (Node<E> x = first; x != null; x = x.next) {
             if (x.item == null) {
                 //調用unlink方法刪除指定節點
                 unlink(x);
                 return true;
             }
         }
     } else {
         for (Node<E> x = first; x != null; x = x.next) {
             if (o.equals(x.item)) {
                 unlink(x);
                 return true;
             }
         }
     }
    return false;
 } 
​
//刪除指定位置的節點,其實和上面的方法差不多
    //通過node方法獲得指定位置的節點,再通過unlink方法刪除
    public E remove(int index) {
        checkElementIndex(index);
       
        return unlink(node(index));
    }
​
 //刪除指定節點
    E unlink(Node<E> x) {
        //獲取x節點的元素,以及它上一個節點,和下一個節點
        final E element = x.item;
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;
        //如果x的上一個節點為null,說明是首節點,將x的下一個節點設置為新的首節點
        //否則將x的上一節點設置為next,將x的上一節點設為null
        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }
        //如果x的下一節點為null,說明是尾節點,將x的上一節點設置新的尾節點
        //否則將x的上一節點設置x的上一節點,將x的下一節點設為null
        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }
        //將x節點的元素值設為null,等待垃圾收集器收集
        x.item = null;
        //鏈表節點個數減1
        size--;
        //將集合修改次數加1
        modCount++;
        //返回刪除節點的元素值
        return element;
    }
刪除首節點-removeFirst()
//刪除首節點
public E remove() {
        return removeFirst();
    }
 //刪除首節點
 public E removeFirst() {
      final Node<E> f = first;
      //如果首節點為null,說明是空鏈表,拋出異常
      if (f == null)
          throw new NoSuchElementException();
      return unlinkFirst(f);
  }
  //刪除首節點
  private E unlinkFirst(Node<E> f) {
      //首節點的元素值
      final E element = f.item;
      //首節點的下一節點
      final Node<E> next = f.next;
      //將首節點的元素值和下一節點設為null,等待垃圾收集器收集
      f.item = null;
      f.next = null; // help GC
      //將next設置為新的首節點
      first = next;
      //如果next為null,說明說明鏈表中只有一個節點,把last也設為null
      //否則把next的上一節點設為null
      if (next == null)
          last = null;
      else
          next.prev = null;
      //鏈表節點個數減1
      size--;
      //將集合修改次數加1
      modCount++;
      //返回刪除節點的元素值
      return element;
 }
刪除尾節點-removeLast()
  
 //刪除尾節點
    public E removeLast() {
        final Node<E> l = last;
        //如果首節點為null,說明是空鏈表,拋出異常
        if (l == null)
            throw new NoSuchElementException();
        return unlinkLast(l);
    }
    private E unlinkLast(Node<E> l) {
        //尾節點的元素值
        final E element = l.item;
        //尾節點的上一節點
        final Node<E> prev = l.prev;
        //將尾節點的元素值和上一節點設為null,等待垃圾收集器收集
        l.item = null;
        l.prev = null; // help GC
        //將prev設置新的尾節點
        last = prev;
        //如果prev為null,說明說明鏈表中只有一個節點,把first也設為null
        //否則把prev的下一節點設為null
        if (prev == null)
            first = null;
        else
            prev.next = null;
        //鏈表節點個數減1
        size--;
        //將集合修改次數加1
        modCount++;
        //返回刪除節點的元素值
        return element;
    }

其他方法也是類似的,比如查詢方法 LinkedList提供了getgetFirstgetLast等方法獲取節點元素值。

modCount屬性的作用?

modCount屬性代表為結構性修改( 改變list的size大小、以其他方式改變他導致正在進行迭代時出現錯誤的結果)的次數,該屬性被Iterator以及ListIterator的實現類所使用,且很多非線程安全使用modCount屬性。

初始化迭代器時會給這個modCount賦值,如果在遍歷的過程中,一旦發現這個對象的modCount和迭代器存儲的modCount不一樣,Iterator或者ListIterator 將拋出ConcurrentModificationException異常,

這是jdk在面對迭代遍歷的時候為了避免不確定性而採取的 fail-fast(快速失敗)原則:

在線程不安全的集合中,如果使用迭代器的過程中,發現集合被修改,會拋出ConcurrentModificationExceptions錯誤,這就是fail-fast機制。對集合進行結構性修改時,modCount都會增加,在初始化迭代器時,modCount的值會賦給expectedModCount,在迭代的過程中,只要modCount改變了,int expectedModCount = modCount等式就不成立了,迭代器檢測到這一點,就會拋出錯誤:urrentModificationExceptions

 

總結

ArrayList和LinkedList的區別、優缺點以及應用場景

區別:

  • ArrayList是實現了基於動態數組的數據結構,LinkedList是基於鏈表結構。

  • 對於隨機訪問的getset方法查詢元素,ArrayList要優於LinkedList,因為LinkedList循環鏈表尋找元素。

  • 對於新增和刪除操作addremoveLinkedList比較高效,因為ArrayList要移動數據。

優缺點:

  • ArrayListLinkedList而言,在末尾增加一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部數組中增加一項,指向所添加的元素,偶爾可能會導致對數組重新進行分配;而對LinkedList而言,這個開銷是 統一的,分配一個內部Entry對象。

  • ArrayList集合中添加或者刪除一個元素時,當前的列表移動元素後面所有的元素都會被移動。而LinkedList集合中添加或者刪除一個元素的開銷是固定的。

  • LinkedList集合不支持 高效的隨機隨機訪問(RandomAccess),因為可能產生二次項的行為。

  • ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間

應用場景:

ArrayList使用在查詢比較多,但是插入和刪除比較少的情況,而LinkedList用在查詢比較少而插入刪除比較多的情況

各位看官還可以嗎?喜歡的話,動動手指點個,點個關注唄!!謝謝支持!

歡迎掃碼關注,原創技術文章第一時間推出

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

唐獎法治獎得主 為環境與大眾扮演守門人吹哨者

2{icon} {views}

摘錄自2020年9月21日中央社報導

唐獎教育基金會21日舉行「唐獎第四屆大師論壇-法治場」,由唐獎法治獎召集人葉俊榮主持,今年因疫情影響,邀請法治獎得主透過視訊分享。

2020年唐獎法治獎得主由位於孟加拉的孟加拉環境法律人協會(BELA)、位於哥倫比亞的實現正義:法律、正義暨社會中心(Dejusticia: The Center forLaw, Justice and Society)、位於黎巴嫩的法律實踐進程組織(The Legal Agenda)等3個非政府組織共同獲得。

 孟加拉環境法律人協會執行長Syeda RizwanaHasan表示,孟加拉面臨空氣品質惡化、森林遭砍伐、河川污染嚴重等環境問題;為了讓民眾瞭解環境正義,協會透過社會宣導,提高民眾對環境保護重要性的認識,並扮演守門人角色,如監督政府要求環境影響評估、食品安全等。

Rizwana提到,非政府組織有時卻會被政府扣上反對發展等莫須有罪名,或被限制集會結社或言論自由,加上經費欠缺、未做好治理工作等內部挑戰,很難吸引或留住好人才;非政府組織扮演公正客觀角色,動員民眾力量來達到永續發展目標,政府應該移除會影響非政府組織運作的障礙,讓組織發揮真正的力量。

法律實踐進程組織創始成員Samer Ghamroun分享,黎巴嫩欠缺真正獨立的司法單位,司法體系受政治或宗教團體干預,因此組織扮演吹哨者角色進行監督,避免權貴人士關說等不當行為積非成是,並將蒐集的資訊與民眾分享,讓大家瞭解司法部門的運作。

為推動司法改革,Samer表示,組織進行廣泛研究,透過雜誌、網站、社群媒體來帶動社會討論,同時也提出法律草案或建議,為弱勢群體爭取權益;但在推動過程中受到司法界很多阻力,加上社會環境影響,法律系學生寧願投身私人企業,卻不願進入非政府組織幫弱勢團體發聲,這都是組織面臨的挑戰。

「實現正義:法律、正義暨社會中心」創始人之一的Rodrigo Uprimny Yepes表示,組織目標是成為學術界和社會行動主義的橋梁,透過融合學術研究,進而擬定和參與公共政策,爭取法治自由的概念,藉此反對歧視和不平等,以實現社會正義。

「實現正義:法律、正義暨社會中心」執行長VivianNewman Pont舉例,哥倫比亞2016年簽署和平進程協定,結束政府與左翼革命武裝力量的內部衝突,組織透過研究發表論述和建議,幫助這段曲折漫長的和平轉型之路。

Rodrigo提到,他們所處社會歧視和貧窮問題嚴重,必須爭取法治自由的概念,反對歧視和不平等,但致力於推動社會正義的非政府組織常被污名化,造成許多理念無法自由傳播,弱勢團體無法獲妥善保障,因此組織也致力於促進民主程序,希望立場不同的團體能共同協商,縮小經濟上的不平等,避免社會分裂。

根據唐獎網站,三個團體的主要貢獻如下:

孟加拉環境法律人協會 (Bangladesh Environmental Lawyers Association) 由 Mohiuddin Farooque 博士於1992年創立,致力於提倡環境正義與法治。該協會是孟加拉最有影響力的環境團體,目前在國內六個城市有設點,並積極參與全球環境正義的維護。面對其國內嚴重的環境污染與貪腐不法,此協會透過公益訴訟、立法倡議、研究出版與公眾意識培養等方法,提倡環境正義與法治。自1994年孟加拉國內第一個成功的公益訴訟,Dr. Mohiuddin Farooque v. Bangladesh & Others (1994) ,該協會已成功提出超過300個環境公益訴訟與多項立法提議。協會所處理過的議題涵蓋了河流污染、工業污染、非法開發、勞工權益、非法採礦、塑膠使用、濕地保護與船舶拆解等面向。

藉由對憲法的創新詮釋,孟加拉環境法律人協會成功突破孟加拉法院過去的解釋,創立公益團體進行訴訟的路徑。其創舉建立了該國後續社會運動者的訴訟基礎,也促成國內法院將環境權納入憲法保障生存權的範圍內。更重要的是,該協會持續為環境與弱勢發聲,挑戰政府的不法。孟加拉環境法律人協會的研究出版與訓練課程,也使許多社區、團體與個人更有環境意識與維護環境的能力。該協會在環境公益訴訟的持續著力,使其得以持續監督環境法律的執行。不僅改善自身國家的法律體系,也對於全球的法治與環境正義有重大貢獻。

實現正義:法律、正義暨社會中心(Dejusticia: The Center for Law, Justice and Society)創立於 2005 年,是設在哥倫比亞的學術研究及社會議題倡議組織,經由持續發起行動、出版文宣及提起訴訟的形式,作出莫大貢獻。身處在一個充滿血腥動盪的過去且社會問題叢生的國度,作為非政府組織,實現正義: 法律、正義暨社會中心堅信學術工作能夠貢獻於社會正義並帶動改革。

實現正義:法律、正義暨社會中心採取獨特的「兩棲」作業模式,將紮實的學術研究與充滿動能的社會運動有效地相結合來處理人權議題。事實上,該組織成員多為人權、憲法及轉型正義的頂尖學者。這些學者們亦有相當多的論著產出,並且都在國內外的知名大學內任教。

在擁有如此學術研究加持的背景下,中心亦著重於透過法律訴訟來強化法治,特別是涉及諸多敏感議題,包含反對(種族及性別)歧視、原住民權利、難民權利、轉型正義及環境惡化的指標案件中,向哥倫比亞國內法院及拉丁美洲國際法律平台,提起訴訟並獲得勝訴。以此,國家體制更加能夠確保眾人皆能享有人權的保障,同時亦能維護環境正義。實現正義: 法律、正義暨社會中心透過教育、公共論辯及國際合作的方式,在賦予弱勢邊緣族群權利並疾呼此類族群的需求能夠被聽見的倡議上,亦是引領在前。因此,促使在地社群和公民參與間有著更加良善的互動循環,進而在哥倫比亞國內以及諸多全球南方國家推動改革。

法律實踐進程組織(The Legal Agenda)自 2009 年創立,即致力透過結合多重專業領域的方式,成功強化了黎巴嫩國內的司法獨立及法治。其中包括了針對司法部門的研究及監督、協助成立法官社團以強化法官的獨立於政治影響力以外、草擬支持司法獨立之法案及尋求相關之聲援,並倡議關於支持司法獨立跟各式社會議題的論辯。

以此,法律實踐進程組織針對弱勢族群,樹立多項關鍵的權利保障及賦予權利的關鍵判決,保護包括針對移工、難民、女同性戀者、男同性戀者、雙性戀者與跨性別者(LGBT)、被強迫失蹤受害者之家屬等群體。為普及法律知識,確保訴訟中當事人的武器平等,法律實踐進程組織也發展辯護範例模式,提供前述弱勢族群法律辯護之指引。除了在黎巴嫩國內為相關倡議之先驅外,法律實踐進程組織也不斷拓展其服務至阿拉伯世界其他國家,並已在突尼西亞成立分支辦公室。

國際新聞
孟加拉
哥倫比亞
黎巴嫩
環境正義
唐獎
永續發展

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

30萬預算購車 買它既顯品味又有內涵

2{icon} {views}

而全系標配的超大全景天窗,無疑為這個舒適的座艙增添了更溫馨浪漫的氣氛。除了對前排照顧有佳,TLX-L的“L”則是為後排乘客帶去的福利。它2900mm的超長軸距,為打造寬敞高自由度的後排打下基礎。而坐在後排的乘客,不僅能夠同樣享受到全景天窗帶來的通透,車輛還專門設有後排中央扶手多功能設計,讓乘客可以控制多媒體系統。

現時社會賦予了我們太多標籤,對於購車人群亦是如此,開着寶馬的土豪、偏向商務的奧迪、以及BOSS們鍾愛的奔馳……但對新生代活力精英人群來說,他們最害怕被標籤定格,被條條框框束縛,若是不想隨大流地選購BBA車型,有什麼能滿足他們內心的訴求?

這輛謳歌TLX-L或許能夠做到。

謳歌型動美學 TLX-L魅力綻放

首先,它有着年輕人喜愛的容顏,不從眾的設計,讓它在茫茫車海中犹如璀璨明星,耀眼閃亮。

5個菱形透鏡勾勒了Jewel-Eye,銳利的LED大燈讓它眼神堅定,凝視前方並洞察一切。

鑽石五邊形前格柵內部,如星芒般發散造型的中網充滿了視覺衝擊力。

優雅的舒展的身線,配合上2900mm超長軸距,矯健身姿一覽無遺。

動感精緻的車尾讓人充滿無限遐想,夜間看見這樣的尾燈,你一定有衝動想去繞到前頭一睹其真容。

豪華並運動是TLX-L的調性,尾部的擾流板是謳歌對駕控的追求。

以舒適詮釋豪華

在謳歌TLX-L動感犀利的外觀下,實際隱藏了溫柔體貼的一面。TLX-L的座艙在設計上不會讓人第一眼就感到驚艷,但許多優秀的細節整合在一起,卻營造了一個無比舒適的車內空間。

TLX-L的方向盤手感很棒,握感厚實,而且方向盤上帶有許多科技功能的按鍵,值得一提的是,這個級別車型罕見的方向盤加熱,TLX-L也沒有落下。

寬大且填充飽滿的座椅是保證舒適的第一要素,在TLX-L上,座椅既滿足了長途駕駛時乘坐不易產生疲勞,又保證了激烈操控下讓駕駛員能專心去應對路況。

而全系標配的超大全景天窗,無疑為這個舒適的座艙增添了更溫馨浪漫的氣氛。

除了對前排照顧有佳,TLX-L的“L”則是為後排乘客帶去的福利。它2900mm的超長軸距,為打造寬敞高自由度的後排打下基礎。

而坐在後排的乘客,不僅能夠同樣享受到全景天窗帶來的通透,車輛還專門設有後排中央扶手多功能設計,讓乘客可以控制多媒體系統。

源於格萊美獎獲得者ELLIOT SCHEINER傾心所創的ELS錄音室監聽級音響系統,配合上全車四門的雙層玻璃和ANC主動降噪系統,為車內提供了一個靜謐優雅的空間,音樂開啟,TLX-L儼然化身一個移動試聽室。

運動才是年輕人的最愛

謳歌還是一個專註運動的品牌,所以TLX-L身上不得不提的是其運動特質。除了極具動感的造型,TLX-L的內在也為運動做足了準備。

發動機罩下,是一具2.4L L4 DOHC i-VTEC高效能發動機,208ps的最大馬力與247N·m的最大扭矩是激情迸發的保證,而在發動機艙內,我們還能見到為了提供更高車身穩定和剛性所設的平衡桿。

與發動機匹配的是8DCT雙離合變速器,這是謳歌的黑科技之一,在雙離合變速器上串聯一個液力變矩器,讓車輛的動力響應不僅迅速而且更順暢。

TLX-L帶有IDS綜合動力模式選擇,在標準模式下,此刻的TLX-L舒適是主旋律。

而當把模式選在運動或運動+,TLX-L像立馬釋放出內心的猛獸般,變得激情洋溢且亢奮,迅捷的動力反饋和精準的轉向,讓駕駛TLX-L犹如駕駛一輛性能跑車爽快。

而說到轉向,又怎能不提謳歌為TLX-L裝備的另一大黑科技——pAWS四輪精準轉向系統。

它可精準操控四輪角度,任何路況下皆可暢享舒適、愉悅的駕駛感受。極致精準的操控性能,讓駕駛者能夠隨心所馭,馳騁天地。

車輛的兩個後輪會根據直行減速、轉向過彎以及高速變線等情況下,及時調整相位,以幫助更快更穩更准地完成以上動作。

總結

至此,你應該明白我為何向你推薦謳歌TLX-L。除了那些里裡外外吸引人的設計、配置外,TLX-L向我們展現了謳歌品牌的執着和追求,這種不從眾不隨行,活出真我,釋放內心的理念,相信正是當下年輕一代消費者們渴望的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

稱霸全球的頂級品牌都凉了,這些“老爺車”還能撐多久?

2{icon} {views}

入門級豪車價格下探,實施降維打擊手段侵佔非豪華品牌旗艦車型的市場份額。皇冠作為不掛牛頭標的豐田旗艦,早期是社會名流、商務政客座駕的不二之選。經典才是經典最大的桎梏,深諳於此的皇冠卻在換代時用力過猛、劍走偏鋒,走起了年輕運動路線。

要評选手機界的先驅,諾基亞、摩托拉羅、黑莓這批智能手機領域的尤達大師自然當仁不讓。一旦談及現狀,卻落寞得面面相覷。

諾基亞

二十一世紀初,手機王者諾基亞風靡全球、無人不曉。居安思危意識匱乏的諾基亞誤入坐食山空之路,直至2010年仍苦苦堅守塞班陣營。異軍突起的蘋果給諾基亞塞淺嘗輒止一擊,後者卻鄙夷不屑。

(諾基亞最新旗艦 Nokia 8 Sirocco)

曾以為的不朽,到如今的狼狽,不過眨眼間。2017年,由諾基亞原班老將組建的芬蘭公司HMD宣布推出首款安卓手機Nokia 6,諾基亞翻開歷史新篇章。

黑莓

作為曾經手機界的商務標杆、安全擔當,黑莓當年由於低估了生態效應以及蘋果的影響力,錯失了擁抱觸屏時代的契機,漸而沒落。

passport、priv、KEYone等放下身段的“後來者”也不見起色,黑莓業務方向開始往軟件調整。但仍舊期待黑莓下一款旗艦手機到來,並收入囊中。

摩托羅拉

“Hello MOTO”這句耳熟能詳的宣傳語,能否喚醒摩托羅拉在你腦海里僅存的憶記。在固話往移動電話過渡的時代,摩托羅拉無疑起到幕後推手的作用。

2014年底,聯想寄望複製收購IBM pC業務的奇迹,正式完成對摩托羅拉的收購。事與願違,依舊不景氣的摩托羅拉業務讓聯想急得抓耳撓腮。

低估後來者、革新派的影響力,錯失擁抱新時代契機,終嘗苦果。在眨眼間興,在眨眼間衰。手機數碼領域如此,偌大汽車疆域亦然。

與美國相隔一個太平洋,美式文化卻近在咫尺,諸如水果手機、星巴克咖啡、哈根達斯冰激凌,不勝枚舉。這個輪子上的國家,總願意為交通工具注入主觀色彩,頗具情懷的車型數不勝數,其中克萊斯勒300C值得一提。

“北京奔馳·戴克”一詞能否在你兒時回憶里蕩漾起漣漪?北京奔馳-戴姆勒·克萊斯勒汽車有限公司(BBDC)成立於2005年,前身是北京吉普汽車有限公司,是中國汽車行業第一家中外整車合資企業。

BBDC集團曾生產梅賽德斯-奔馳、克萊斯勒、Jeep、三菱等品牌車型,克萊斯勒 300c便是其中一員。

歷久彌新,克萊斯勒 300c終於在2015年迎來換新。素有“小賓利”之稱的克萊斯勒300c,端莊王室外觀相當唬人,三十萬裝幾百萬的逼。當婚車逼格完虐奧迪A6L、寶馬5系。然而質量堪憂、維修不便、品牌知名度低讓其保有量寥寥無幾。

隸屬FCA集團的克萊斯勒、阿爾法羅密歐,克萊斯勒 300c會否跟隨阿爾法羅密歐 Giulia腳步入華?有口皆碑的2.0T+8AT動力總成讓這個大膽猜想撥雲睹日。

自2012年BBA開展價格對壘,豐田皇冠、別克君越等價值不菲的縫隙產品,生存空間被進一步壓縮。前幾年汽車市場井噴現象步入冬眠期,汽車產能過剩,各車企紛紛以價格下探應對。入門級豪車價格下探,實施降維打擊手段侵佔非豪華品牌旗艦車型的市場份額。

皇冠作為不掛牛頭標的豐田旗艦,早期是社會名流、商務政客座駕的不二之選。經典才是經典最大的桎梏,深諳於此的皇冠卻在換代時用力過猛、劍走偏鋒,走起了年輕運動路線。

受眾面相對狹窄的外觀設計,讓不少潛在買家望而卻步。為了向年輕人靠攏,不料丟失原有市場,被中年大叔嗤之以鼻。而年輕人又覺得新皇冠的運動不夠極端的同時,還承襲了老款的官氣、油膩元素,最終落得個愛鶴失眾的下場。

無奈身處這浮躁的現實社會,現款皇冠未必能為你帶來生意項目,甚至流動攤販都不會因為你的鳴笛而給你讓道,還是乖乖將長得像六塊錢滷雞腿的排擋桿掛進“N”區域吧。

一汽豐田唯有靜待亞洲龍(與雷克薩斯ES 同平台打造)入華國產的項目實施,以“雷克薩斯技術下放,追求品質過剩”為打造前提的它,有望為豐田商務旗艦實力挽尊。

為二十萬價格區間內尾唯一的一款採用V6發動機和前置后驅布局平台的“約妹神車”,受冷清銷量掣肘,豐田銳志停產消息此起彼伏,最終於去年九月宣布停產。

其實早在銳志宣布停產前,一汽豐田已把2.5L普拉多、2.5L皇冠、蘭德酷路澤等相繼停產。不難理解,這系列車型排放不達標,加上國家對車企平均油耗限制的規定,“大”排量自吸引擎單獨驅動車型,紛紛駛向停產窘境。

隨着TNGA造車理念的革新、新能源車型的普及,生意人豐田章男絕不會讓一款雞肋車型對當前企業重心產生不良影響,不賺錢的項目終將“斃掉”。

新三年,舊三年,縫縫補補又三年。內飾拒絕與時俱進,賣了12年仍未更新動力總成。 底盤軟、轉向虛、波箱慢、優惠少,銳志的黯然退市在看來都是意料之中。基於豐田最新TNGA架構打造的繼任車型亞洲龍正在路上,將於2019年2月在華上市。

小車之王鈴木當年憑藉奧拓,在國內轎車市場縱橫捭闔。隨着人們生活水平提高,粗衣糲食、麥飯豆羹的生活一去不復返,消費升級讓當年紅極一時的奧拓、QQ等小車黯然失寵。

在小車與中、高端轎車間搖曳不定,導致曾經的小車之王鈴木在日系車企的並駕齊驅中掉隊。豐田、本田、日產、馬自達在華混得風生水起,這邊的鈴木卻陷水深火熱之中,定位模糊的三菱也踉踉蹌蹌。

在國內市場青松落色、備受冷落,甚至出現過2010年至2014年期間不推新車的頹勢,心灰意冷的鈴木開始轉戰印度市場的微型車、小型車市場。

早些年甚至還傳出鈴木退出中國汽車市場的消息,其處境之窘困可見一斑。如此看來,鈴木雨燕多年來不再更新迭代也不無道理,這與鈴木、中國市場的互不重視脫不開干係。

據悉,下定決心痛改前非的鈴木有望在今年完成雨燕在國內市場的首次跨越式換代。2016年,鈴木發布第六代Swift(日本市場第四代),軸距長達2450mm,出自HEARTECT輕量化平台。六邊形進氣格柵輔以頗具侵略性的前保險杠、懸浮式車頂,雨燕粉絲團再也坐不住!

曾經的手機王者諾基亞、商務標杆黑莓、輕奢手機摩托羅拉在手機領域縱橫捭闔、無人不曉,但缺乏居安思危意識和創新思維,導致它們走向沒落,最終淡出大眾視野。

(別低頭,皇冠會掉)

處境、走勢相似的上述車型,低保有量始終提醒着潛在用戶,掏腰包讓情懷落地,總需要那麼點勇氣。

了解更多汽車與手機的“曖昧關係”,點擊入內

文章鏈接:http://m.chemm.com/article/22745本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

一文讀懂Redis的四種模式,單機、主從、哨兵、集群

6{icon} {views}

少點代碼,多點頭髮

本文已經被GitHub收錄,歡迎大家踴躍star 和 issues。

https://github.com/midou-tech/articles

入職第一周,我被坑了

最近剛入職新公司,本來想着這剛來新公司,一般都是熟悉熟悉公司同事,看看組內工程文檔,找幾個demo自己練練手。

咳咳咳,萬萬沒想到啊,一切都是我以為的,我還是太了。

入職那天下午,組長給我丟了幾個文檔,讓我看下這個這些工程的緩存系統問題,讓我把redis升級為哨兵模式。

接到任務的我,內心是懵逼的。

第一、不知道都是些什麼類型的服務在用redis。

第二、不知道以什麼姿勢在用redis。

第三、如果redis掛了會不會影響用戶。

第四、我完全沒用過redis。

雖說沒幹過,但咋也不慫。畢竟要是天天干的都是干過的工作,那就是有問題了,很快就被優化掉了。

看來社招入職和校招還是不一樣的,校招進來都會有些入職培訓或者新人班課程。

通過這些形式的教育,第一、了解公司的文化、價值觀,第二、學習工作流程、感受公司技術氛圍。

任務

把我們部門所有使用redis服務升級到哨兵模式。

redis的多種模式

都說了升級到哨兵模式,那之前用的不是哨兵模式,肯定還有其他模式。

單機模式、主從模式、哨兵模式、集群模式

單機模式

這個最簡單,一看就懂。

就是安裝一個redis,啟動起來,業務調用即可。具體安裝步驟和啟動步驟就不贅述了,網上隨便搜一下就有了。

單機在很多場景也是有使用的,例如在一個並非必須保證高可用的情況下。

咳咳咳,其實我們的服務使用的就是redis單機模式,所以來了就讓我改為哨兵模式。

說說單機的優缺點吧。

優點:

  • 部署簡單,0成本。
  • 成本低,沒有備用節點,不需要其他的開支。
  • 高性能,單機不需要同步數據,數據天然一致性。

缺點:

  • 可靠性保證不是很好,單節點有宕機的風險。
  • 單機高性能受限於CPU的處理能力,redis是單線程的。

單機模式選擇需要根據自己的業務場景去選擇,如果需要很高的性能、可靠性,單機就不太合適了。

主從複製

主從複製,是指將一台Redis服務器的數據,複製到其他的Redis服務器。

前者稱為主節點(master),後者稱為從節點(slave);數據的複製是單向的,只能由主節點到從節點。

主從模式配置很簡單,只需要在從節點配置主節點的ip和端口號即可。

slaveof <masterip> <masterport>
# 例如
# slaveof 192.168.1.214 6379

啟動主從節點的所有服務,查看日誌即可以看到主從節點之間的服務連接。

從上面很容易就想到一個問題,既然主從複製,意味着master和slave的數據都是一樣的,有數據冗餘問題。

在程序設計上,為了高可用性和高性能,是允許有冗餘存在的。這點希望大家在設計系統的時候要考慮進去,不用為公司節省這一點資源。

對於追求極致用戶體驗的產品,是絕對不允許有宕機存在的。

主從模式在很多系統設計時都會考慮,一個master掛在多個slave節點,當master服務宕機,會選舉產生一個新的master節點,從而保證服務的高可用性。

主從模式的優點:

  • 一旦 主節點宕機,從節點 作為 主節點 的 備份 可以隨時頂上來。

  • 擴展 主節點讀能力,分擔主節點讀壓力。

  • 高可用基石:除了上述作用以外,主從複製還是哨兵模式和集群模式能夠實施的基礎,因此說主從複製是Redis高可用的基石。

也有相應的缺點,比如我剛提到的數據冗餘問題:

  • 一旦
    主節點宕機
    從節點 晉陞成
    主節點,同時需要修改
    應用方
    主節點地址,還需要命令所有
    從節點
    複製 新的主節點,整個過程需要
    人工干預
  • 主節點
    寫能力 受到
    單機的限制
  • 主節點
    存儲能力 受到
    單機的限制

哨兵模式

剛剛提到了,主從模式,當主節點宕機之後,從節點是可以作為主節點頂上來,繼續提供服務的。

但是有一個問題,主節點的IP已經變動了,此時應用服務還是拿着主節點的地址去訪問,這…

於是,在Redis 2.8版本開始引入,就有了哨兵這個概念。

複製的基礎上,哨兵實現了自動化的故障恢復。

如圖,哨兵節點由兩部分組成,哨兵節點和數據節點:

  • 哨兵節點:哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的redis節點,不存儲數據。
  • 數據節點:主節點和從節點都是數據節點。

訪問redis集群的數據都是通過哨兵集群的,哨兵監控整個redis集群。

一旦發現redis集群出現了問題,比如剛剛說的主節點掛了,從節點會頂上來。但是主節點地址變了,這時候應用服務無感知,也不用更改訪問地址,因為哨兵才是和應用服務做交互的。

Sentinel 很好的解決了故障轉移,在高可用方面又上升了一個台階,當然Sentinel還有其他功能。

比如 主節點存活檢測主從運行情況檢測主從切換

Redis的Sentinel最小配置是 一主一從

說下哨兵模式監控的原理

每個Sentinel以 每秒鐘 一次的頻率,向它所有主服務器從服務器 以及其他Sentinel實例 發送一個PING 命令。

如果一個 實例(instance)距離最後一次有效回復 PING命令的時間超過 down-after-milliseconds 所指定的值,那麼這個實例會被 Sentinel標記為 主觀下線

如果一個 主服務器 被標記為 主觀下線,那麼正在 監視 這個 主服務器 的所有 Sentinel 節點,要以 每秒一次 的頻率確認 該主服務器是否的確進入了 主觀下線 狀態。

如果一個 主服務器 被標記為 主觀下線,並且有 足夠數量 的 Sentinel(至少要達到配置文件指定的數量)在指定的 時間範圍 內同意這一判斷,那麼這個該主服務器被標記為 客觀下線

在一般情況下, 每個 Sentinel 會以每 10秒一次的頻率,向它已知的所有 主服務器 和 從服務器 發送 INFO 命令。

當一個 主服務器 被 Sentinel標記為 客觀下線 時,Sentinel 向 下線主服務器 的所有 從服務器 發送 INFO 命令的頻率,會從10秒一次改為 每秒一次。

Sentinel和其他 Sentinel 協商 主節點 的狀態,如果 主節點處於 SDOWN`狀態,則投票自動選出新的主節點。將剩餘的 從節點 指向 新的主節點 進行 數據複製

當沒有足夠數量的 Sentinel 同意 主服務器 下線時, 主服務器 的 客觀下線狀態 就會被移除。當 主服務器 重新向 Sentinel的PING命令返回 有效回復 時,主服務器 的 主觀下線狀態 就會被移除。

哨兵模式的優缺點

​ 優點:

  • 哨兵模式是基於主從模式的,所有主從的優點,哨兵模式都具有。
  • 主從可以自動切換,系統更健壯,可用性更高。
  • Sentinel 會不斷的檢查 主服務器 和 從服務器 是否正常運行。當被監控的某個 Redis 服務器出現問題,Sentinel 通過API腳本向管理員或者其他的應用程序發送通知。

​ 缺點:

  • Redis較難支持在線擴容,對於集群,容量達到上限時在線擴容會變得很複雜。

我的任務

我部署的redis服務就如上圖所示,三個哨兵節點,三個主從複製節點。

使用java的jedis去訪問我的redis服務,下面來一段簡單的演示代碼(並非工程裏面的代碼):

public static void testSentinel() throws Exception {
     //mastername從配置中獲取或者環境變量,這裏為了演示
         String masterName = "master";
         Set<String> sentinels = new HashSet<>();
     // sentinel的IP一般會從配置文件獲取或者環境變量,這裏為了演示
         sentinels.add("192.168.200,213:26379");
         sentinels.add("192.168.200.214:26380");
         sentinels.add("192.168.200.215:26381");
 
     //初始化過程做了很多工作
         JedisSentinelPool pool = new JedisSentinelPool(masterName, sentinels); 
     //獲取到redis的client
         Jedis jedis = pool.getResource();
     //寫值到redis
         jedis.set("key1", "value1");
     //讀取數據
     jedis.get("key1");
}

具體部署的配置文件這裏太長了,需要的朋友可以公眾號後台回復【redis配置】獲取。

聽起來是入職第二天就部署了任務感覺很難的樣子。

其實現在看來是個so easy的任務,申請一個redis集群,自己配置下。在把工程裏面使用到redis的地方改一下,之前使用的是一個兩個單機節點。

幹完,收工。

雖然領導的任務完成了,但並不意味着學習redis的路結束了。愛學習的龍叔,繼續研究了下redis的集群模式。

集群模式

主從不能解決故障自動恢復問題,哨兵已經可以解決故障自動恢復了,那到底為啥還要集群模式呢?

主從和哨兵都還有另外一些問題沒有解決,單個節點的存儲能力是有上限,訪問能力是有上限的。

Redis Cluster 集群模式具有 高可用可擴展性分佈式容錯 等特性。

Cluster 集群模式的原理

通過數據分片的方式來進行數據共享問題,同時提供數據複製和故障轉移功能。

之前的兩種模式數據都是在一個節點上的,單個節點存儲是存在上限的。集群模式就是把數據進行分片存儲,當一個分片數據達到上限的時候,就分成多個分片。

數據分片怎麼分?

集群的鍵空間被分割為16384個slots(即hash槽),通過hash的方式將數據分到不同的分片上的。

HASH_SLOT = CRC16(key) & 16384 

CRC16是一種循環校驗算法,這裏不是我們研究的重點,有興趣可以看看。

這裏用了位運算得到取模結果,位運算的速度高於取模運算。

有一個很重要的問題,為什麼是分割為16384個槽?這個問題可能會被面試官隨口一問

數據分片之後怎麼查,怎麼寫?

讀請求分配給slave節點,寫請求分配給master,數據同步從master到slave節點。

讀寫分離提高併發能力,增加高性能。

如何做到水平擴展?

master節點可以做擴充,數據遷移redis內部自動完成。

當你新增一個master節點,需要做數據遷移,redis服務不需要下線。

舉個栗子:上面的有三個master節點,意味着redis的槽被分為三個段,假設三段分別是0~7000,7001~12000、12001~16383。

現在因為業務需要新增了一個master節點,四個節點共同佔有16384個槽。

槽需要重新分配,數據也需要重新遷移,但是服務不需要下線。

redis集群的重新分片由redis內部的管理軟件redis-trib負責執行。redis提供了進行重新分片的所有命令,redis-trib通過向節點發送命令來進行重新分片。

如何做故障轉移?

假如途中紅色的節點故障了,此時master3下面的從節點會通過 選舉 產生一個主節點。替換原來的故障節點。

此過程和哨兵模式的故障轉移是一樣的。

總結

每種模式都有各自的優缺點,在實際使用場景中要根據業務特點去選擇合適的模式。

redis是一個非常常用的中間件,作為一個使用者來說,學習成本一點不高。

如果作為一個很好的中間件去研究的話,還是有很多值得學習和借鑒的地方。比如redis的各種數據結構(動態字符串、跳躍表、集合、字典等)、高效的內存分配(jemalloc)、高效的IO模型等等。

每個點都可以深入研究,在後期設計高併發、高可用系統的時候融入進去。

我是龍叔,一個分享互聯網技術和成長心路歷程的star。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

3.4秒破百,600匹馬力,這款4門轎車是你的菜嗎?

3{icon} {views}

米,匹配6MT變速箱。2005年,出自克里斯。班戈之手堪稱經典車型的四代M5正式上市,新車搭載一款具有507馬力,520牛。米的5。0L V8引擎,匹配的是6MT或7擋序列式的變速箱,百公里加速4。7秒。在底盤調校,制動系統,轉向手感等方面都進行了改進升級,但操控性較前代車型有所下降。

“開奔馳坐寶馬”這句話在汽車圈已流傳很久,奔馳寶馬也是很多人夢寐以求的座駕。其中以藍天白雲相間為車標的寶馬是一家以高級轎車為主導,飛機引擎等為輔的精英企業。由於誕生於德國的巴伐利亞州,也被稱之為“巴依爾”。

在今年的3月22日全新的轎跑寶馬M5正式在國內上市,作為寶馬燈塔級別的車型,全新系的M5以眾多的創新科技成為史上最強M5車型,同時也是BMW家族中速度最快的量產四門轎車。它的出現重新確立了高性能商務轎車的標準,也彰顯出了BMW作為汽車行業的領導者和創新引導者之一的強大的實力。

新M5在上市之前就已通過一系列的測試活動向世人展示了它非凡的實力,在17年12月12日,更是以2分22秒828的成績刷新上海國際賽車場四門量產轎車的最快單圈紀錄,給人留下的印象可謂是記憶猶深啊。

但是全新的M5已經是整個M5車系中的第六代車型,第一代車型誕生於上世紀的80年代,它誕生於有着“發動機巫師”之稱的保羅.羅斯克的手中,自此之後,秉承打破豪華與運動界限的中大型高性能轎車M5車系傳奇生涯開始了。

今天,就為大家扒一扒這款傳奇車型自誕生之日起的發展歷程以及其幾十年來的成就。

第一代的寶馬M5誕生於20世紀80年代,在1985年的阿姆斯特丹車展中正式發布,就外觀而言和普通5系車無區別,搭載的是一款3.6L的直列六缸發動機,最大馬力282匹;北美版車型採用的是代號為S38B35的發動機,最大馬力252匹,匹配的是5MT變速箱。由於第一代的產量僅為2191輛,稀少的存世量收穫不少收藏家的青睞。

第二代M5於1989年上市,外觀更為時尚化,車身尺寸及軸距有所加長,底盤調校偏軟,風阻係數為0.32。前期所用引擎與一代相同,後期改為3.8L發動機,匹配5MT或6MT的變速箱,最大馬力340匹,百公里加速6.1秒。3年後M5推出一款限量版旅行車型,僅891輛。

第三代M5和普通5系屬於共線生產,充滿時尚圓潤感的它於1998年在日內瓦車展正式亮相,它在机械裝備上進行了突破性改革,除了匹配擁有更強動力的4.9L V8引擎,還在後軸加裝了限滑差速器,和沉重的轉向手感配合,流暢的操控手感隨之而來。最大馬力400匹,峰值扭矩501牛.米,匹配6MT變速箱。

2005年,出自克里斯.班戈之手堪稱經典車型的四代M5正式上市,新車搭載一款具有507馬力,520牛.米的5.0L V8引擎,匹配的是6MT或7擋序列式的變速箱,百公里加速4.7秒。在底盤調校,制動系統,轉向手感等方面都進行了改進升級,但操控性較前代車型有所下降。兩年後,M5推出新一代的旅行版車型,並於當年就上市。

第五代M5於2011年在法蘭克福的車展上正式發布,造型在普通版5系車基礎上增加更運動的套件,配置配備了更多先進的电子科技。另外新車捨棄了自吸改用4.4LV8雙渦輪增壓引擎,雖然排量降低了,但在渦輪的助攻下,動力反而提升。最大馬力560匹,峰值扭矩680牛.米,匹配6MT或7DCT變速箱,百公里加速4.4秒。

第六代的寶馬M5於2017年正式上市,相比過去的幾代車型,外觀更為時尚運動,性能也得到加速提升。動力總成與前代車型一致,只不過經過重新調校動力輸出更為強勁,600匹馬力,峰值扭矩750牛.米,匹配的ZF的8AT變速箱,百公里加速時間也更快,僅為3.4秒。在技術上六代M5首次引入智能四驅系統,此系統擁有四驅、四驅運動和后驅三種運動模式,對全路況的駕駛需求均可無條件滿足,可以說這是BMW在M5車繫上展現的一項得意之作。

總結

經典的味道不曾逝去,一身武藝的寶馬M5深藏功與名,既低調奢華,又運動有內涵。論價格足以pK GTR,論加速3.4秒難逢敵手,聲浪更是撩人又迷人。相信出將入相的寶馬M5,值得每一個車迷們傾心。但是沒錢的,我決定了

本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

主打高科技、智能化,能否讓這個新興品牌一舉成功?

3{icon} {views}

而在行車過程中,車內搭載的生命感知系統可以通過面部、手勢識別監測生命體情況,尤其是對於駕駛員的疲勞監測,呵護車內乘員狀況並保證駕駛的安全性。(U5 ION用科技創造溫暖)除去在人工智能科技方面的突破創新之外,U5 ION最新一代的ESp車身穩定系統和iBooster智能化助力器,其傳感器、控制器、執行機構,以及整車的系統集成和測試,都達到了行業最新水平,可以實現高水平的L2級自動駕駛,並可以支撐L4級別的自動駕駛。

4月25日,首次登陸北京車展的愛馳汽車攜旗下首款電動SUV U5 ION在北京車展正式面向公眾亮相。對致力於重新定義人與車的關係、帶給消費者全新出行方式的愛馳汽車而言,此次參展亮相的U5 ION,正是愛馳汽車基於消費者考量,打造出的一款兼具溫度和創新科技的產品。

(愛馳汽車攜旗下首款高品質智能電動SUV U5 ION亮相北京車展)

用設計營造溫度,移動空間里的品質生活延續

在愛馳汽車北京車展新聞發布會上,愛馳汽車首席技術官王東晨表示:“汽車不應該只是冷冰冰的工業產品和出行工具,而是能夠讓消費者感知到溫度的出行伴侶,如同朋友一般。”作為愛馳汽車為全球年青人打造的高品質智能電動SUV,U5 ION在設計上充分考量到年輕人對汽車的實際需求,為消費者營造出舒適、溫暖的擁車體驗。

(愛馳汽車首席技術官王東晨介紹U5 ION亮點)

在外觀設計上,愛馳汽車將U5 ION打造為“陸地行走的太空艙”,前傾的A柱向後延續而形成的大弧度曲線車頂、雙色車身及懸浮式車頂處理打造的修長車身線條、富有張力卻保持曲面平滑的整體腰身等,以同級別最小的風阻係數實現年輕人對速度的追逐;而在內飾設計上,U5 ION宛如“天空之城”的設計,將超薄儀錶台、懸浮中控台、超薄座椅以及前後一體式門板設計構建出格外開闊的空間,真正把汽車空間歸還給“人”,而不是繁雜的配置按鍵。

(U5 ION用設計營造溫度)

與此同時,愛馳汽車還將諸多黑科技融入U5 ION,將更多生活化場景開創性地加入汽車空間中,迎賓座椅、消毒氛圍燈、AQIS智能空氣凈化系統、後排信息終端等設計,讓消費者在移動空間里,同樣可以享受品質生活。值得一提的是,U5 ION的內飾“潘多拉”眾創平台還為消費者提供靈活的內飾組合方案,給予用戶親身參与空間創新設計、定製的機會,從而打造出專屬自己的定製化內飾空間。

以人為核心,用科技創造溫暖

在發布會上,愛馳汽車聯合創始人兼總裁付強在闡述企業戰略時提出,愛馳汽車將在兩大核心技術領域實現領先與突破,其中之一便是代表未來智能網聯趨勢的人工智能科技。U5 ION作為愛馳汽車首款面向大眾的產品,更是搭載了愛馳汽車最新的人工智能技術研發成果,以“人”為原點,打造出從進入車輛到行車過程中的一系列智能化體驗,為消費者創造出溫暖的駕乘體驗。

(愛馳汽車聯合創始人兼總裁付強分享企業戰略)

據了解,U5 ION採用了愛馳汽車全新的進入方式,其搭載的毫秒級掌脈技術,可以通過掌脈識別的內生物識別技術,形成唯一的生物ID,消費者掃手即可打開車門。而在行車過程中,車內搭載的生命感知系統可以通過面部、手勢識別監測生命體情況,尤其是對於駕駛員的疲勞監測,呵護車內乘員狀況並保證駕駛的安全性。

(U5 ION用科技創造溫暖)

除去在人工智能科技方面的突破創新之外,U5 ION最新一代的ESp車身穩定系統和iBooster智能化助力器,其傳感器、控制器、執行機構,以及整車的系統集成和測試,都達到了行業最新水平,可以實現高水平的L2級自動駕駛,並可以支撐L4級別的自動駕駛。而行人交互系統、環境監測系統、电子攝像頭后視鏡構建的智能行車系統,以智能科技輔助駕駛員安全行車。與此同時,圍繞實時雲端互聯、人性化語音交互、智能汽車管家系統、車載社交分享打造的車聯網平台,更是滿足了駕乘者實現人與車、人與世界實時互聯的需求。

用品質守護溫暖,打造無憂駕駛體驗

伴隨着消費升級及產業轉型,消費者對於車輛的品質提出了更高的訴求,而這與愛馳汽車的造車理念不謀而合。基於MAS平台打造的U5 ION採用全球首創的上鋼下鋁結構設計,上車身大量使用的最高強度熱成型鋼,而下車身則採用7系航空鋁材,在保障安全性的同時,實現車身的輕量化。此外,在乘員艙的關鍵部位,U5 ION採用了全球首款2G納米超高強度鋼,關鍵部位採用全球領先的高壓鋁鑄件及航天級FDS/SpR冷連接工藝,使整車強度比傳統車身提高20%,從車身結構到應用材料,全方位保護行駛的安全性。

尤為重要的是,愛馳汽車自成立伊始便堅持自建工廠,並打造以数字化、信息化為平台的工業4.0智造工廠,實現量產產品的精益化、標準化生產,以嚴苛的標準、精細化匹配,保障產品品質。與此同時,愛馳汽車還擁有來自博世、西門子、喬治費歇爾、深蘭科技、四維圖新等世界級供應商的優越資源和技術合作,為研發、製造、產品提供了極高的品質保障,以“內”“外”雙重嚴苛標準,守護產品的高品質。

(愛馳汽車上饒製造基地全景)

作為愛馳汽車為全球年青人打造的高品質智能電動SUV,“U5 ION無論是造車技術、品質還是電動化、智能化創新,均處於行業前列”,愛馳汽車聯合創始人兼CEO谷峰表示:“我們團隊核心人員在傳統車企擁有深厚的汽車行業積澱,又能精確把握電動化、智能化時代的脈搏,從而實現突破和創新,U5 ION的誕生,是愛馳企業實力的最好展示”。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

緬甸那加族土地恐遭政府剝奪 原民傳統知識、輪耕文化陷危機

5{icon} {views}

環境資訊中心綜合外電;黃鈺婷 翻譯;林大利 審校;稿源:Mongabay

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

漢蘭達見到它都得認慫,這款大7座豪華SUV越看越霸氣

2{icon} {views}

雖然兩車都採用了四驅驅動,但RX8使用的是全時四驅,搭載了ALL-DRIVE智能全領域駕駛系統,共有自動、運動、兩驅、雪地、越野和低速四驅6種模式選擇。此外,RX8還採用了非承載式的車身設計,應對爛路時的抗扭強度更高。雙叉臂式的前懸設計,規格更為高級。

在過去很長一段時間中,7座大SUV的頭把交椅都被漢蘭達佔據着。但隨着一些自主中型SUV的加入,這個市場變得不再平靜。尤其是最近RX8的上市,更是將這種競爭帶到白熱化狀態。

儘管漢蘭達與RX8的價錢重合度不高,但是計劃買7座大SUV的人難免心裏會想自己是否有必要加多小10萬來買漢蘭達,又或者在價格接近下,是否應該選配置更多的RX8。針對這些問題,還是給大家來對比一下兩款車。

這次拿指導價為22.88萬的榮威RX8 2018款 30T 智聯網四驅至尊版與25.88萬的漢蘭達 2018款 2.0T 四驅精英版 7座進行對比。

外形上,RX8擁有面積更大的鍍鉻裝飾中網,比漢蘭達看起來要霸氣不少。都說大燈是汽車的眼睛,LED大燈顯得炯炯有神,亮度更高;相比之下,漢蘭達的鹵素大燈就黯淡了不少。同時,RX8的霧燈也採用了LED光源,造型獨特,亮度更高,更顯力量感。

側面來看,RX8的線條平直,力量感較強,五輻式輪圈大氣耐看。相比之下,漢蘭達的側面設計就較為平庸,沒什麼線條感,就像一個油膩的中年大叔。

RX8的尾部相比漢蘭達也更加有設計感,凹凸有致,鍍鉻雙出排氣口帶出了不錯的高級感。

內飾設計上,RX8延續了榮威品牌家族化橫向舒展的設計主題,既豪華又精緻。座艙採用環繞式設計,整體設計富有層次感。相比之下,漢蘭達的內飾布局會更為複雜,充斥着各種物理按鍵,少了幾分精緻感。

通過上圖已經能清楚地看到,RX8與漢蘭達的配置差距極為誇張,可謂一個天一個地。無論是在舒適性配置,還是在安全性配置上,RX8都有壓倒性的優勢,這也是自主品牌面對合資品牌的最大優勢。此外,榮威RX8搭載的全新一代互聯網汽車智能系統- 基於AliOS的斑馬智行解決方案,是漢蘭達不具備的。

動力上,RX8無論是最大馬力還是最大扭矩,均要優於漢蘭達,且兩款車型都是採用愛信6AT變速箱,在可靠性上是沒有太大問題。RX8發動機和變速箱均採用縱置布局,優化前後軸配重,提升底盤極限下的平衡性縱置動力。漢蘭達的動力輸出平順,沒什麼太多可挑刺的,在動力總成上的對比,兩車可謂不相伯仲。

雖然兩車都採用了四驅驅動,但RX8使用的是全時四驅,搭載了ALL-DRIVE智能全領域駕駛系統,共有自動、運動、兩驅、雪地、越野和低速四驅6種模式選擇。此外,RX8還採用了非承載式的車身設計,應對爛路時的抗扭強度更高。雙叉臂式的前懸設計,規格更為高級。

相比之下,漢蘭達的四驅系統就黯淡不少,僅僅是採用了適時四驅系統,有運動、節能和雪地3種模式可選。承載式的車身設計,在應對一些稍微惡劣的環境時不如RX8從容,麥弗遜式的前懸結構還是稍顯簡單。

一直以來,大家都覺得SUV的第三排只能應急使用。即便是像漢蘭達這樣的體型,它的第三排也是表現一般。不過得益於更大的車身尺寸,RX8的第三排乘客可以坐得更為體面。從上圖也能看到,RX8的第三排座椅可調幅度更大。

RX8的第三排座墊長度比漢蘭達的多了50mm,對腿部的承托更為充分。結合上面的視頻,不難發現RX8的第三排在乘坐體驗上比漢蘭達要好。前兩排的表現兩車都差不多,座椅填充物料柔軟,對身體的包裹也較為充足。

RX8的一二排

漢蘭達的一二排

經過上面的一輪對比,能看到在相同價格下,榮威RX8擁有更高的價值體驗。那麼同為2.0T頂配,RX8與漢蘭達相比又是否還有優勢呢?

上圖能清晰看到,即便2.0T漢蘭達頂配比RX8頂配多出了將近8萬塊,但在配置上依舊占不了太大的便宜。更何況,RX8的第三排空間還更大呢。

總結

過往自主品牌給人一種廉價的感覺,但經過這些年的發展,自主品牌早非吳下阿蒙。上汽貴為中國第一車企,本身就擁有強大的產品開發能力。榮威作為旗下最重要的自主品牌,也是時候向更高端的市場發起衝擊。

從榮威RX8所展現出來的產品力來看,確實相當強大。比產品力更重要的是外形設計,畢竟長安CS95就是前車之鑒,所以RX8的整體造型偏重於磅礴大氣,這也是它要成功的基本條件。

就目前來看,或許RX8與漢蘭達最大的差距就在於口碑。漢蘭達畢竟在中國深耕多年,累積了不少良好口碑。RX8雖然是一款新車型,但上汽榮威作為一線自主品牌,還是值得我們投下信任票。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

這3台中型SUV一出來,什麼奔馳寶馬統統得靠邊

18{icon} {views}

頂配的3。6T版本4。8 S的百公里加速性能更是令人折服。當然,300mm的涉水深度令人匪夷所思。而中控台上的空白按鍵時刻在提醒你:囊中羞澀以致某項配置未能選裝。此外,保時捷的售價就像你跟媽媽說晚上9點準時回家一樣不靠譜。

2018北京車展於4.25正式拉開帷幕,因工作關係得以參与這場人山人海的車界盛會。在車展上,除了各大傳統車企紛紛推出SUV新品外,諸多造車新勢力所亮相或展示的車型也是SUV為多,由此可見SUV的市場熱度一直未曾消減。

那些展出的SUV近乎都是:外觀愈發年輕、愈加運動“猙獰”,再難覓得一平庸之輩。若是將它們置於三五年前,必定都是明星車型。可在同質化異常嚴重的當下,已鮮有車型能在這股趨於一致的“年輕運動”的SUV洪流之中脫穎而出。

當然,也有例外。這幾款集情懷、血統、顏值、性能於一身的“尤物”備受青睞。

點評:一貫擅長打造英倫優雅紳士風的捷豹,強盛的藝術生命力在這款SUV上得以延續,俊朗精緻的外觀頗有幾分F-TYpE的神韻。年度風雲車、年度最佳設計等大獎便是對這走在時尚尖端寵兒的肯定。在老東家福特的EcoBoost 2.0T替換為自家的Ingenium 2.0T(2018沃德十佳發動機之一)后,性格變得愈加“狂豹”,低沉的聲浪時刻撩撥着駕駛者的慾望;早已滲透骨子里的獨特基因,令其在拐彎抹角的山間道路中犹如一隻飛馳的野豹。

點評:在卡宴身上嘗得SUV甜頭后,保時捷推出與老款Q5共享MLB平台(新款Q5L出自MLB EVO平台)的另一搖錢樹—Macan。萬年不變的青蛙臉令人百看不厭;跑車基因的加持,操控性能自然是無與倫比;頂配的3.6T版本4.8 S的百公里加速性能更是令人折服。當然,300mm的涉水深度令人匪夷所思;而中控台上的空白按鍵時刻在提醒你:囊中羞澀以致某項配置未能選裝。此外,保時捷的售價就像你跟媽媽說晚上9點準時回家一樣不靠譜。

點評:作為阿爾法羅密歐品牌百年歷史中第一款SUV產品,意大利人對藝術獨到的見解與對性能的痴迷在其身上得以極佳體現。精準的轉向、汽車愛好者極易上手的完美操控、恰到好處的零百以及超高的彎道極限令人愛不釋手。在北京車展上完成亞洲首秀的Stelvio QV版本更是紐北最快量產SUV圈速的記錄保持者。只是FCA的尿性,大家心照不宣,難怪有媒體朋友曾言:等我有錢了,就買它個兩台,一台修理一台開。

俗語言:逆水行舟,不進則退。在主流的市場里,品牌的差異性將變得越來越小,不論是國際品牌還是本土品牌。因此,“變通”是明智的生存之道。多數人認為保時捷、阿爾法羅密歐等豪華品牌推出SUV獲取更大市場份額意味着喪失了品牌的獨有特質。

但恰恰是這種“變通”,洞察出市場真正的需求點,才讓人看到更多好看的皮囊,感受到更多有趣的靈魂。畢竟只有存活下來,才能讓自身的基因得到延續。如果保時捷只生產跑車,捷豹只生產轎車,我們將錯過多少“尤物”呢?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心