日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java继承原理内存角度_Java基础知识巩固

發布時間:2023/12/9 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java继承原理内存角度_Java基础知识巩固 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近發現自己的Java基礎知識還是有點薄弱,剛好有點空閑時間進行再補一補,然后進行整理一下,方便自己以后復習。其實個人認為Java基礎還是很重要的,不管從事Java后端開發還是Android開發,Java這塊的基礎還是重中之重,可以多去學習一下Java各種類和數據結構的寫法,進行學習!

基礎

正確使用 equals 方法

盡量使用 "字符串".equals(變量)方法,推薦使用java.util.Objects#equals(JDK7 引入的工具類)

Objects.equals(null,"SnailClimb");// false

java.util.Objects#equals源碼:

public static boolean equals(Object a, Object b) {

// 可以避免空指針異常。如果a==null的話此時a.equals(b)就不會得到執行,避免出現空指針異常。

return (a == b) || (a != null && a.equals(b));

}

BigDecimal

浮點數之間的等值判斷,基本數據類型不能用==來比較,包裝數據類型不能用 equals 來判斷,會造成精度丟失問題,不要使用構造方法BigDecimal(double)方式吧double值轉化為BigDecimal對象,推薦使用BigDecimal(String)方法

使用使用 BigDecimal 來定義浮點數的值,再進行浮點數的運算操作。

BigDecimal a = new BigDecimal("1.0");

BigDecimal b = new BigDecimal("0.9");

BigDecimal c = new BigDecimal("0.8");

BigDecimal x = a.subtract(b);// 0.1

BigDecimal y = b.subtract(c);// 0.1

System.out.println(x.equals(y));// true

BigDecimal 的大小比較:

a.compareTo(b) : 返回 -1 表示小于,0 表示 等于, 1表示 大于。

BigDecimal a = new BigDecimal("1.0");

BigDecimal b = new BigDecimal("0.9");

System.out.println(a.compareTo(b));// 1

基本數據類型與包裝數據類型的使用標準

【強制】所有的 POJO 類屬性必須使用包裝數據類型。

【強制】RPC 方法的返回值和參數必須使用包裝數據類型。

【推薦】所有的局部變量使用基本數據類型。

Arrays.asList()使用指南

Arrays.asList()將數組轉換為集合后,底層其實還是數組,并沒有實現修改集合的方法,所以不能使用其修改集合的相關方法,add/remove/clear方法會拋出UnsupportedOperationException異常

傳遞的數組必須是對象數組,而不是基本類型(需要使用包裝數據類型)。

如何將數組轉換成ArrayList:

1.最簡便的方法(推薦)

List list = new ArrayList<>(Arrays.asList("a", "b", "c"))

2.使用 Java8 的Stream

Integer [] myArray = { 1, 2, 3 };

List myList = Arrays.stream(myArray).collect(Collectors.toList());

//基本類型也可以實現轉換(依賴boxed的裝箱操作)

int [] myArray2 = { 1, 2, 3 };

List myList = Arrays.stream(myArray2).boxed().collect(Collectors.toList());

Collection.toArray()方法使用的坑

該方法是一個泛型方法: T[] toArray(T[] a); 如果toArray方法中沒有傳遞任何參數的話返回的是Object類型數組。

String [] s= new String[]{

"dog", "lazy", "a", "over", "jumps", "fox", "brown", "quick", "A"

};

List list = Arrays.asList(s);

Collections.reverse(list);

s=list.toArray(new String[0]);//沒有指定類型的話會報錯

// new String[0]起一個模板的作用,指定了返回數組的類型,0是為了節省空間,因為它只是為了說明返回的類型

不要在 foreach 循環里進行元素的 remove/add 操作

remove元素使用Iterator方式,如果是并發操作,需要對Itreator對象加鎖。foreach循環會拋出ConcurrentModificationException異常

String StringBuffer 和 StringBuilder 的區別是什么? String 為什么是不可變的?

可變性

String 類中使用 final 關鍵字修飾字符數組來保存字符串 private final char value[]所以 String 對象是不可變的.而StringBuilder 與 StringBuffer 都繼承自 AbstractStringBuilder 類,在 AbstractStringBuilder 中也是使用字符數組保存字符串char[]value 但是沒有用 final 關鍵字修飾

線程安全性

String 中的對象是不可變的,也就可以理解為常量,線程安全。StringBuffer 對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。StringBuilder 并沒有對方法進行加同步鎖,所以是非線程安全的。

性能

每次對 String 類型進行改變的時候,都會生成一個新的 String 對象,然后將指針指向新的 String 對象。StringBuffer 每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象并改變對象引用。

對于三者使用的總結:

操作少量的數據: 適用String

單線程操作字符串緩沖區下操作大量數據: 適用StringBuilder

多線程操作字符串緩沖區下操作大量數據: 適用StringBuffer

在 Java 中定義一個不做事且沒有參數的構造方法的作用

Java 程序在執行子類的構造方法之前,如果沒有用 super() 來調用父類特定的構造方法,則會調用父類中“沒有參數的構造方法”。因此,如果父類中只定義了有參數的構造方法,而在子類的構造方法中又沒有用 super() 來調用父類中特定的構造方法,則編譯時將發生錯誤,因為 Java 程序在父類中找不到沒有參數的構造方法可供執行。解決辦法是在父類里加上一個不做事且沒有參數的構造方法。

接口和抽象類的區別

接口的方法默認是 public,所有方法在接口中不能有實現(Java 8 開始接口方法可以有默認實現),而抽象類可以有非抽象的方法。

接口中除了static、final變量,不能有其他變量,而抽象類中則不一定。

一個類可以實現多個接口,但只能繼承一個抽象類。接口自己本身可以通過extends關鍵字擴展多個接口。

接口方法默認修飾符是public,抽象方法可以有public、protected和default這些修飾符(抽象方法就是為了被重寫所以不能使用private關鍵字修飾!)。

從設計層面來說,抽象是對類的抽象,是一種模板設計,而接口是對行為的抽象,是一種行為的規范。

構造方法的特性

名字與類名相同。

沒有返回值,但不能用void聲明構造函數。

生成類的對象時自動執行,無需調用。

== 與 equals(重要)

== : 它的作用是判斷兩個對象的地址是不是相等。即,判斷兩個對象是不是同一個對象(基本數據類型==比較的是值,引用數據類型==比較的是內存地址)。

equals() : 它的作用也是判斷兩個對象是否相等。但它一般有兩種使用情況:

情況1:類沒有覆蓋 equals() 方法。則通過 equals() 比較該類的兩個對象時,等價于通過“==”比較這兩個對象。

情況2:類覆蓋了 equals() 方法。一般,我們都覆蓋 equals() 方法來比較兩個對象的內容是否相等;若它們的內容相等,則返回 true (即,認為這兩個對象相等)。

hashCode 與 equals (重要)

hashCode() 的作用就是獲取哈希碼,也稱為散列碼;它實際上是返回一個int整數。這個哈希碼的作用是確定該對象在哈希表中的索引位置。hashCode() 在散列表中才有用,在其它情況下沒用。在散列表中hashCode() 的作用是獲取對象的散列碼,進而確定該對象在散列表中的位置。

hashCode()與equals()的相關規定

如果兩個對象相等,則hashcode一定也是相同的

兩個對象相等,對兩個對象分別調用equals方法都返回true

兩個對象有相同的hashcode值,它們也不一定是相等的

因此,equals 方法被覆蓋過,則 hashCode 方法也必須被覆蓋

hashCode() 的默認行為是對堆上的對象產生獨特值。如果沒有重寫 hashCode(),則該 class 的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數據)

Java異常處理

try 塊:用于捕獲異常。其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。

catch 塊:用于處理try捕獲到的異常。

finally 塊:無論是否捕獲或處理異常,finally塊里的語句都會被執行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行。

在以下4種特殊情況下,finally塊不會被執行:

在finally語句塊第一行發生了異常。 因為在其他行,finally塊還是會得到執行

在前面的代碼中用了System.exit(int)已退出程序。 exit是帶參函數 ;若該語句在異常語句之后,finally會執行

程序所在的線程死亡。

關閉CPU。

當try語句和finally語句中都有return語句時,在方法返回之前,finally語句的內容將被執行,并且finally語句的返回值將會覆蓋原始的返回值。

Java序列化中如果有些字段不想進行序列化,如何做

對于不想進行序列化的變量,使用transient關鍵字修飾。

transient關鍵字的作用是:阻止實例中那些用此關鍵字修飾的的變量序列化;當對象被反序列化時,被transient修飾的變量值不會被持久化和恢復。transient只能修飾變量,不能修飾類和方法。

Java 中只有值傳遞

Java程序設計語言總是采用按值調用。方法得到的是所有參數值的一個拷貝,即方法不能修改傳遞給它的任何參數變量的內容。

一個方法不能修改一個基本數據類型的參數(即數值型或布爾型)。

一個方法可以改變一個對象參數的狀態。

一個方法不能讓對象參數引用一個新的對象。

容器

List,Set,Map三者的區別

List(對付順序的好幫手): List接口存儲一組不唯一(可以有多個元素引用相同的對象),有序的對象

Set(注重獨一無二的性質): 不允許重復的集合。不會有多個元素引用相同的對象。

Map(用Key來搜索的專家): 使用鍵值對存儲。Map會維護與Key有關聯的值。兩個Key可以引用相同的對象,但Key不能重復,典型的Key是String類型,但也可以是任何對象。

Arraylist 與 LinkedList 區別

是否保證線程安全:ArrayList 和LinkedList 都是不同步的,也就是不保證線程安全;

底層數據結構: Arraylist 底層使用的是** Object 數組;LinkedList 底層使用的是雙向鏈表**數據結構(JDK1.6之前為循環鏈表,JDK1.7取消了循環。注意雙向鏈表和雙向循環鏈表的區別)

插入和刪除是否受元素位置的影響:① ArrayList 采用數組存儲,所以插入和刪除元素的時間復雜度受元素位置的影響。 比如:執行add(E e) 方法的時候, ArrayList 會默認在將指定的元素追加到此列表的末尾,這種情況時間復雜度就是O(1)。但是如果要在指定位置 i 插入和刪除元素的話(add(int index, E element) )時間復雜度就為 O(n-i)。因為在進行上述操作的時候集合中第 i 和第 i 個元素之后的(n-i)個元素都要執行向后位/向前移一位的操作。 ② LinkedList 采用鏈表存儲,所以插入,刪除元素時間復雜度不受元素位置的影響,都是近似 O(1)而數組為近似 O(n)。

4.是否支持快速隨機訪問:LinkedList 不支持高效的隨機元素訪問,而 ArrayList 支持。快速隨機訪問就是通過元素的序號快速獲取元素對象(對應于get(int index) 方法)。

內存空間占用:ArrayList的空間浪費主要體現在在list列表的結尾會預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗比ArrayList更多的空間(因為要存放直接后繼和直接前驅以及數據)。

RandomAccess接口

RandomAccess 接口中什么都沒有定義,標識實現這個接口的類具有隨機訪問功能(知識標識,沒有具體作用)。

在 binarySearch()方法中,它要判斷傳入的list 是否 RamdomAccess 的實例,如果是,調用indexedBinarySearch()方法,如果不是,那么調用iteratorBinarySearch()方法

實現了 RandomAccess 接口的list,優先選擇普通 for 循環 ,其次 foreach,

未實現 RandomAccess接口的list,優先選擇iterator遍歷(foreach遍歷底層也是通過iterator實現的,),大size的數據,千萬不要使用普通for循環

ArrayList 與 Vector 的區別,為什么要用Arraylist取代Vector

Vector類的所有方法都是同步的。可以由兩個線程安全地訪問一個Vector對象、但是一個線程訪問Vector的話代碼要在同步操作上耗費大量的時間。

Arraylist不是同步的,所以在不需要保證線程安全時建議使用Arraylist

通過ArrayList 源碼探索其擴容機制

ArrayList有三種方式來初始化,構造方法源碼如下:

/**

* 默認初始容量大小

*/

private static final int DEFAULT_CAPACITY = 10;

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

/**

*默認構造函數,使用初始容量10構造一個空列表(無參數構造)

*/

public ArrayList() {

this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

/**

* 帶初始容量參數的構造函數。(用戶自己指定容量)

*/

public ArrayList(int initialCapacity) {

if (initialCapacity > 0) {//初始容量大于0

//創建initialCapacity大小的數組

this.elementData = new Object[initialCapacity];

} else if (initialCapacity == 0) {//初始容量等于0

//創建空數組

this.elementData = EMPTY_ELEMENTDATA;

} else {//初始容量小于0,拋出異常

throw new IllegalArgumentException("Illegal Capacity: "+

initialCapacity);

}

}

/**

*構造包含指定collection元素的列表,這些元素利用該集合的迭代器按順序返回

*如果指定的集合為null,throws NullPointerException。

*/

public ArrayList(Collection extends E> c) {

elementData = c.toArray();

if ((size = elementData.length) != 0) {

// c.toArray might (incorrectly) not return Object[] (see 6260652)

if (elementData.getClass() != Object[].class)

elementData = Arrays.copyOf(elementData, size, Object[].class);

} else {

// replace with empty array.

this.elementData = EMPTY_ELEMENTDATA;

}

}

以無參數構造方法創建 ArrayList 時,實際上初始化賦值的是一個空數組。當真正對數組進行添加元素操作時,才真正分配容量。即向數組中添加第一個元素時,數組容量擴為10。

add 方法

/**

* 將指定的元素追加到此列表的末尾。

*/

public boolean add(E e) {

//添加元素之前,先調用ensureCapacityInternal方法

ensureCapacityInternal(size + 1); // Increments modCount!!

//這里看到ArrayList添加元素的實質就相當于為數組賦值

elementData[size++] = e;

return true;

}

ensureCapacityInternal() 方法

//得到最小擴容量

private void ensureCapacityInternal(int minCapacity) {

if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {

// 獲取默認的容量和傳入參數的較大值

minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);

}

ensureExplicitCapacity(minCapacity);

}

當 要 add 進第1個元素時,minCapacity為1,在Math.max()方法比較后,minCapacity 為10。

ensureExplicitCapacity() 方法

//判斷是否需要擴容

private void ensureExplicitCapacity(int minCapacity) {

modCount++;

// overflow-conscious code

if (minCapacity - elementData.length > 0)

//調用grow方法進行擴容,調用此方法代表已經開始擴容了

grow(minCapacity);

}

grow() 方法

/**

* 要分配的最大數組大小

*/

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

/**

* ArrayList擴容的核心方法。

*/

private void grow(int minCapacity) {

// oldCapacity為舊容量,newCapacity為新容量

int oldCapacity = elementData.length;

//將oldCapacity 右移一位,其效果相當于oldCapacity /2,

//我們知道位運算的速度遠遠快于整除運算,整句運算式的結果就是將新容量更新為舊容量的1.5倍,

int newCapacity = oldCapacity + (oldCapacity >> 1);

//然后檢查新容量是否大于最小需要容量,若還是小于最小需要容量,那么就把最小需要容量當作數組的新容量,

if (newCapacity - minCapacity < 0)

newCapacity = minCapacity;

// 如果新容量大于 MAX_ARRAY_SIZE,進入(執行) `hugeCapacity()` 方法來比較 minCapacity 和 MAX_ARRAY_SIZE,

//如果minCapacity大于最大容量,則新容量則為`Integer.MAX_VALUE`,否則,新容量大小則為 MAX_ARRAY_SIZE 即為 `Integer.MAX_VALUE - 8`。

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);

}

hugeCapacity() 方法。

private static int hugeCapacity(int minCapacity) {

if (minCapacity < 0) // overflow

throw new OutOfMemoryError();

//對minCapacity和MAX_ARRAY_SIZE進行比較

//若minCapacity大,將Integer.MAX_VALUE作為新數組的大小

//若MAX_ARRAY_SIZE大,將MAX_ARRAY_SIZE作為新數組的大小

//MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

return (minCapacity > MAX_ARRAY_SIZE) ?

Integer.MAX_VALUE :

MAX_ARRAY_SIZE;

}

java 中的 length 屬性針對數組,比如說你聲明了一個數組,想知道這個數組的長度則用到了 length 這個屬性.

java 中的 length() 方法針對字符串,如果想看這個字符串的長度則用到 length() 這個方法.

java 中的 size()方法針對泛型集合,如果想看這個泛型有多少個元素,就調用此方法來查看.

ArrayList源碼中的ensureCapacity方法

最好在 add 大量元素之前用 ensureCapacity 方法,以減少增量重新分配的次數

/**

如有必要,增加此 ArrayList 實例的容量,以確保它至少可以容納由minimum capacity參數指定的元素數。

*

* @param minCapacity 所需的最小容量

*/

public void ensureCapacity(int minCapacity) {

int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)

// any size if not default element table

? 0

// larger than default for default empty table. It's already

// supposed to be at default size.

: DEFAULT_CAPACITY;

if (minCapacity > minExpand) {

ensureExplicitCapacity(minCapacity);

}

}

HashMap 和 Hashtable 的區別

線程是否安全: HashMap 是非線程安全的,HashTable 是線程安全的;HashTable 內部的方法基本都經過synchronized 修飾(要保證線程安全的話就使用 ConcurrentHashMap);

效率:因為線程安全的問題,HashMap 要比 HashTable 效率高一點。另外,HashTable 基本被淘汰,不要在代碼中使用它;

對Null key 和Null value的支持:HashMap 中,null 可以作為鍵,這樣的鍵只有一個,可以有一個或多個鍵所對應的值為 null。但是在 HashTable 中 put 進的鍵值只要有一個 null,直接拋出NullPointerException。

初始容量大小和每次擴充容量大小的不同 : ①創建時如果不指定容量初始值,Hashtable 默認的初始大小為11,之后每次擴充,容量變為原來的2n+1。HashMap 默認的初始化大小為16。之后每次擴充,容量變為原來的2倍。②創建時如果給定了容量初始值,那么 Hashtable 會直接使用你給定的大小,而 HashMap 會將其擴充為2的冪次方大小(HashMap 中的tableSizeFor()方法保證)。也就是說 HashMap 總是使用2的冪作為哈希表的大小。

底層數據結構: JDK1.8 以后的 HashMap 在解決哈希沖突時有了較大的變化,當鏈表長度大于閾值(默認為8)時,將鏈表轉化為紅黑樹,以減少搜索時間。Hashtable 沒有這樣的機制。

HasMap 中帶有初始容量的構造函數:

public HashMap(int initialCapacity, float loadFactor) {

if (initialCapacity < 0)

throw new IllegalArgumentException("Illegal initial capacity: " +

initialCapacity);

if (initialCapacity > MAXIMUM_CAPACITY)

initialCapacity = MAXIMUM_CAPACITY;

if (loadFactor <= 0 || Float.isNaN(loadFactor))

throw new IllegalArgumentException("Illegal load factor: " +

loadFactor);

this.loadFactor = loadFactor;

this.threshold = tableSizeFor(initialCapacity);

}

tableSizeFor方法保證了 HashMap 總是使用2的冪作為哈希表的大小。

/**

* Returns a power of two size for the given target capacity.

*/

static final int tableSizeFor(int cap) {

int n = cap - 1;

n |= n >>> 1;

n |= n >>> 2;

n |= n >>> 4;

n |= n >>> 8;

n |= n >>> 16;

return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;

}

集合框架底層數據結構總結

List

Arraylist: Object數組

Vector: Object數組

LinkedList: 雙向鏈表(JDK1.6之前為循環鏈表,JDK1.7取消了循環)

Set

HashSet(無序,唯一): 基于 HashMap 實現的,底層采用 HashMap 來保存元素

LinkedHashSet: LinkedHashSet 繼承與 HashSet,并且其內部是通過 LinkedHashMap 來實現的。

TreeSet(有序,唯一): 紅黑樹(自平衡的排序二叉樹。)

Map

HashMap: JDK1.8之前HashMap由數組+鏈表組成的,數組是HashMap的主體,鏈表則是主要為了解決哈希沖突而存在的(“拉鏈法”解決沖突)。JDK1.8以后在解決哈希沖突時有了較大的變化,當鏈表長度大于閾值(默認為8)時,將鏈表轉化為紅黑樹,以減少搜索時間

LinkedHashMap: LinkedHashMap 繼承自 HashMap,所以它的底層仍然是基于拉鏈式散列結構即由數組和鏈表或紅黑樹組成。另外,LinkedHashMap 在上面結構的基礎上,增加了一條雙向鏈表,使得上面的結構可以保持鍵值對的插入順序。同時通過對鏈表進行相應的操作,實現了訪問順序相關邏輯。詳細可以查看:《LinkedHashMap 源碼詳細分析(JDK1.8)》

Hashtable: 數組+鏈表組成的,數組是 HashMap 的主體,鏈表則是主要為了解決哈希沖突而存在的

TreeMap: 紅黑樹(自平衡的排序二叉樹)

并發

synchronized 關鍵字

synchronized關鍵字解決的是多個線程之間訪問資源的同步性,synchronized關鍵字可以保證被它修飾的方法或者代碼塊在任意時刻只能有一個線程執行。

synchronized關鍵字最主要的三種使用方式:

修飾實例方法: 作用于當前對象實例加鎖,進入同步代碼前要獲得當前對象實例的鎖

修飾靜態方法: :也就是給當前類加鎖,會作用于類的所有對象實例。訪問靜態 synchronized 方法占用的鎖是當前類的鎖,而訪問非靜態 synchronized 方法占用的鎖是當前實例對象鎖。

修飾代碼塊: 指定加鎖對象,對給定對象加鎖,進入同步代碼庫前要獲得給定對象的鎖。

總結: synchronized 關鍵字加到 static 靜態方法和 synchronized(class)代碼塊上都是是給 Class 類上鎖。synchronized 關鍵字加到實例方法上是給對象實例上鎖。盡量不要使用 synchronized(String a) 因為JVM中,字符串常量池具有緩存功能!

雙重校驗鎖實現對象單例(線程安全)

public class Singleton {

private volatile static Singleton instance;

private Singleton() {

}

public static Singleton getInstance() {

//先判斷對象是否已經實例過,沒有實例化過才進入加鎖代碼

if (instance== null) {

//類對象加鎖

synchronized (Singleton.class) {

if (instance== null) {

instance= new Singleton();

}

}

}

return instance;

}

}

instance采用 volatile 關鍵字修飾也是很有必要的, instance= new Singleton(); 這段代碼其實是分為三步執行:

為 instance分配內存空間

初始化 instance

將 instance指向分配的內存地址

但是由于 JVM 具有指令重排的特性,執行順序有可能變成 1->3->2。指令重排在單線程環境下不會出先問題,但是在多線程環境下會導致一個線程獲得還沒有初始化的實例。例如,線程 T1 執行了 1 和 3,此時 T2 調用 getInstance() 后發現 instance不為空,因此返回 instance,但此時 instance還未被初始化。

使用 volatile 可以禁止 JVM 的指令重排,保證在多線程環境下也能正常運行。

synchronized 關鍵字和 volatile 關鍵字的區別

volatile關鍵字是線程同步的輕量級實現,所以volatile性能肯定比synchronized關鍵字要好。但是volatile關鍵字只能用于變量而synchronized關鍵字可以修飾方法以及代碼塊。synchronized關鍵字在JavaSE1.6之后進行了主要包括為了減少獲得鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖以及其它各種優化之后執行效率有了顯著提升,實際開發中使用 synchronized 關鍵字的場景還是更多一些。

多線程訪問volatile關鍵字不會發生阻塞,而synchronized關鍵字可能會發生阻塞

volatile關鍵字能保證數據的可見性,但不能保證數據的原子性。synchronized關鍵字兩者都能保證。

volatile關鍵字主要用于解決變量在多個線程之間的可見性,而 synchronized關鍵字解決的是多個線程之間訪問資源的同步性。

ThreadLocal

通常情況下,我們創建的變量是可以被任何一個線程訪問并修改的。如果想實現每一個線程都有自己的專屬本地變量該如何解決呢? JDK中提供的ThreadLocal類正是為了解決這樣的問題。 ThreadLocal類主要解決的就是讓每個線程綁定自己的值,可以將ThreadLocal類形象的比喻成存放數據的盒子,盒子中可以存儲每個線程的私有數據。

如果你創建了一個ThreadLocal變量,那么訪問這個變量的每個線程都會有這個變量的本地副本,這也是ThreadLocal變量名的由來。他們可以使用 get() 和 set() 方法來獲取默認值或將其值更改為當前線程所存的副本的值,從而避免了線程安全問題。

ThreadLocal原理

Thread 類中有一個 threadLocals 和 一個 inheritableThreadLocals 變量,它們都是 ThreadLocalMap 類型的變量,我們可以把 ThreadLocalMap 理解為ThreadLocal 類實現的定制化的 HashMap。默認情況下這兩個變量都是null,只有當前線程調用 ThreadLocal 類的 set或get方法時才創建它們,實際上調用這兩個方法的時候,我們調用的是ThreadLocalMap類對應的 get()、set()方法。

ThreadLocal類的set()方法

public void set(T value) {

Thread t = Thread.currentThread();

ThreadLocalMap map = getMap(t);

if (map != null)

map.set(this, value);

else

createMap(t, value);

}

ThreadLocalMap getMap(Thread t) {

return t.threadLocals;

}

最終的變量是放在了當前線程的 ThreadLocalMap 中,并不是存在 ThreadLocal 上,ThreadLocal 可以理解為只是ThreadLocalMap的封裝,傳遞了變量值。 ThrealLocal 類中可以通過Thread.currentThread()獲取到當前線程對象后,直接通過getMap(Thread t)可以訪問到該線程的ThreadLocalMap對象。

每個Thread中都具備一個ThreadLocalMap,而ThreadLocalMap可以存儲以ThreadLocal為key的鍵值對。 比如我們在同一個線程中聲明了兩個 ThreadLocal 對象的話,會使用 Thread內部都是使用僅有那個ThreadLocalMap 存放數據的,ThreadLocalMap的 key 就是 ThreadLocal對象,value 就是 ThreadLocal 對象調用set方法設置的值。ThreadLocal 是 map結構是為了讓每個線程可以關聯多個 ThreadLocal變量。這也就解釋了 ThreadLocal 聲明的變量為什么在每一個線程都有自己的專屬本地變量。

ThreadLocalMap是ThreadLocal的靜態內部類。

ThreadLocal 內存泄露問題

ThreadLocalMap 中使用的 key 為 ThreadLocal 的弱引用,而 value 是強引用。所以,如果 ThreadLocal 沒有被外部強引用的情況下,在垃圾回收的時候會 key 會被清理掉,而 value 不會被清理掉。這樣一來,ThreadLocalMap 中就會出現key為null的Entry。假如我們不做任何措施的話,value 永遠無法被GC 回收,這個時候就可能會產生內存泄露。ThreadLocalMap實現中已經考慮了這種情況,在調用 set()、get()、remove() 方法的時候,會清理掉 key 為 null 的記錄。使用完 ThreadLocal方法后 最好手動調用remove()方法

線程池

線程池提供了一種限制和管理資源(包括執行一個任務)。 每個線程池還維護一些基本統計信息,例如已完成任務的數量。

使用線程池的好處:

降低資源消耗。 通過重復利用已創建的線程降低線程創建和銷毀造成的消耗。

提高響應速度。 當任務到達時,任務可以不需要的等到線程創建就能立即執行。

提高線程的可管理性。 線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控。

實現Runnable接口和Callable接口的區別

如果想讓線程池執行任務的話需要實現的Runnable接口或Callable接口。 Runnable接口或Callable接口實現類都可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor執行。兩者的區別在于 Runnable 接口不會返回結果但是 Callable 接口可以返回結果。

備注: 工具類Executors可以實現Runnable對象和Callable對象之間的相互轉換。(Executors.callable(Runnable task)或Executors.callable(Runnable task,Object resule))。

執行execute()方法和submit()方法的區別

1)execute() 方法用于提交不需要返回值的任務,所以無法判斷任務是否被線程池執行成功與否;

2)submit() 方法用于提交需要返回值的任務。線程池會返回一個Future類型的對象,通過這個Future對象可以判斷任務是否執行成功,并且可以通過future的get()方法來獲取返回值,get()方法會阻塞當前線程直到任務完成,而使用 get(long timeout,TimeUnit unit)方法則會阻塞當前線程一段時間后立即返回,這時候有可能任務沒有執行完。

如何創建線程池

《阿里巴巴Java開發手冊》中強制線程池不允許使用 Executors 去創建,而是通過 ThreadPoolExecutor 的方式,這樣的處理方式能更加明確線程池的運行規則,規避資源耗盡的風險

Executors 返回線程池對象的弊端如下:

FixedThreadPool 和 SingleThreadExecutor : 允許請求的隊列長度為 Integer.MAX_VALUE ,可能堆積大量的請求,從而導致OOM。

CachedThreadPool 和 ScheduledThreadPool : 允許創建的線程數量為 Integer.MAX_VALUE ,可能會創建大量線程,從而導致OOM。

方式一:通過構造方法實現

通過構造方法實現.png

方式二:通過Executor 框架的工具類Executors來實現 我們可以創建三種類型的ThreadPoolExecutor:

FixedThreadPool : 該方法返回一個固定線程數量的線程池。該線程池中的線程數量始終不變。當有一個新的任務提交時,線程池中若有空閑線程,則立即執行。若沒有,則新的任務會被暫存在一個任務隊列中,待有線程空閑時,便處理在任務隊列中的任務。

SingleThreadExecutor: 方法返回一個只有一個線程的線程池。若多余一個任務被提交到該線程池,任務會被保存在一個任務隊列中,待線程空閑,按先入先出的順序執行隊列中的任務。

CachedThreadPool: 該方法返回一個可根據實際情況調整線程數量的線程池。線程池的線程數量不確定,但若有空閑線程可以復用,則會優先使用可復用的線程。若所有線程均在工作,又有新的任務提交,則會創建新的線程處理任務。所有線程在當前任務執行完畢后,將返回線程池進行復用。

對應Executors工具類中的方法如圖所示:

進程和線程

進程

進程是程序的一次執行過程,是系統運行程序的基本單位,因此進程是動態的。系統運行一個程序即是一個進程從創建,運行到消亡的過程。

在 Java 中,當我們啟動 main 函數時其實就是啟動了一個 JVM 的進程,而 main 函數所在的線程就是這個進程中的一個線程,也稱主線程。

線程

線程與進程相似,但線程是一個比進程更小的執行單位。一個進程在其執行的過程中可以產生多個線程。與進程不同的是同類的多個線程共享進程的堆和方法區資源,但每個線程有自己的程序計數器、虛擬機棧和本地方法棧,所以系統在產生一個線程,或是在各個線程之間作切換工作時,負擔要比進程小得多,也正因為如此,線程也被稱為輕量級進程。

線程與進程的關系,區別及優缺點

從 JVM 角度說進程和線程之間的關系

一個進程中可以有多個線程,多個線程共享進程的堆和方法區 (JDK1.8 之后的元空間)資源,但是每個線程有自己的程序計數器、虛擬機棧 和 本地方法棧。

總結: 線程是進程劃分成的更小的運行單位。線程和進程最大的不同在于基本上各進程是獨立的,而各線程則不一定,因為同一進程中的線程極有可能會相互影響。線程執行開銷小,但不利于資源的管理和保護;而進程正相反

程序計數器、虛擬機棧和本地方法棧是線程私有的,堆和方法區是線程共享的

程序計數器為什么是私有的?

程序計數器主要有下面兩個作用:

字節碼解釋器通過改變程序計數器來依次讀取指令,從而實現代碼的流程控制,如:順序執行、選擇、循環、異常處理。

在多線程的情況下,程序計數器用于記錄當前線程執行的位置,從而當線程被切換回來的時候能夠知道該線程上次運行到哪兒了。

需要注意的是,如果執行的是 native 方法,那么程序計數器記錄的是 undefined 地址,只有執行的是 Java 代碼時程序計數器記錄的才是下一條指令的地址。

所以,程序計數器私有主要是為了線程切換后能恢復到正確的執行位置。

虛擬機棧和本地方法棧為什么是私有的?

虛擬機棧: 每個 Java 方法在執行的同時會創建一個棧幀用于存儲局部變量表、操作數棧、常量池引用等信息。從方法調用直至執行完成的過程,就對應著一個棧幀在 Java 虛擬機棧中入棧和出棧的過程。

本地方法棧: 和虛擬機棧所發揮的作用非常相似,區別是: 虛擬機棧為虛擬機執行 Java 方法 (也就是字節碼)服務,而本地方法棧則為虛擬機使用到的 Native 方法服務。 在 HotSpot 虛擬機中和 Java 虛擬機棧合二為一。

所以,為了保證線程中的局部變量不被別的線程訪問到,虛擬機棧和本地方法棧是線程私有的。

堆和方法區

堆和方法區是所有線程共享的資源,其中堆是進程中最大的一塊內存,主要用于存放新創建的對象 (所有對象都在這里分配內存),方法區主要用于存放已被加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。

并發與并行的區別

并發: 同一時間段,多個任務都在執行 (單位時間內不一定同時執行);

并行: 單位時間內,多個任務同時執行。

為什么要使用多線程

先從總體上來說:

從計算機底層來說: 線程可以比作是輕量級的進程,是程序執行的最小單位,線程間的切換和調度的成本遠遠小于進程。另外,多核 CPU 時代意味著多個線程可以同時運行,這減少了線程上下文切換的開銷。

從當代互聯網發展趨勢來說: 現在的系統動不動就要求百萬級甚至千萬級的并發量,而多線程并發編程正是開發高并發系統的基礎,利用好多線程機制可以大大提高系統整體的并發能力以及性能。

使用多線程可能帶來什么問題?

并發編程的目的就是為了能提高程序的執行效率提高程序運行速度,但是并發編程并不總是能提高程序運行速度的,而且并發編程可能會遇到很多問題,比如:內存泄漏、上下文切換、死鎖還有受限于硬件和軟件的資源閑置問題。

線程的生命周期和狀態

Java 線程在運行的生命周期中的指定時刻只可能處于下面 6 種不同狀態的其中一個狀態

Java 線程的狀態

線程在生命周期中并不是固定處于某一個狀態而是隨著代碼的執行在不同狀態之間切換。

Java 線程狀態變遷

由上圖可以看出:線程創建之后它將處于 NEW(新建) 狀態,調用 start() 方法后開始運行,線程這時候處于 READY(可運行) 狀態。可運行狀態的線程獲得了 CPU 時間片(timeslice)后就處于 RUNNING(運行) 狀態。

操作系統隱藏 Java 虛擬機(JVM)中的 RUNNABLE 和 RUNNING 狀態,它只能看到 RUNNABLE 狀態所以 Java 系統一般將這兩個狀態統稱為 RUNNABLE(運行中) 狀態 。

當線程執行 wait()方法之后,線程進入 WAITING(等待) 狀態。進入等待狀態的線程需要依靠其他線程的通知才能夠返回到運行狀態,而 TIME_WAITING(超時等待) 狀態相當于在等待狀態的基礎上增加了超時限制,比如通過 sleep(long millis)方法或 wait(long millis)方法可以將 Java 線程置于 TIMED WAITING 狀態。當超時時間到達后 Java 線程將會返回到 RUNNABLE 狀態。當線程調用同步方法時,在沒有獲取到鎖的情況下,線程將會進入到 BLOCKED(阻塞) 狀態。線程在執行 Runnable 的run()方法之后將會進入到 TERMINATED(終止) 狀態。

什么是上下文切換

多線程編程中一般線程的個數都大于 CPU 核心的個數,而一個 CPU 核心在任意時刻只能被一個線程使用,為了讓這些線程都能得到有效執行,CPU 采取的策略是為每個線程分配時間片并輪轉的形式。當一個線程的時間片用完的時候就會重新處于就緒狀態讓給其他線程使用,這個過程就屬于一次上下文切換。

概括來說就是:當前任務在執行完 CPU 時間片切換到另一個任務之前會先保存自己的狀態,以便下次再切換會這個任務時,可以再加載這個任務的狀態。任務從保存到再加載的過程就是一次上下文切換。

什么是線程死鎖?如何避免死鎖?

認識線程死鎖

多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止。

如下圖所示,線程 A 持有資源 2,線程 B 持有資源 1,他們同時都想申請對方的資源,所以這兩個線程就會互相等待而進入死鎖狀態。

線程死鎖示意圖

產生死鎖必須具備以下四個條件:

互斥條件:該資源任意一個時刻只由一個線程占用。

請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

不剝奪條件:線程已獲得的資源在末使用完之前不能被其他線程強行剝奪,只有自己使用完畢后才釋放資源。

循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。

如何避免線程死鎖

只要破壞產生死鎖的四個條件中的其中一個就可以了。

破壞互斥條件

這個條件我們沒有辦法破壞,因為我們用鎖本來就是想讓他們互斥的(臨界資源需要互斥訪問)。

破壞請求與保持條件

一次性申請所有的資源。

破壞不剝奪條件

占用部分資源的線程進一步申請其他資源時,如果申請不到,可以主動釋放它占有的資源。

破壞循環等待條件

靠按序申請資源來預防。按某一順序申請資源,釋放資源則反序釋放。破壞循環等待條件。

sleep() 方法和 wait() 方法區別和共同點

兩者最主要的區別在于:sleep 方法沒有釋放鎖,而 wait 方法釋放了鎖 。

兩者都可以暫停線程的執行。

Wait 通常被用于線程間交互/通信,sleep 通常被用于暫停執行。

wait() 方法被調用后,線程不會自動蘇醒,需要別的線程調用同一個對象上的 notify() 或者 notifyAll() 方法。sleep() 方法執行完成后,線程會自動蘇醒。或者可以使用wait(long timeout)超時后線程會自動蘇醒。

我們調用 start() 方法時會執行 run() 方法,為什么我們不能直接調用 run() 方法?

new 一個 Thread,線程進入了新建狀態;調用 start() 方法,會啟動一個線程并使線程進入了就緒狀態,當分配到時間片后就可以開始運行了。 start() 會執行線程的相應準備工作,然后自動執行 run() 方法的內容,這是真正的多線程工作。 而直接執行 run() 方法,會把 run 方法當成一個 main 線程下的普通方法去執行,并不會在某個線程中執行它,所以這并不是多線程工作。

總結: 調用 start 方法方可啟動線程并使線程進入就緒狀態,而 run 方法只是 thread 的一個普通方法調用,還是在主線程里執行。

final,static,this,super 關鍵字總結

final 關鍵字

final關鍵字主要用在三個地方:變量、方法、類。

對于一個final變量,如果是基本數據類型的變量,則其數值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。

當用final修飾一個類時,表明這個類不能被繼承。final類中的所有成員方法都會被隱式地指定為final方法。

使用final方法的原因:把方法鎖定,以防任何繼承類修改它的含義

static 關鍵字

static 關鍵字主要有以下四種使用場景:

修飾成員變量和成員方法: 被 static 修飾的成員屬于類,不屬于單個這個類的某個對象,被類中所有對象共享,靜態變量 存放在 Java 內存區域的方法區。靜態方法不能調用非靜態方法和非靜態成員變量。靜態變量 存放在 Java 內存區域的方法區。

靜態代碼塊:代碼執行順序(靜態代碼塊 —>非靜態代碼 —>構造方法) 該類不管創建多少對象,靜態代碼塊只執行一次.

靜態內部類(只能修飾內部類):它的創建是不需要依賴外圍類的創建。不能使用任何外圍類的非static成員變量和方法。

靜態導包

this 關鍵字

this關鍵字用于引用類的當前實例,代表對本類對象的引用,指向本類對象

super 關鍵字

super關鍵字用于從子類訪問父類的變量和方法, 代表對父類對象的引用,指向父類對象

使用 this 和 super 要注意的問題:

在構造器中使用 super() 調用父類中的其他構造方法時,該語句必須處于構造器的首行,否則編譯器會報錯。另外,this 調用本類中的其他構造方法時,也要放在首行。

this、super不能用在static方法中。

總結

以上是生活随笔為你收集整理的java继承原理内存角度_Java基础知识巩固的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

成人在线观看影院 | 操操色| 国产中文在线字幕 | 国产第一页在线播放 | 97超碰在线久草超碰在线观看 | 精品久久久久久一区二区里番 | 91毛片在线 | 麻豆国产视频下载 | 国产精品 日韩 | 中文字幕在线国产 | 亚洲va综合va国产va中文 | 久要激情网 | 樱空桃av | 久久av福利 | 国产精品成人自产拍在线观看 | 亚洲成人动漫在线观看 | 国产亚洲在线视频 | 九九热久久久 | 日本激情动作片免费看 | 中文字幕中文字幕在线中文字幕三区 | 中文字幕 国产视频 | 欧美福利视频一区 | 午夜久久久久久久久久久 | 日韩欧美在线第一页 | 国产免费视频在线 | 最近日本韩国中文字幕 | 国内亚洲精品 | 天天干天天在线 | 日韩欧美一区二区三区视频 | 少妇视频一区 | 一区在线免费观看 | 免费看片黄色 | 精品在线不卡 | 天堂av官网 | 免费欧美精品 | 五月婷婷色 | 91九色最新地址 | 久久久在线观看 | 成年人在线观看视频免费 | 永久免费的av电影 | www.久久久com| 久久久久久久久久电影 | 亚洲精品玖玖玖av在线看 | 久久久男人的天堂 | 国产免费区 | 日韩av黄| 亚洲精品视频免费观看 | 国产在线不卡一区 | 色综合久久久久综合体 | 久久成人麻豆午夜电影 | 婷婷亚洲激情 | 欧美午夜精品久久久久久孕妇 | 日本xxxx.com | 91麻豆精品一区二区三区 | 久久精品福利视频 | 亚洲区视频在线 | 精品国自产在线观看 | 911香蕉视频 | 黄色毛片电影 | 国产成人99av超碰超爽 | 狠狠色婷婷丁香六月 | 免费观看久久久 | 91网免费观看 | 亚洲精品视频在线 | 97偷拍视频 | 日韩三级视频在线观看 | 久草资源在线 | 97在线精品视频 | 国产福利91精品一区二区三区 | 免费看三片 | 黄色网大全 | 国产精品中文字幕在线 | 日韩系列| 美女黄频免费 | 国产人在线成免费视频 | 久草精品视频在线看网站免费 | 最近中文字幕免费大全 | 国产中文字幕网 | 欧美成人精品在线 | 特级a老妇做爰全过程 | 亚洲一级黄色大片 | 91麻豆精品国产91久久久无需广告 | 精品国产精品久久一区免费式 | av在线观| 日韩欧美在线一区 | 日韩 在线 | 日韩免费一区二区 | 国产专区在线播放 | 成人影音在线 | 黄色福利网 | 久草视频在线观 | 中文免费观看 | 人人看人人做人人澡 | 狠狠伊人 | 久久黄色精品视频 | 中文字幕在线观看第一页 | 激情影音| 国产精品第一页在线观看 | 国产中文在线视频 | 成人午夜在线电影 | 久久夜色精品国产欧美乱 | 成人a大片| 精品视频在线免费 | 亚洲精品无 | 激情开心 | 黄色在线免费观看网址 | 日本丰满少妇免费一区 | 日韩.com| 国内精品久久影院 | www久久久| 国产精品九九九 | 人人天天夜夜 | 欧美成亚洲| 久久在线电影 | 色综合久久88色综合天天免费 | 青青河边草免费观看 | 99re久久资源最新地址 | 国产精品videossex国产高清 | 国产精品一区二区久久精品爱微奶 | 国产黄色大全 | 日韩欧美大片免费观看 | 国产一级视频在线 | 久久久久在线视频 | 中文字幕资源在线 | 在线电影中文字幕 | www.国产在线| 久久国产一区二区三区 | 日韩理论片 | 久久一区二 | 亚洲国产黄色片 | 在线观看日韩精品 | 色天天综合久久久久综合片 | 激情影院在线观看 | 国产一区二区在线免费 | 婷婷视频在线观看 | 成人91在线观看 | 精品国产一区二区三区四 | 天堂av最新网址 | 国产精品久久久久久妇 | 天天草天天草 | 中文字幕免费高清在线 | 在线观看国产 | 99久久久久久 | 久久一区二区三区超碰国产精品 | 国产精品av免费在线观看 | 久草在线中文888 | 免费在线观看日韩 | 国产亚洲婷婷免费 | 成人在线免费小视频 | 久久草在线视频国产 | 日韩在线视频不卡 | 国内精品一区二区 | 在线午夜 | 国产色a在线观看 | 国产一级视频 | 欧美久久久久久久久中文字幕 | 国产精品毛片一区视频播不卡 | 国产精品女人网站 | 久久精品日产第一区二区三区乱码 | 中文字幕在线看视频国产中文版 | 中文字幕av全部资源www中文字幕在线观看 | 不卡的av中文字幕 | 激情五月婷婷综合 | 欧美在线a视频 | 久久免费视频精品 | 久久这里只有精品视频99 | 国产手机视频在线播放 | 国产又粗又长的视频 | 草久在线观看视频 | 日韩免费电影在线观看 | av在线免费不卡 | 亚洲在线视频免费观看 | 成人免费在线观看入口 | 欧美黄在线 | 成年人在线观看视频免费 | 久久99精品国产99久久6尤 | 91精品久久久久久综合乱菊 | 日日干夜夜草 | 天天综合色天天综合 | 国产精品麻豆免费版 | 日韩欧美一区二区在线 | 天天操天天摸天天干 | 久久av免费 | 综合网婷婷| 欧洲亚洲激情 | 国产 视频 高清 免费 | 成人av电影免费观看 | 99久久久久久国产精品 | 国产亚洲成人网 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 日韩一级电影在线观看 | 91精品在线免费观看 | 久久久精品欧美一区二区免费 | 天天色官网 | 国产91成人| 天天操天天爱天天爽 | 日韩三级.com | 免费福利片2019潦草影视午夜 | 天天操人人要 | 国产在线无 | 黄色成人小视频 | 成人av电影在线播放 | 亚洲精品乱码久久久久久写真 | 国产精品一区二区三区四 | 色av资源网| 国产亚洲精品久久久久久 | 极品嫩模被强到高潮呻吟91 | 日本精品视频在线观看 | 国产精品麻豆一区二区三区 | 亚洲综合色丁香婷婷六月图片 | 狠狠狠狠狠狠狠 | 欧美在线观看视频一区二区三区 | 日韩激情在线 | 九九在线播放 | 日韩在线免费看 | 91xav | 丁香婷婷自拍 | 国产精品麻豆免费版 | 97在线视 | 美女禁18| 丝袜美女在线 | 伊人六月 | 国产中文字幕一区 | 不卡视频在线看 | 麻豆成人小视频 | 久久黄页 | 色在线免费 | 中文乱码视频在线观看 | 黄色成人av| 国产麻豆剧果冻传媒视频播放量 | 亚洲成人网av | 欧美性大战久久久久 | 亚洲天天综合 | 91porny九色91啦中文 | 天天天天色综合 | 69xxxx欧美| 亚洲成人av在线电影 | 亚洲综合色网站 | 成人中文字幕+乱码+中文字幕 | 国产馆在线播放 | 久久精品伊人 | 国产精品久久久久影院日本 | 国产日韩欧美中文 | 国产99久久久精品 | 国产精品久久久久久久久久东京 | 亚洲精品视频网址 | 成年人免费看的视频 | av在线电影免费观看 | 婷婷丁香色 | 一区二区丝袜 | 免费情趣视频 | 精品国产一区二区三区日日嗨 | 亚洲va在线va天堂 | 在线激情av电影 | 天天操天天干天天摸 | 久久久久色 | 麻豆成人网 | 欧美一级片在线播放 | 91视频a| 国产一区 在线播放 | 久久夜视频| 国产一级片网站 | 国产99在线免费 | 国产涩图 | 黄色片视频免费 | 99久久久久久久久久 | 国产精品12345 | 亚洲免费视频观看 | 中文字幕av播放 | 00av视频| 香蕉影视在线观看 | 狠狠成人| 欧美一区中文字幕 | 黄在线免费观看 | 青青草在久久免费久久免费 | 在线观看久 | 国产精品日韩在线观看 | 久久久久久久久久久久国产精品 | 成人av电影在线观看 | 国产xxxxx在线观看 | 欧美日本啪啪无遮挡网站 | 91免费看黄色 | 欧美精品在线观看一区 | 欧美小视频在线 | 97天天干 | www日韩精品 | 精品亚洲国产视频 | 亚洲九九九在线观看 | 亚洲国产三级在线 | 国产麻豆剧传媒免费观看 | 中文字幕一区二区三区久久蜜桃 | www.香蕉视频在线观看 | 在线天堂日本 | 波多野结衣电影一区二区三区 | 久草精品网 | 午夜影视一区 | 亚洲资源一区 | 国产专区免费 | 国产五月色婷婷六月丁香视频 | 91av视屏| 久久久久久看片 | 99中文视频在线 | 蜜臀久久99精品久久久久久网站 | 成人a免费看 | 日韩激情免费视频 | 五月天久久久久 | 夜夜夜夜爽| 五月婷婷免费 | 99精品区 | 国产中文字幕视频在线观看 | 亚洲国内在线 | 久久a热6 | 日韩欧美在线观看一区二区三区 | 久久婷婷影视 | 在线免费观看国产 | 在线观看免费av网站 | 亚洲欧美视频在线 | 国产精品美女久久久久久免费 | 奇人奇案qvod| 日韩大陆欧美高清视频区 | 免费麻豆视频 | 最新日韩在线 | 在线观看av免费 | 中文字幕91视频 | 欧美在线18 | 久久精品视频免费 | 国产精品久久久久久69 | 欧美va天堂va视频va在线 | 久久av在线播放 | 偷拍福利视频一区二区三区 | 玖玖玖在线 | 麻豆mv在线观看 | 日韩一级电影在线观看 | 亚洲国产中文字幕在线观看 | 欧美一级艳片视频免费观看 | 草久中文字幕 | www免费网站在线观看 | 在线成人免费电影 | 99热播精品| 国产精品久久久久永久免费看 | 国产视频 亚洲视频 | 国产69精品久久久久99尤 | 成人一级在线 | 久久免费国产 | 日韩伦理片一区二区三区 | 久久久久成 | 亚洲激情av | 91精品久久久久久综合乱菊 | 九九热免费视频在线观看 | 色多多视频在线 | 日韩av在线一区二区 | 免费观看一级 | 成人国产精品久久久久久亚洲 | 久久精品爱视频 | 在线观看精品视频 | av成人在线看 | 最近免费观看的电影完整版 | 特黄特色特刺激视频免费播放 | 久久亚洲福利视频 | 91视频-88av | 福利视频一区二区 | 88av网站| 91欧美国产 | 特级西西人体444是什么意思 | 日韩综合一区二区 | 国产尤物视频在线 | 日韩av在线高清 | 亚洲精品自拍视频在线观看 | 色香蕉在线视频 | 久久精品视频网址 | 亚洲欧美国产精品 | 国内视频在线 | 99在线观看精品 | 久久伊人色综合 | 欧美日产在线观看 | 丁香电影小说免费视频观看 | 精品国产免费观看 | 日日干网 | 青青河边草免费观看完整版高清 | 精品国产一区二区三区久久久 | 亚洲丝袜中文 | 久久麻豆精品 | 国产午夜亚洲精品 | 狠狠色丁香婷婷综合 | 91久久爱热色涩涩 | 国际精品久久久 | 99精品欧美一区二区三区 | 在线免费观看涩涩 | 91综合久久一区二区 | 伊人天天综合 | 亚洲午夜av | 午夜男人影院 | 国产免费久久精品 | 国产片网站 | 久久精品国产免费看久久精品 | 国产亚洲成人网 | 在线91视频| 亚洲综合日韩在线 | 国产精品美女久久久 | 手机成人免费视频 | 人人添人人澡 | 久久你懂的 | 99久久精品久久久久久动态片 | 激情综合亚洲精品 | 欧美aa一级片 | 久碰视频在线观看 | 久久不射网站 | 免费看一级一片 | 国产高清视频在线播放 | 国产成人三级一区二区在线观看一 | 99久在线精品99re8热视频 | 夜夜操狠狠干 | 亚洲人成在线观看 | 国产 日韩 在线 亚洲 字幕 中文 | 精品久久久久久久久久久久 | 五月天天色 | 在线播放91| 欧美综合色 | 日本激情动作片免费看 | 色88久久 | 国产国语在线 | 久久6精品| 激情综合五月婷婷 | 久久久久久电影 | 97超碰超碰 | 亚洲国产精品日韩 | 亚洲最新在线视频 | 亚洲1区在线 | 色婷婷免费视频 | 午夜少妇 | 天天综合操 | 在线观看av免费观看 | 欧美日本在线视频 | 日韩免费视频在线观看 | 免费99精品国产自在在线 | av在线专区 | 久一在线 | 久久综合婷婷国产二区高清 | 欧美精品v国产精品 | 四虎永久免费在线观看 | 天天干天天操天天入 | 久久久免费视频播放 | 国产精品久久久久久久久久久久久 | 国产日韩精品欧美 | 亚洲天天在线日亚洲洲精 | 日韩欧美精品免费 | 91精品国产欧美一区二区 | 亚洲国产一区av | 在线观看国产区 | 国产精品 国产精品 | 免费 在线 中文 日本 | 美女网站在线看 | 午夜久久久久久久久 | 国产精品美女www爽爽爽视频 | 久久久免费观看完整版 | 99免费精品视频 | 日本在线观看中文字幕 | 国产精品成人一区二区三区吃奶 | 欧美地下肉体性派对 | 久久免费av电影 | 99精品热视频只有精品10 | 日韩精品久久久 | 国产成人精品日本亚洲999 | 久久夜视频 | 国产亚洲在线视频 | 啪啪肉肉污av国网站 | 去看片 | 特级a毛片 | 久久网页| 精品1区二区 | 日韩系列在线 | 国内精品久久影院 | 人人超碰97| 81精品国产乱码久久久久久 | 特级毛片在线免费观看 | 国产免费观看av | 亚洲成人午夜av | 国产一区二区免费看 | 日韩欧美大片免费观看 | 国产专区第一页 | 免费国产视频 | 中文字幕一区二区三区在线视频 | 国产精品久久久 | 亚洲 综合 专区 | 亚洲视频高清 | 欧美性爽爽 | 久久国产乱 | 国产精品久久久久久久久久直播 | 91亚色视频 | 亚洲视频久久 | 亚洲精品www.| 97视频在线观看播放 | 免费观看一级成人毛片 | 日韩乱理| 久久手机免费观看 | 色偷偷中文字幕 | 99热在线免费观看 | 超碰在线97免费 | 久久久视频在线 | 精品自拍av| 中文字幕五区 | 99久久精品国产一区二区成人 | 九九久久国产 | 国外成人在线视频网站 | 欧美久久久 | 91精品综合在线观看 | 在线视频手机国产 | 狠狠的操狠狠的干 | 国产精品久久久电影 | 国产成人一区二区三区在线观看 | 久久久国产精品网站 | 美女精品久久 | 欧美久草视频 | 国产免费a| av久久在线 | 亚洲欧洲久久久 | 亚洲一区二区天堂 | 97视频总站 | 人人看97| 国产成人精品av久久 | 国产精品h在线观看 | 字幕网在线观看 | 欧美一级片 | 波多野结衣一区二区三区中文字幕 | 久久国产精品免费一区 | 国产精品v欧美精品v日韩 | 91观看视频 | 中文字幕在线观看的网站 | 色婷婷综合激情 | 国语自产偷拍精品视频偷 | 中文字幕最新精品 | 亚洲国产成人精品久久 | а天堂中文最新一区二区三区 | 国产精品入口66mio女同 | 日韩大片免费在线观看 | 天天天色 | 很黄很色很污的网站 | 欧美日韩精品综合 | 国产视频一区二区在线观看 | 九七在线视频 | 国产精品久久久区三区天天噜 | 欧美网站黄色 | 天天操人 | 国产高清黄色 | 久久精彩免费视频 | 国产日韩亚洲 | 日本精品一区二区三区在线播放视频 | 亚洲成人网av | 国产一区二区精品久久91 | 91九色porny蝌蚪视频 | 婷婷丁香av | 国产一级二级在线观看 | 四虎影视成人永久免费观看亚洲欧美 | 丁香五月亚洲综合在线 | 99久久精品免费看国产免费软件 | 久久精品视频国产 | 欧美黄色免费 | 久久一区二区三区日韩 | 久久九九影院 | 一二区av | 黄网站免费看 | 成人a在线观看 | 精品免费国产一区二区三区四区 | 日本中文在线播放 | 日韩欧美一区二区在线 | 国产一区二区三区 在线 | 西西人体4444www高清视频 | 在线观看视频一区二区 | 欧美成人精品欧美一级乱黄 | 天天干国产 | 日韩精品一区二区不卡 | 欧洲精品亚洲精品 | 99精品视频精品精品视频 | 亚洲欧美日韩在线一区二区 | 亚洲片在线资源 | 成人性生交大片免费看中文网站 | 国产精品久久久久久久久久久免费 | 一区二区三区日韩在线 | 成人在线视频一区 | 天堂av中文字幕 | 国产精品一区二区三区四区在线观看 | 欧美久久久一区二区三区 | av在线网站免费观看 | 看黄色91 | 欧美影片| a级国产乱理伦片在线观看 亚洲3级 | 精品美女国产在线 | 日韩欧美视频在线免费观看 | 国产精品毛片一区二区 | 欧美日韩在线观看一区二区三区 | 国产xxxx做受性欧美88 | 天天操天天操天天操天天操天天操 | 婷婷丁香花五月天 | 91精品久久久久久 | 国产精品久久久久久久久久三级 | 精品无人国产偷自产在线 | 日韩在线观看视频一区二区三区 | 激情婷婷在线观看 | 成人久久网 | 免费av在线 | 视频一区二区在线观看 | 日韩一区正在播放 | 国产资源网 | 亚洲免费成人av电影 | 国产伦理一区 | 国产中文字幕第一页 | 日韩视频一区二区 | 久久丁香| 久久精品久久综合 | 亚洲国产中文字幕在线视频综合 | 96超碰在线 | 久久久久免费看 | 国产午夜精品免费一区二区三区视频 | 国产亚洲精品久久久久久移动网络 | 欧美福利视频一区 | 色综合久久88色综合天天6 | 国产破处在线视频 | 久草在线免费色站 | 久久人人插 | 中文字幕第 | 在线有码中文字幕 | 欧美天堂视频在线 | 狠狠躁夜夜躁人人爽超碰91 | 911精品视频 | 亚洲精品国产精品乱码在线观看 | 天天躁日日躁狠狠躁av中文 | 国产视频1区2区 | 久久久久黄色 | 天天艹| 岛国av在线不卡 | www日韩在线 | 精品久久久久久综合日本 | 中文字幕精 | 亚洲午夜小视频 | 国产一级片久久 | 成人午夜影院在线观看 | 黄色录像av | 少妇视频一区 | 国产精品综合在线观看 | 日韩在线观看视频一区二区三区 | 干狠狠 | 中文字幕日韩在线播放 | 精品视频不卡 | 亚洲国产小视频在线观看 | 日韩电影中文字幕在线观看 | 九色91在线视频 | 不卡av免费在线观看 | 天天摸日日摸人人看 | 青青草在久久免费久久免费 | www,黄视频| 国产精品久久久久婷婷 | av黄色一级片 | 亚洲日本国产精品 | 久久成人资源 | 综合久久久久久久久 | 丁香在线| 69久久99精品久久久久婷婷 | 91超级碰碰| 久久色在线播放 | av黄色成人| 在线韩国电影免费观影完整版 | 毛片视频电影 | 成人免费观看视频大全 | 91九色国产| 久久免费电影 | 五月婷婷在线观看视频 | 99在线观看视频网站 | 最近能播放的中文字幕 | 成人久久 | 久久久久久久久爱 | 少妇精69xxtheporn | 国产精品久久久久久久久久妇女 | 色综合国产 | 亚洲国产精品999 | 精品国自产在线观看 | h动漫中文字幕 | 国产精品女同一区二区三区久久夜 | 一区二区三区免费看 | 999国产在线 | 国产黄色美女 | 丁香 久久 综合 | 91香蕉国产在线观看软件 | 亚洲久草视频 | 天天射综合网站 | 麻豆91精品 | 成年人在线视频观看 | av解说在线观看 | 91麻豆精品国产91久久久无需广告 | 黄色av一区二区三区 | 91在线色 | 日韩一区正在播放 | 国产999精品久久久影片官网 | 久久黄色网页 | 很黄很黄的网站免费的 | 手机成人av | 蜜臀aⅴ国产精品久久久国产 | 免费一级片视频 | 99热99| 天天天色综合 | 日韩免费网址 | 精品视频区 | 亚洲精品高清一区二区三区四区 | 不卡的av在线播放 | 国产一区二区三区免费在线 | 久久电影中文字幕视频 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 99视频在线看 | 国产精品99久久久久久久久久久久 | 国产色婷婷 | 99av在线视频 | 国产小视频免费在线网址 | 久久天天综合网 | 色婷婷狠狠操 | 国产精品嫩草影院123 | 久久久精选| 国产又黄又爽无遮挡 | www99久久 | 精品欧美一区二区在线观看 | 黄色片视频在线观看 | 欧美在线观看视频一区二区三区 | 亚洲二区精品 | 国产一级特黄电影 | 国产成人一区二区三区久久精品 | 中文字幕国产一区二区 | 91免费观看 | 一级a性色生活片久久毛片波多野 | 国产专区在线看 | 国产亚洲视频在线观看 | 蜜桃av人人夜夜澡人人爽 | 精品福利视频在线观看 | 中文字幕在线观看免费高清电影 | 亚洲播放一区 | 中文字幕视频免费观看 | 久久久综合精品 | 麻豆一区在线观看 | 亚洲精品在线一区二区三区 | 在线成人免费电影 | 免费视频网| 三上悠亚在线免费 | 欧美日韩精品在线免费观看 | 亚洲男男gaygay无套 | 久草在线最新免费 | 国产精品国产毛片 | 又色又爽又黄高潮的免费视频 | 91麻豆精品国产91久久久久久 | 国产精品2020 | 蜜桃麻豆www久久囤产精品 | 久久久在线视频 | 五月天最新网址 | 粉嫩一区二区三区粉嫩91 | 中文字幕一区二区三区在线观看 | 成人久久久久久久久 | 国产精品一区二区三区视频免费 | av大全在线免费观看 | 狠狠狠狠狠狠天天爱 | 91av中文字幕 | 日韩在线视频网 | 亚洲成人999 | 五月婷婷在线视频观看 | 五月婷婷av在线 | 丁香婷婷综合激情五月色 | 在线观看精品视频 | 亚洲国产三级在线 | 国产一区精品在线 | 日本久久久久久科技有限公司 | 狠狠狠狠狠干 | 黄色在线小网站 | 色五月激情五月 | 中午字幕在线观看 | 九月婷婷人人澡人人添人人爽 | 久久精品2 | 久久视频6| 久草视频视频在线播放 | 最近免费中文字幕大全高清10 | 亚洲成人动漫在线观看 | 亚洲国产小视频在线观看 | 亚洲一区二区高潮无套美女 | 日韩视频中文 | 国产精品欧美久久久久三级 | 亚洲视频在线观看 | 日本女人逼 | 开心综合网 | 五月婷婷在线视频观看 | 精品国产一区二区三区噜噜噜 | 亚洲精品麻豆视频 | 91激情视频在线 | 久久久久久久久久久久影院 | 国产精品免费久久久 | 日韩av电影免费观看 | 中文资源在线观看 | 久久久精品 一区二区三区 国产99视频在线观看 | 999精品| 免费观看全黄做爰大片国产 | 91最新在线 | 中文字幕在线播放视频 | 日韩一级电影在线观看 | 五月天久久久 | 日韩手机在线观看 | 2024国产精品视频 | 麻豆一区在线观看 | 国产一区二区精 | av先锋中文字幕 | 在线不卡中文字幕播放 | 久久久九九 | 免费黄色特级片 | 欧洲av不卡 | 国产又粗又长又硬免费视频 | www.夜夜 | 国产在线毛片 | 精品久久免费看 | 福利一区在线 | 免费看亚洲毛片 | 成人国产精品入口 | 在线视频日韩精品 | 国产精品视频区 | 亚洲丁香日韩 | 丁香电影小说免费视频观看 | 色99视频| 中文字幕国产 | 欧美激情视频一区二区三区 | 91成人精品一区在线播放69 | 日韩高清不卡一区二区三区 | 在线观看麻豆av | 97精品伊人 | 日三级在线 | 亚洲人成综合 | 欧美精品做受xxx性少妇 | 色综合亚洲精品激情狠狠 | av官网在线 | 免费在线精品视频 | 久久亚洲私人国产精品 | 国产精品 亚洲精品 | 成人av在线资源 | 天天操夜操 | 国产护士hd高朝护士1 | 成人av电影免费在线播放 | 九九综合久久 | 成人av一级片 | 久久久久99精品成人片三人毛片 | 五月婷婷av | 丁香婷五月 | 99热这里有精品 | av看片网址 | 久久欧美精品 | 美女久久久 | 日本精品视频网站 | 91网页版免费观看 | 亚洲情感电影大片 | 一区二区在线电影 | 国产精品永久免费视频 | 国产美女被啪进深处喷白浆视频 | bayu135国产精品视频 | 人人草人 | 91自拍视频在线观看 | 国产精品1区2区3区 久久免费视频7 | 麻豆一区二区三区视频 | 国产精品午夜8888 | 久久伊人爱 | 在线观看一区视频 | 成人在线视频免费 | 在线观看黄a | sesese图片| 91在线最新 | 国产精品白浆视频 | 久久久久高清 | 97成人在线免费视频 | 欧美成人一二区 | 超碰97在线看 | 婷婷免费视频 | 激情网站五月天 | 国产分类视频 | 欧美色图亚洲图片 | 91亚洲精品久久久中文字幕 | 久久免费黄色网址 | 九色视频网 | 国产人成看黄久久久久久久久 | 欧美日韩91 | 日韩www在线 | 免费看一级片 | 97视频一区 | 日本乱码在线 | 在线观看国产一区二区 | 黄污网 | 亚洲激情视频 | 久久久一本精品99久久精品66 | 日批视频在线播放 | 手机看片中文字幕 | 草免费视频| 久久精品中文字幕一区二区三区 | 久久一级电影 | 九九免费视频 | 亚洲欧美日韩精品一区二区 | 日韩精品资源 | 激情自拍av | 国产一区免费在线观看 | 亚洲,播放 | 久久精品伊人 | 久久伊人八月婷婷综合激情 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 99久久这里只有精品 | 欧美亚洲一区二区在线 | 91免费观看视频在线 | 成人国产精品 | 女人高潮特级毛片 | 天天草天天插 | 99热在线这里只有精品 | 在线免费观看欧美日韩 | 成人午夜免费剧场 | 精品久久福利 | 精品福利网站 | 久久成人黄色 | 亚洲少妇久久 | 国产成人久久久77777 | 日本久久久久久久久久 | 一区二区三区免费在线观看视频 | 91精品在线免费 | 国产一级二级在线播放 | 五月婷婷深开心 | 亚洲免费视频在线观看 | 热久久视久久精品18亚洲精品 | 欧美激情亚洲综合 | 国产视频观看 | 中文在线免费一区三区 | 欧美a级成人淫片免费看 | 国产色视频123区 | 日韩特级片 | 国产一区高清在线观看 | 99精品视频在线看 | 日韩av中文在线观看 | 亚洲最大激情中文字幕 | 日韩精品首页 | 亚洲精品男人的天堂 | 免费av在线| 国产中文字幕一区二区 | 激情欧美xxxx | 五月天婷婷免费视频 | a黄色一级片| 黄色三级av | 91你懂的| 成人黄在线 | 国产精品99久久久久人中文网介绍 | 日日干夜夜草 | 久久精品导航 | 欧美国产大片 | 亚洲二区精品 | 久久精品这里热有精品 | 色就是色综合 | 91香蕉视频黄色 | 六月婷婷久香在线视频 | 久久中国精品 | 美女免费av| 国产精品一区二区三区电影 | 精品国产成人在线影院 | 国产精品久久久久久久久免费 | 久久不射电影院 | 欧美久久99 | 国产麻豆视频在线观看 | 91精彩视频 | 日韩中文字幕91 | 国产午夜精品av一区二区 | 色综合综合 | 99精品欧美一区二区蜜桃免费 | 久久超碰免费 | 99久久精品国产系列 | 99爱精品在线 | av免费网站 | 久草在线手机观看 | 91伊人影院 | 人人插人人爱 | 免费电影一区二区三区 | 久久婷婷国产色一区二区三区 | 亚洲丝袜一区二区 | 日日夜夜天天久久 | 亚洲视频 一区 | 人人搞人人搞 | 九色91在线 | 久久超碰网 | 亚洲国产精品传媒在线观看 | 久久在线观看视频 | 天堂av最新网址 | 国产aa免费视频 | 在线视频欧美日韩 | 久久久久国产精品www | 亚洲国产资源 | 视色网站 | 亚洲专区 国产精品 | 日韩有色 | 精品福利国产 | 久久久久久国产精品免费 | 成人av教育 | 92国产精品久久久久首页 | 99久久久久久久 | 国产精品久久久久久久久久99 | 免费国产ww| 国产福利资源 | 日韩视频一区二区 | h动漫中文字幕 | 99色免费视频 |