第一次面滴滴,沒想到?jīng)鐾噶耍?/h1>共
7493字,需瀏覽
15分鐘
·
2024-05-21 14:04
大家好,我是二哥呀。
滴滴這兩年低調(diào)多了,原因大家都知道,但滴滴這家互聯(lián)網(wǎng)公司本身的技術(shù)還是非常不錯的,尤其是網(wǎng)約車這塊的核心業(yè)務(wù),能進(jìn)組基本上以后再跳槽就很有含金量了。
我去滴滴的官網(wǎng)看了一眼,好家伙,25 屆秋招儲備實習(xí)生已經(jīng)開招了,我滴媽呀,互聯(lián)網(wǎng)的招聘時間線真的是越來越靠前了,招聘的花樣是真的越來越多了。
叫暑期實習(xí)或者秋招提前批我都能理解,這來一個秋招儲備實習(xí)生,確實有點難繃。只能說和秋招無縫銜接了,只能說兄弟姐妹們早點準(zhǔn)備吧,只能說有坑早點占吧。
這次我們以《Java 面試指南-滴滴面經(jīng)》同學(xué) 1 為例, 來看看滴滴的面試官都喜歡問哪些問題,好做到知彼知己百戰(zhàn)不殆~
讓天下所有的面渣都能逆襲 ??
能看得出,仍然是圍繞著二哥一直強調(diào)的 Java 后端四大件展開,所以大家在學(xué)習(xí)的時候一定要有的放矢,效率就會高很多。
-
1、二哥的 Linux 速查備忘手冊.pdf 下載
-
2、三分惡面渣逆襲在線版:https://javabetter.cn/sidebar/sanfene/nixi.html
滴滴面經(jīng)(八股吟唱開始)
列表的底層實現(xiàn)
-
ArrayList 基于數(shù)組實現(xiàn)
-
LinkedList 基于鏈表實現(xiàn)
三分惡面渣逆襲:ArrayList和LinkedList的數(shù)據(jù)結(jié)構(gòu)
多數(shù)情況下,ArrayList 更利于查找,LinkedList 更利于增刪
①、由于 ArrayList 是基于數(shù)組實現(xiàn)的,所以 get(int index) 可以直接通過數(shù)組下標(biāo)獲取,時間復(fù)雜度是 O(1);LinkedList 是基于鏈表實現(xiàn)的,get(int index) 需要遍歷鏈表,時間復(fù)雜度是 O(n)。
當(dāng)然,get(E element) 這種查找,兩種集合都需要遍歷通過 equals 比較獲取元素,所以時間復(fù)雜度都是 O(n)。
②、ArrayList 如果增刪的是數(shù)組的尾部,直接插入或者刪除就可以了,時間復(fù)雜度是 O(1);如果 add 的時候涉及到擴容,時間復(fù)雜度會提升到 O(n)。
但如果插入的是中間的位置,就需要把插入位置后的元素向前或者向后移動,甚至還有可能觸發(fā)擴容,效率就會低很多,O(n)。
LinkedList 因為是鏈表結(jié)構(gòu),插入和刪除只需要改變前置節(jié)點、后置節(jié)點和插入節(jié)點的引用就行了,不需要移動元素。
如果是在鏈表的頭部插入或者刪除,時間復(fù)雜度是 O(1);如果是在鏈表的中間插入或者刪除,時間復(fù)雜度是 O(n),因為需要遍歷鏈表找到插入位置;如果是在鏈表的尾部插入或者刪除,時間復(fù)雜度是 O(1)。
三分惡面渣逆襲:ArrayList和LinkedList中間插入
三分惡面渣逆襲:ArrayList和LinkedList中間刪除
注意,這里有個陷阱,LinkedList 更利于增刪不是體現(xiàn)在時間復(fù)雜度上,因為二者增刪的時間復(fù)雜度都是 O(n),都需要遍歷列表;而是體現(xiàn)在增刪的效率上,因為 LinkedList 的增刪只需要改變引用,而 ArrayList 的增刪可能需要移動元素。
單例的底層實現(xiàn)
單例模式(Singleton Pattern)是一種創(chuàng)建型設(shè)計模式,它確保一個類只有一個實例,并提供一個全局訪問點來獲取該實例。單例模式主要用于控制對某些共享資源的訪問,例如配置管理器、連接池、線程池、日志對象等。
refactoringguru.cn:單例模式
01、餓漢式如何實現(xiàn)單例?
餓漢式單例(Eager Initialization)在類加載時就急切地創(chuàng)建實例,不管你后續(xù)用不用得到,這也是餓漢式的來源,簡單但不支持延遲加載實例。
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
02、懶漢式如何實現(xiàn)單例?
懶漢式單例(Lazy Initialization)在實際使用時才創(chuàng)建實例,“確實懶”(??)。這種實現(xiàn)方式需要考慮線程安全問題,因此一般會帶上 synchronized 關(guān)鍵字。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
03、雙重檢查鎖定如何實現(xiàn)單例?
雙重檢查鎖定(Double-Checked Locking)結(jié)合了懶漢式的延遲加載和線程安全,同時又減少了同步的開銷,主要是用 synchronized 同步代碼塊來替代同步方法。
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
當(dāng) instance 創(chuàng)建后,再次調(diào)用 getInstance 方法時,不會進(jìn)入同步代碼塊,從而提高了性能。
在 instance 前加上 volatile 關(guān)鍵字,可以防止指令重排,因為 instance = new Singleton() 并不是一個原子操作,可能會被重排序,導(dǎo)致其他線程獲取到未初始化完成的實例。
04、靜態(tài)內(nèi)部類如何實現(xiàn)單例?
利用 Java 的靜態(tài)內(nèi)部類(Static Nested Class)和類加載機制來實現(xiàn)線程安全的延遲初始化。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
當(dāng)?shù)谝淮渭虞d Singleton 類時并不會初始化 SingletonHolder,只有在第一次調(diào)用 getInstance 方法時才會導(dǎo)致 SingletonHolder 被加載,從而實例化 instance。
05、枚舉如何實現(xiàn)單例?
使用枚舉(Enum)實現(xiàn)單例是最簡單的方式,不僅不需要考慮線程同步問題,還能防止反射攻擊和序列化問題。
public enum Singleton {
INSTANCE;
// 可以添加實例方法
}
redis消息隊列
可以使用 Redis 的 zset(有序集合)來實現(xiàn)延時隊列。
三分惡面渣逆襲:zset實現(xiàn)延時隊列
第一步,將任務(wù)添加到 zset 中,score 為任務(wù)的執(zhí)行時間戳,value 為任務(wù)的內(nèi)容。
ZADD delay_queue 1617024000 task1
第二步,定期(例如每秒)從 zset 中獲取 score 小于當(dāng)前時間戳的任務(wù),然后執(zhí)行任務(wù)。
ZREMRANGEBYSCORE delay_queue -inf 1617024000
第三步,任務(wù)執(zhí)行后,從 zset 中刪除任務(wù)。
ZREM delay_queue task1
mysql事務(wù)
事務(wù)是一個或多個 SQL 語句組成的一個執(zhí)行單元,這些 SQL 語句要么全部執(zhí)行成功,要么全部不執(zhí)行,不會出現(xiàn)部分執(zhí)行的情況。事務(wù)是數(shù)據(jù)庫管理系統(tǒng)執(zhí)行過程中的一個邏輯單位,由一個有限的數(shù)據(jù)庫操作序列構(gòu)成。
事務(wù)的主要作用是保證數(shù)據(jù)庫操作的一致性,即事務(wù)內(nèi)的操作,要么全部成功,要么全部失敗回滾,不會出現(xiàn)中間狀態(tài)。這對于維護(hù)數(shù)據(jù)庫的完整性和一致性非常重要。
事務(wù)具有四個基本特性,也就是通常所說的 ACID 特性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。
三分惡面渣逆襲:事務(wù)四大特性
什么是原子性?
原子性子性意味著事務(wù)中的所有操作要么全部完成,要么全部不完成,它是不可分割的單位。如果事務(wù)中的任何一個操作失敗了,整個事務(wù)都會回滾到事務(wù)開始之前的狀態(tài),如同這些操作從未被執(zhí)行過一樣。
什么是一致性?
一致性確保事務(wù)從一個一致的狀態(tài)轉(zhuǎn)換到另一個一致的狀態(tài)。
比如在銀行轉(zhuǎn)賬事務(wù)中,無論發(fā)生什么,轉(zhuǎn)賬前后兩個賬戶的總金額應(yīng)保持不變。假如 A 賬戶(100 塊)給 B 賬戶(10 塊)轉(zhuǎn)了 10 塊錢,不管成功與否,A 和 B 的總金額都是 110 塊。
什么是隔離性?
隔離性意味著并發(fā)執(zhí)行的事務(wù)是彼此隔離的,一個事務(wù)的執(zhí)行不會被其他事務(wù)干擾。就是事務(wù)之間是井水不犯河水的。
隔離性主要是為了解決事務(wù)并發(fā)執(zhí)行時可能出現(xiàn)的問題,如臟讀、不可重復(fù)讀、幻讀等。
數(shù)據(jù)庫系統(tǒng)通過事務(wù)隔離級別(如讀未提交、讀已提交、可重復(fù)讀、串行化)來實現(xiàn)事務(wù)的隔離性。
什么是持久性?
持久性確保事務(wù)一旦提交,它對數(shù)據(jù)庫所做的更改就是永久性的,即使發(fā)生系統(tǒng)崩潰,數(shù)據(jù)庫也能恢復(fù)到最近一次提交的狀態(tài)。通常,持久性是通過數(shù)據(jù)庫的恢復(fù)和日志機制來實現(xiàn)的,確保提交的事務(wù)更改不會丟失。
簡短一點的回答可以是:
-
原子性:事務(wù)的所有操作要么全部提交成功,要么全部失敗回滾,對于一個事務(wù)中的操作不能只執(zhí)行其中一部分。
-
一致性:事務(wù)應(yīng)確保數(shù)據(jù)庫的狀態(tài)從一個一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€一致狀態(tài)。一致性與業(yè)務(wù)規(guī)則有關(guān),比如銀行轉(zhuǎn)賬,不論事務(wù)成功還是失敗,轉(zhuǎn)賬雙方的總金額應(yīng)該是不變的。
-
隔離性:多個并發(fā)事務(wù)之間需要相互隔離,即一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。
-
持久性:一旦事務(wù)提交,則其所做的修改將永久保存到數(shù)據(jù)庫中。即使發(fā)生系統(tǒng)崩潰,修改的數(shù)據(jù)也不會丟失。
內(nèi)容來源
-
星球嘉賓三分惡的面渣逆襲:https://javabetter.cn/sidebar/sanfene/nixi.html
-
二哥的 Java 進(jìn)階之路(GitHub 已有 12000+star):https://javabetter.cn
ending
一個人可以走得很快,但一群人才能走得更遠(yuǎn)。二哥的編程星球已經(jīng)有 5300 多名球友加入了,如果你也需要一個良好的學(xué)習(xí)環(huán)境,戳鏈接 ?? 加入我們吧。這是一個編程學(xué)習(xí)指南 + Java 項目實戰(zhàn) + LeetCode 刷題的私密圈子,你可以閱讀星球?qū)?、向二哥提問、幫你制定學(xué)習(xí)計劃、和球友一起打卡成長。
兩個置頂帖「球友必看」和「知識圖譜」里已經(jīng)沉淀了非常多優(yōu)質(zhì)的學(xué)習(xí)資源,相信能幫助你走的更快、更穩(wěn)、更遠(yuǎn)。
歡迎點擊左下角閱讀原文了解二哥的編程星球,這可能是你學(xué)習(xí)求職路上最有含金量的一次點擊。
最后,把二哥的座右銘送給大家:沒有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不系之舟。共勉 ??。
瀏覽
625
共 7493字,需瀏覽 15分鐘
·
2024-05-21 14:04
大家好,我是二哥呀。
滴滴這兩年低調(diào)多了,原因大家都知道,但滴滴這家互聯(lián)網(wǎng)公司本身的技術(shù)還是非常不錯的,尤其是網(wǎng)約車這塊的核心業(yè)務(wù),能進(jìn)組基本上以后再跳槽就很有含金量了。
我去滴滴的官網(wǎng)看了一眼,好家伙,25 屆秋招儲備實習(xí)生已經(jīng)開招了,我滴媽呀,互聯(lián)網(wǎng)的招聘時間線真的是越來越靠前了,招聘的花樣是真的越來越多了。
叫暑期實習(xí)或者秋招提前批我都能理解,這來一個秋招儲備實習(xí)生,確實有點難繃。只能說和秋招無縫銜接了,只能說兄弟姐妹們早點準(zhǔn)備吧,只能說有坑早點占吧。
這次我們以《Java 面試指南-滴滴面經(jīng)》同學(xué) 1 為例, 來看看滴滴的面試官都喜歡問哪些問題,好做到知彼知己百戰(zhàn)不殆~
能看得出,仍然是圍繞著二哥一直強調(diào)的 Java 后端四大件展開,所以大家在學(xué)習(xí)的時候一定要有的放矢,效率就會高很多。
1、二哥的 Linux 速查備忘手冊.pdf 下載 2、三分惡面渣逆襲在線版:https://javabetter.cn/sidebar/sanfene/nixi.html
滴滴面經(jīng)(八股吟唱開始)
列表的底層實現(xiàn)
-
ArrayList 基于數(shù)組實現(xiàn) -
LinkedList 基于鏈表實現(xiàn)
多數(shù)情況下,ArrayList 更利于查找,LinkedList 更利于增刪
①、由于 ArrayList 是基于數(shù)組實現(xiàn)的,所以 get(int index) 可以直接通過數(shù)組下標(biāo)獲取,時間復(fù)雜度是 O(1);LinkedList 是基于鏈表實現(xiàn)的,get(int index) 需要遍歷鏈表,時間復(fù)雜度是 O(n)。
當(dāng)然,get(E element) 這種查找,兩種集合都需要遍歷通過 equals 比較獲取元素,所以時間復(fù)雜度都是 O(n)。
②、ArrayList 如果增刪的是數(shù)組的尾部,直接插入或者刪除就可以了,時間復(fù)雜度是 O(1);如果 add 的時候涉及到擴容,時間復(fù)雜度會提升到 O(n)。
但如果插入的是中間的位置,就需要把插入位置后的元素向前或者向后移動,甚至還有可能觸發(fā)擴容,效率就會低很多,O(n)。
LinkedList 因為是鏈表結(jié)構(gòu),插入和刪除只需要改變前置節(jié)點、后置節(jié)點和插入節(jié)點的引用就行了,不需要移動元素。
如果是在鏈表的頭部插入或者刪除,時間復(fù)雜度是 O(1);如果是在鏈表的中間插入或者刪除,時間復(fù)雜度是 O(n),因為需要遍歷鏈表找到插入位置;如果是在鏈表的尾部插入或者刪除,時間復(fù)雜度是 O(1)。
注意,這里有個陷阱,LinkedList 更利于增刪不是體現(xiàn)在時間復(fù)雜度上,因為二者增刪的時間復(fù)雜度都是 O(n),都需要遍歷列表;而是體現(xiàn)在增刪的效率上,因為 LinkedList 的增刪只需要改變引用,而 ArrayList 的增刪可能需要移動元素。
單例的底層實現(xiàn)
單例模式(Singleton Pattern)是一種創(chuàng)建型設(shè)計模式,它確保一個類只有一個實例,并提供一個全局訪問點來獲取該實例。單例模式主要用于控制對某些共享資源的訪問,例如配置管理器、連接池、線程池、日志對象等。
01、餓漢式如何實現(xiàn)單例?
餓漢式單例(Eager Initialization)在類加載時就急切地創(chuàng)建實例,不管你后續(xù)用不用得到,這也是餓漢式的來源,簡單但不支持延遲加載實例。
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
02、懶漢式如何實現(xiàn)單例?
懶漢式單例(Lazy Initialization)在實際使用時才創(chuàng)建實例,“確實懶”(??)。這種實現(xiàn)方式需要考慮線程安全問題,因此一般會帶上 synchronized 關(guān)鍵字。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
03、雙重檢查鎖定如何實現(xiàn)單例?
雙重檢查鎖定(Double-Checked Locking)結(jié)合了懶漢式的延遲加載和線程安全,同時又減少了同步的開銷,主要是用 synchronized 同步代碼塊來替代同步方法。
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
當(dāng) instance 創(chuàng)建后,再次調(diào)用 getInstance 方法時,不會進(jìn)入同步代碼塊,從而提高了性能。
在 instance 前加上 volatile 關(guān)鍵字,可以防止指令重排,因為 instance = new Singleton() 并不是一個原子操作,可能會被重排序,導(dǎo)致其他線程獲取到未初始化完成的實例。
04、靜態(tài)內(nèi)部類如何實現(xiàn)單例?
利用 Java 的靜態(tài)內(nèi)部類(Static Nested Class)和類加載機制來實現(xiàn)線程安全的延遲初始化。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
當(dāng)?shù)谝淮渭虞d Singleton 類時并不會初始化 SingletonHolder,只有在第一次調(diào)用 getInstance 方法時才會導(dǎo)致 SingletonHolder 被加載,從而實例化 instance。
05、枚舉如何實現(xiàn)單例?
使用枚舉(Enum)實現(xiàn)單例是最簡單的方式,不僅不需要考慮線程同步問題,還能防止反射攻擊和序列化問題。
public enum Singleton {
INSTANCE;
// 可以添加實例方法
}
redis消息隊列
可以使用 Redis 的 zset(有序集合)來實現(xiàn)延時隊列。
第一步,將任務(wù)添加到 zset 中,score 為任務(wù)的執(zhí)行時間戳,value 為任務(wù)的內(nèi)容。
ZADD delay_queue 1617024000 task1
第二步,定期(例如每秒)從 zset 中獲取 score 小于當(dāng)前時間戳的任務(wù),然后執(zhí)行任務(wù)。
ZREMRANGEBYSCORE delay_queue -inf 1617024000
第三步,任務(wù)執(zhí)行后,從 zset 中刪除任務(wù)。
ZREM delay_queue task1
mysql事務(wù)
事務(wù)是一個或多個 SQL 語句組成的一個執(zhí)行單元,這些 SQL 語句要么全部執(zhí)行成功,要么全部不執(zhí)行,不會出現(xiàn)部分執(zhí)行的情況。事務(wù)是數(shù)據(jù)庫管理系統(tǒng)執(zhí)行過程中的一個邏輯單位,由一個有限的數(shù)據(jù)庫操作序列構(gòu)成。
事務(wù)的主要作用是保證數(shù)據(jù)庫操作的一致性,即事務(wù)內(nèi)的操作,要么全部成功,要么全部失敗回滾,不會出現(xiàn)中間狀態(tài)。這對于維護(hù)數(shù)據(jù)庫的完整性和一致性非常重要。
事務(wù)具有四個基本特性,也就是通常所說的 ACID 特性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。
什么是原子性?
原子性子性意味著事務(wù)中的所有操作要么全部完成,要么全部不完成,它是不可分割的單位。如果事務(wù)中的任何一個操作失敗了,整個事務(wù)都會回滾到事務(wù)開始之前的狀態(tài),如同這些操作從未被執(zhí)行過一樣。
什么是一致性?
一致性確保事務(wù)從一個一致的狀態(tài)轉(zhuǎn)換到另一個一致的狀態(tài)。
比如在銀行轉(zhuǎn)賬事務(wù)中,無論發(fā)生什么,轉(zhuǎn)賬前后兩個賬戶的總金額應(yīng)保持不變。假如 A 賬戶(100 塊)給 B 賬戶(10 塊)轉(zhuǎn)了 10 塊錢,不管成功與否,A 和 B 的總金額都是 110 塊。
什么是隔離性?
隔離性意味著并發(fā)執(zhí)行的事務(wù)是彼此隔離的,一個事務(wù)的執(zhí)行不會被其他事務(wù)干擾。就是事務(wù)之間是井水不犯河水的。
隔離性主要是為了解決事務(wù)并發(fā)執(zhí)行時可能出現(xiàn)的問題,如臟讀、不可重復(fù)讀、幻讀等。
數(shù)據(jù)庫系統(tǒng)通過事務(wù)隔離級別(如讀未提交、讀已提交、可重復(fù)讀、串行化)來實現(xiàn)事務(wù)的隔離性。
什么是持久性?
持久性確保事務(wù)一旦提交,它對數(shù)據(jù)庫所做的更改就是永久性的,即使發(fā)生系統(tǒng)崩潰,數(shù)據(jù)庫也能恢復(fù)到最近一次提交的狀態(tài)。通常,持久性是通過數(shù)據(jù)庫的恢復(fù)和日志機制來實現(xiàn)的,確保提交的事務(wù)更改不會丟失。
簡短一點的回答可以是:
-
原子性:事務(wù)的所有操作要么全部提交成功,要么全部失敗回滾,對于一個事務(wù)中的操作不能只執(zhí)行其中一部分。 -
一致性:事務(wù)應(yīng)確保數(shù)據(jù)庫的狀態(tài)從一個一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€一致狀態(tài)。一致性與業(yè)務(wù)規(guī)則有關(guān),比如銀行轉(zhuǎn)賬,不論事務(wù)成功還是失敗,轉(zhuǎn)賬雙方的總金額應(yīng)該是不變的。 -
隔離性:多個并發(fā)事務(wù)之間需要相互隔離,即一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。 -
持久性:一旦事務(wù)提交,則其所做的修改將永久保存到數(shù)據(jù)庫中。即使發(fā)生系統(tǒng)崩潰,修改的數(shù)據(jù)也不會丟失。
內(nèi)容來源
-
星球嘉賓三分惡的面渣逆襲:https://javabetter.cn/sidebar/sanfene/nixi.html -
二哥的 Java 進(jìn)階之路(GitHub 已有 12000+star):https://javabetter.cn
ending
一個人可以走得很快,但一群人才能走得更遠(yuǎn)。二哥的編程星球已經(jīng)有 5300 多名球友加入了,如果你也需要一個良好的學(xué)習(xí)環(huán)境,戳鏈接 ?? 加入我們吧。這是一個編程學(xué)習(xí)指南 + Java 項目實戰(zhàn) + LeetCode 刷題的私密圈子,你可以閱讀星球?qū)?、向二哥提問、幫你制定學(xué)習(xí)計劃、和球友一起打卡成長。
兩個置頂帖「球友必看」和「知識圖譜」里已經(jīng)沉淀了非常多優(yōu)質(zhì)的學(xué)習(xí)資源,相信能幫助你走的更快、更穩(wěn)、更遠(yuǎn)。
歡迎點擊左下角閱讀原文了解二哥的編程星球,這可能是你學(xué)習(xí)求職路上最有含金量的一次點擊。
最后,把二哥的座右銘送給大家:沒有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不系之舟。共勉 ??。
