【Java8新特性】不了解Optional類,簡歷上別說你懂Java8!!_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

寫在前面

最近,很多讀者出去面試都在Java8上栽了跟頭,事後自己分析,確實對Java8的新特性一知半解。然而,卻在簡歷顯眼的技能部分寫着:熟練掌握Java8的各種新特性,能夠迅速使用Java8開發高併發應用!這不,又一名讀者因為寫了熟練掌握Java8的新特性而被面試官虐的體無完膚!我不是說不能寫,可以這樣寫!但是,咱在寫熟練掌握Java8新特性的時候,應該靜下心來好好想想自己是否真的掌握了Java8。如果自己心中對是否掌握了Java8這個問題模稜兩可的話,那確實要好好靜下心來為自己充電了!一定要從模稜兩可到徹底掌握Java8,那到時就不是面試官虐你了,而是你吊打面試官!!

什麼是Optional類?

Optional 類(java.util.Optional) 是一個容器類,代表一個值存在或不存在,原來用 null 表示一個值不存在,現在 Optional 可以更好的表達這個概念。並且可以避免空指針異常。

Optional類常用方法:

  • Optional.of(T t) : 創建一個 Optional 實例。
  • Optional.empty() : 創建一個空的 Optional 實例。
  • Optional.ofNullable(T t):若 t 不為 null,創建 Optional 實例,否則創建空實例。
  • isPresent() : 判斷是否包含值。
  • orElse(T t) : 如果調用對象包含值,返回該值,否則返回t。
  • orElseGet(Supplier s) :如果調用對象包含值,返回該值,否則返回 s 獲取的值。
  • map(Function f): 如果有值對其處理,並返回處理后的Optional,否則返回 Optional.empty()。
  • flatMap(Function mapper):與 map 類似,要求返回值必須是Optional。

Optional類示例

1.創建Optional類

(1)使用empty()方法創建一個空的Optional對象:

Optional<String> empty = Optional.empty();

(2)使用of()方法創建Optional對象:

String name = "binghe";
Optional<String> opt = Optional.of(name);
assertEquals("Optional[binghe]", opt.toString());

傳遞給of()的值不可以為空,否則會拋出空指針異常。例如,下面的程序會拋出空指針異常。

String name = null;
Optional<String> opt = Optional.of(name);

如果我們需要傳遞一些空值,那我們可以使用下面的示例所示。

String name = null;
Optional<String> opt = Optional.ofNullable(name);

使用ofNullable()方法,則當傳遞進去一個空值時,不會拋出異常,而只是返回一個空的Optional對象,如同我們用Optional.empty()方法一樣。

2.isPresent

我們可以使用這個isPresent()方法檢查一個Optional對象中是否有值,只有值非空才返回true。

Optional<String> opt = Optional.of("binghe");
assertTrue(opt.isPresent());

opt = Optional.ofNullable(null);
assertFalse(opt.isPresent());

在Java8之前,我們一般使用如下方式來檢查空值。

if(name != null){
    System.out.println(name.length);
}

在Java8中,我們就可以使用如下方式來檢查空值了。

Optional<String> opt = Optional.of("binghe");
opt.ifPresent(name -> System.out.println(name.length()));

3.orElse和orElseGet

(1)orElse

orElse()方法用來返回Optional對象中的默認值,它被傳入一個“默認參數‘。如果對象中存在一個值,則返回它,否則返回傳入的“默認參數”。

String nullName = null;
String name = Optional.ofNullable(nullName).orElse("binghe");
assertEquals("binghe", name);

(2)orElseGet

與orElse()方法類似,但是這個函數不接收一個“默認參數”,而是一個函數接口。

String nullName = null;
String name = Optional.ofNullable(nullName).orElseGet(() -> "binghe");
assertEquals("binghe", name);

(3)二者有什麼區別?

要想理解二者的區別,首先讓我們創建一個無參且返回定值的方法。

public String getDefaultName() {
    System.out.println("Getting Default Name");
    return "binghe";
}

接下來,進行兩個測試看看兩個方法到底有什麼區別。

String text;
System.out.println("Using orElseGet:");
String defaultText = Optional.ofNullable(text).orElseGet(this::getDefaultName);
assertEquals("binghe", defaultText);

System.out.println("Using orElse:");
defaultText = Optional.ofNullable(text).orElse(getDefaultName());
assertEquals("binghe", defaultText);

在這裏示例中,我們的Optional對象中包含的都是一個空值,讓我們看看程序執行結果:

Using orElseGet:
Getting default name...
Using orElse:
Getting default name...

兩個Optional對象中都不存在value,因此執行結果相同。

那麼,當Optional對象中存在數據會發生什麼呢?我們一起來驗證下。

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

String name = "binghe001";

System.out.println("Using orElseGet:");
String defaultName = Optional.ofNullable(name).orElseGet(this::getDefaultName);
assertEquals("binghe001", defaultName);

System.out.println("Using orElse:");
defaultName = Optional.ofNullable(name).orElse(getDefaultName());
assertEquals("binghe001", defaultName);

運行結果如下所示。

Using orElseGet:
Using orElse:
Getting default name...

可以看到,當使用orElseGet()方法時,getDefaultName()方法並不執行,因為Optional中含有值,而使用orElse時則照常執行。所以可以看到,當值存在時,orElse相比於orElseGet,多創建了一個對象。如果創建對象時,存在網絡交互,那系統資源的開銷就比較大了,這是需要我們注意的一個地方。

4.orElseThrow

orElseThrow()方法當遇到一個不存在的值的時候,並不返回一個默認值,而是拋出異常。

String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow( IllegalArgumentException::new);

5.get

get()方法表示是Optional對象中獲取值。

Optional<String> opt = Optional.of("binghe");
String name = opt.get();
assertEquals("binghe", name);

使用get()方法也可以返回被包裹着的值。但是值必須存在。當值不存在時,會拋出一個NoSuchElementException異常。

Optional<String> opt = Optional.ofNullable(null);
String name = opt.get();

6.filter

接收一個函數式接口,當符合接口時,則返回一個Optional對象,否則返回一個空的Optional對象。

String name = "binghe";
Optional<String> nameOptional = Optional.of(name);
boolean isBinghe = nameOptional.filter(n -> "binghe".equals(name)).isPresent();
assertTrue(isBinghe);
boolean isBinghe001 = nameOptional.filter(n -> "binghe001".equals(name)).isPresent();
assertFalse(isBinghe001);

使用filter()方法會過濾掉我們不需要的元素。

接下來,我們再來看一例示例,例如目前有一個Person類,如下所示。

public class Person{
    private int age;
    public Person(int age){
        this.age = age;
    }
    //省略get set方法
}

例如,我們需要過濾出年齡在25歲到35歲之前的人群,那在Java8之前我們需要創建一個如下的方法來檢測每個人的年齡範圍是否在25歲到35歲之前。

public boolean filterPerson(Peron person){
    boolean isInRange = false;
    if(person != null && person.getAge() >= 25 && person.getAge() <= 35){
        isInRange =  true;
    }
    return isInRange;
}

看上去就挺麻煩的,我們可以使用如下的方式進行測試。

assertTrue(filterPerson(new Peron(18)));
assertFalse(filterPerson(new Peron(29)));
assertFalse(filterPerson(new Peron(16)));
assertFalse(filterPerson(new Peron(34)));
assertFalse(filterPerson(null));

如果使用Optional,效果如何呢?

public boolean filterPersonByOptional(Peron person){
     return Optional.ofNullable(person)
       .map(Peron::getAge)
       .filter(p -> p >= 25)
       .filter(p -> p <= 35)
       .isPresent();
}

使用Optional看上去就清爽多了,這裏,map()僅僅是將一個值轉換為另一個值,並且這個操作並不會改變原來的值。

7.map

如果有值對其處理,並返回處理后的Optional,否則返回 Optional.empty()。

List<String> names = Arrays.asList("binghe001", "binghe002", "", "binghe003", "", "binghe004");
Optional<List<String>> listOptional = Optional.of(names);

int size = listOptional
    .map(List::size)
    .orElse(0);
assertEquals(6, size);

在這個例子中,我們使用一個List集合封裝了一些字符串,然後再把這個List使用Optional封裝起來,對其map(),獲取List集合的長度。map()返回的結果也被封裝在一個Optional對象中,這裏當值不存在的時候,我們會默認返回0。如下我們獲取一個字符串的長度。

String name = "binghe";
Optional<String> nameOptional = Optional.of(name);

int len = nameOptional
    .map(String::length())
    .orElse(0);
assertEquals(6, len);

我們也可以將map()方法與filter()方法結合使用,如下所示。

String password = " password ";
Optional<String> passOpt = Optional.of(password);
boolean correctPassword = passOpt.filter(
    pass -> pass.equals("password")).isPresent();
assertFalse(correctPassword);

correctPassword = passOpt
    .map(String::trim)
    .filter(pass -> pass.equals("password"))
    .isPresent();
assertTrue(correctPassword);

上述代碼的含義就是對密碼進行驗證,查看密碼是否為指定的值。

8.flatMap

與 map 類似,要求返回值必須是Optional。

假設我們現在有一個Person類。

public class Person {
    private String name;
    private int age;
    private String password;
 
    public Optional<String> getName() {
        return Optional.ofNullable(name);
    }
 
    public Optional<Integer> getAge() {
        return Optional.ofNullable(age);
    }
 
    public Optional<String> getPassword() {
        return Optional.ofNullable(password);
    }
    // 忽略get set方法
}

接下來,我們可以將Person封裝到Optional中,並進行測試,如下所示。

Person person = new Person("binghe", 18);
Optional<Person> personOptional = Optional.of(person);

Optional<Optional<String>> nameOptionalWrapper = personOptional.map(Person::getName);
Optional<String> nameOptional = nameOptionalWrapper.orElseThrow(IllegalArgumentException::new);
String name1 = nameOptional.orElse("");
assertEquals("binghe", name1);

String name = personOptional
    .flatMap(Person::getName)
    .orElse("");
assertEquals("binghe", name);

注意:方法getName返回的是一個Optional對象,如果使用map,我們還需要再調用一次get()方法,而使用flatMap()就不需要了。

寫在最後

如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Java8新特性。

最後,附上Java8新特性核心知識圖,祝大家在學習Java8新特性時少走彎路。

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

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

GoPro 將藍牙遙控器加上了螢幕,還可以一次控制 5 台運動相機_網頁設計公司

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

如果你是愛用 GoPro 進行創作的朋友,應該不會對官方的遙控器裝置太陌生 — 基本上就是個讓你在無法觸及 GoPro 運動相機時,可以幫忙執行各種設定與拍攝的好夥伴。而隨著新世代的 Hero9 推出,他們則是再推出了一款算是先前超小巧方形的藍牙遙控器的升級版「The Remote」,是說這中文應該就只叫做遙控器?繼續閱讀 GoPro 將藍牙遙控器加上了螢幕,還可以一次控制 5 台運動相機報導內文。

▲圖片來源:GoPro

GoPro 將藍牙遙控器加上了螢幕,還可以一次控制 5 台運動相機

說起來這次新推的 GoPro 遙控器,比較像是介於很早以前的 Wi-Fi 遙控器與後來推出的藍牙遙控器之間的產品 — 同時可以控制的相機數也是,搭載螢幕的 Wi-Fi 版本,可以一次遙控 50 台是其中最高階的存在(算是吧);外型就是「一顆按鈕」且支援語音功能的藍牙遙控器,則是僅能與單機連線;這次的新款遙控器,則是可以跟 5 台支援的機型,包括:GoPro Hero9、 Hero8 與 Max 連線使用。

▲圖片來源:GoPro

儘管 GoPro 在官網寫上了它搭載了大尺寸的「高解析度螢幕」。不過很可惜,它支援的顯示功能其實比較接近於 Hero8 的前螢幕,並非 Hero9 的全彩自拍螢幕 — 雖然官方真的打上了 high-resolution display。

遙控距離方面,相對於先前藍牙遙控器的 10 公尺,這次的版本更遠到了 60 公尺,並支援水下最深近 5 公尺的防水能力。但最遠距離還是由 Wi-Fi 版本的智慧遙控器的 180 公尺為最強。

▲圖片來源:GoPro

機身上則是除了正面的拍攝鈕外,側面還有模式與設定按鈕共 4 顆按鈕(其中一個從官圖看不出來,但應該在頂部,也許是電源鈕吧)。大螢幕的好處是,這次的遙控器不再像 Wi-Fi 版本那樣,一切資訊擠成一團,讓人很難在激烈的運動活動下快速查看,並會直接顯示剩餘電量的百分比而非圖示(這個好,誒… 應該是相機電量吧?),遙控器螢幕的頂部也有錄影燈號。

The Remote 現已在美國官網開賣,建議售價為 US$80(約 NT$2,300),據稱其他國家的開賣時間將會需要等到明年二月。所以如果急著要入手的話,可能就只能從海外官網入手囉。

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

本篇圖片 / 引用來源

延伸閱讀:

HomePod mini 開箱體驗:一顆就能敲開蘋果智慧家門,兩顆更是不嫌多

其實 AirPods Max 閒置 5 分鐘就會進入 Smart Case 低耗電模式,還有個超低耗電模式等著呢

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

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

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

記一次接口性能優化實踐總結:優化接口性能的八個建議_台中搬家公司

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

前言

最近對外接口偶現504超時問題,原因是代碼執行時間過長,超過nginx配置的15秒,然後真槍實彈搞了一次接口性能優化。在這裏結合優化過程,總結了接口優化的八個要點,希望對大家有幫助呀~

  • 數據量比較大,批量操作數據入庫
  • 耗時操作考慮異步處理
  • 恰當使用緩存
  • 優化程序邏輯、代碼
  • SQL優化
  • 壓縮傳輸內容
  • 考慮使用文件/MQ等其他方式暫存,異步再落地DB
  • 跟產品討論需求最恰當,最舒服的實現方式

嘻嘻,先看一下我們對外轉賬接口的大概流程吧

1.數據量比較大,批量操作數據入庫

優化前:

//for循環單筆入庫
for(TransDetail detail:list){
  insert(detail);  
}

優化后:

// 批量入庫,mybatis demo實現
<insert id="insertBatch" parameterType="java.util.List">
insert into trans_detail( id,amount,payer,payee) values
 <foreach collection="list" item="item" index="index" separator=",">(
    #{item.id},	#{item.amount},
    #{item.payer},#{item.payee}
  )
</foreach>
</insert>

性能對比:

單位(ms) for循環單筆入庫 批量入庫
500條 1432 1153
1000條 1876 1425

解析

  • 批量插入性能更好,更加省時間,為什麼呢?
打個比喻:假如你需要搬一萬塊磚到樓頂,你有一個電梯,電梯一次可以放適量的磚(最多放500),
你可以選擇一次運送一塊磚,也可以一次運送500,你覺得哪種方式更方便,時間消耗更少?

2.耗時操作考慮異步處理

耗時操作,考慮用異步處理,這樣可以降低接口耗時。本次轉賬接口優化,匹配聯行號的操作耗時有點長,所以優化過程把它移到異步處理啦,如下:

優化前:

優化后

匹配聯行號的操作異步處理

性能對比:

假設一個聯行號匹配6ms

同步 異步
500條 3000ms ~
1000條 6000ms ~

解析:

  • 因為聯行號匹配比較耗時,放在異步處理的話,同步聯機返回可以省掉這部分時間,大大提升接口性能,並且不會影響到轉賬主流程功能。
  • 除了這個例子,平時我們類似功能,如用戶註冊成功后,短信郵件通知,也是可以異步處理的,這個優化建議香餑餑的~
  • 所以,太耗時的操作,在不影響主流程功能的情況下,可以考慮開子線程異步處理的啦。

3.恰當使用緩存

在適當的業務場景,恰當地使用緩存,是可以大大提高接口性能的。這裏的緩存包括:Redis,JVM本地緩存,memcached,或者Map等。

這次轉賬接口,使用到緩存啦,舉個簡單例子吧~

優化前

以下是輸入用戶賬號,匹配聯行號的流程圖

優化后:

恰當使用緩存,代替查詢DB表,流程圖如下:

解析:

  • 把熱點數據放到緩存,不用每次查詢都去DB拉取,節省了這部分查SQL的耗時,美滋滋呀~
  • 當然,不是什麼數據都適合放到緩存的哦,訪問比較頻繁的熱點數據才考慮緩存起來呢~

4. 優化程序邏輯、代碼

優化程序邏輯、程序代碼,是可以節省耗時的。

我這裏就本次的轉賬接口優化,舉個例子吧~

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

優化前:

優化前,聯行號查詢了兩次(檢驗參數一次,插入DB前查詢一次),如下偽代碼:


punlic void process(Req req){
  //檢驗參數,包括聯行號(前端傳來的payeeBankNo可以為空,但是如果後端沒匹配到,會拋異常)
   checkTransParams(Req req);
   //Save DB
  saveTransDetail(req); 
}

void checkTransParams(Req req){
    //check Amount,and so on.
    checkAmount(req.getamount);
    //check payeebankNo
    if(Utils.isEmpty(req.getPayeeBankNo())){
        String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);
        if(Utils.isEmpty(payeebankNo){
            throws Exception();
        }
    }
}

int saveTransDetail(req){
    String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);
    req.setPayeeBankNo(payeebankNo);
    insert(req);
    ...
}

優化后:

優化后,只在校驗參數的時候插敘一次,然後設置到對象裏面~ 入庫前就不用再查啦,偽代碼如下:

void checkTransParams(Req req){
    //check Amount,and so on.
    checkAmount(req.getamount);
    //check payeebankNo
    if(Utils.isEmpty(req.getPayeeBankNo())){
        String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);
        if(Utils.isEmpty(payeebankNo){
            throws Exception();
        }
    }
    //查詢到有聯行號,直接設置進去啦,這樣等下入庫不用再插入多一次
    req.setPayeeBankNo(payeebankNo);
}

int saveTransDetail(req){
    insert(req);
    ...
}

解析:

  • 對於優化程序邏輯、代碼,是可以降低接口耗時的。以上demo只是一個很簡單的例子,就是優化前payeeBankNo查詢了兩次,但是其實只查一次就可以了。很多時候,我們都知道這個點,但就是到寫代碼的時候,又忘記了呀~所以,寫代碼的時候,留點心吧,優化你的程序邏輯、代碼哦。
  • 除了以上demo這點,還有其它的點,如優化if複雜的邏輯條件,考慮是否可以調整順序,或者for循環,是否重複實例化對象等等,這些適當優化,都是可以讓你的代碼跑得更快的。

之前我這篇文章,也提了幾個優化點噢,有興趣的朋友可以看一下哈~

寫代碼有這些想法,同事才不會認為你是複製粘貼程序員

5. 優化你的SQL

很多時候,你的接口性能瓶頸就在SQL這裏,慢查詢需要我們重點關注的點呢。

我們可以通過這些方式優化我們的SQL:

  • 加索引
  • 避免返回不必要的數據
  • 優化sql結構
  • 分庫分表
  • 讀寫分離

有興趣的朋友可以看一下我這篇文章呢,很詳細的SQL優化點:

後端程序員必備:書寫高質量SQL的30條建議

6.壓縮傳輸內容

壓縮傳輸內容,文件變得更小,因此傳輸會更快啦。10M帶寬,傳輸10k的報文,一般比傳輸1M的會快呀;打個比喻,一匹千里馬,它馱着一百斤的貨跑得快,還是馱着10斤的貨物跑得快呢?

解析:

  • 如果你的接口性能不好,然後傳輸報文比較大的話,這時候是可以考慮壓縮文件內容傳輸的,最後優化效果可能很不錯哦~

7. 考慮使用文件/MQ等其他方式暫存數據,異步再落地DB

如果數據太大,落地數據庫實在是慢的話,可以考慮先用文件的方式保存,或者考慮MQ,先落地,再異步保存到數據庫~

本次轉賬接口,如果是併發開啟,10個併發度,每個批次1000筆數據,數據庫插入會特別耗時,大概10秒左右,這個跟我們公司的數據庫同步機制有關,併發情況下,因為優先保證同步,所以并行的插入變成串行啦,就很耗時。

優化前:

優化前,1000筆先落地DB數據庫,再異步轉賬,如下:

優化后:

先保存數據到文件,再異步下載下來,插入數據庫,如下:

解析:

  • 如果你的耗時瓶頸就在數據庫插入操作這裏了,那就考慮文件保存或者MQ或者其他方式暫存吧,文件保存數據,對比一下耗時,有時候會有意想不到的效果哦。

8.跟產品討論需求最恰當,最舒服的實現方式

這點個人覺得還是很重要的,有些需求需要好好跟產品溝通的。

比如有個用戶連麥列表展示的需求,產品說要展示所有的連麥信息,如果一個用戶的連麥列表信息好大,你拉取所有連麥數據回來,接口性能就降下來啦。如果產品打樁分析,會發現,一般用戶看連麥列表,也就看前幾頁因此,奸笑,哈哈 其實,那個超大分頁加載問題也是類似的。即limit +一個超大的數,一般會很慢的~~

總結

本文呢,基於一次對外接口耗時優化的實踐,總結了優化接口性能的八個點,希望對大家日常開發有幫助哦~嘻嘻,有興趣可以逛逛我的github哈,本文會收藏到github里滴哈

https://github.com/whx123/JavaHome

公眾號

  • 歡迎關注我個人公眾號,交個朋友,一起學習哈~

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

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

【python系統學習16】編碼基礎知識_網頁設計公司

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

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

編碼

計算機是怎麼傳輸和存儲數據的?

就是把人類認識的中英文字、其他國家語言、数字甚至運算符等符號轉成二進制的0、1,並進行存儲和傳輸。

編碼

人類語言:中英文字、其他國家語言、数字甚至運算符等符號

計算機語言:二進制的0、1【沒錯,計算機只認識0和1】

編碼:將人類語言轉換為計算機語言。

除了0、1這些阿拉伯数字,像a、b、c這樣的52個字母(包括大小寫),還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制數來表示,而具體用哪些二進制數字錶示哪個符號,理論上每個人都可以有自己的一套規則(這就叫編碼規則,形成編碼錶)。

如果使用了不同的編碼規則,就會有計算機識別不了的情況,出現亂碼

進制

二進制、八進制、十六進制。

八進制和十六進制分別是二進制的3次方和4次方。方便和二進制之間非常直接的相互轉換

二進制

由0和1構成的

二進制 十進制
00 0
01 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
  • 二進制的00,代表十進制的0
  • 二進制的01,代表十進制的1
  • 二進制的10,代表十進制的2【笑話:世界上有10種人,懂二進制的和不懂二進制的】
  • 二進制的11,代表十進制的3
  • 二進制的100,代表十進制的4
  • 以此類推…
  • 當有兩位數時,我們可以表示0到3,共4種狀態,即2的平方
  • 當有三位數時,我們可以表示0到7,共8種狀態,即2的三次方
  • 當有八位數時,我們可以表示0到255,共256種狀態,即2的8次方

八進制

使用0、1、2、3、4、5、6、7組成的

十六進制

使用0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f組成的

ASCII編碼錶中的“K”

二進制 八進制 十進制 十六進制 字母
01001011 113 75 4B K

注意這裏還是大寫的字母K哦~

存儲單位

計算機里的存儲單位

位/比特(bit)

位:又叫比特(bit)是計算機里最小的存儲單位。用來存放一位二進制書,即0或1。

字節(byte)

八個比特是一個字節,是計算機里最常用的單位。簡寫“B”

千字節(Kilobyte)

兆字節(Megabyte)

簡稱“兆”

吉字節(Gigabyte)

又叫千兆

單位換算

1B(byte 字節) = 8bit
1KB(Kilobyte 千字節) = 1024B
1MB(Megabyte 兆字節) = 1024KB
1GB(Gigabyte) = 1024MB

為什麼辦的100兆的寬帶,撐死就只有10幾兆的下載速度?

因為運營商的帶寬是以比特每秒為單位的,比如100M就是100Mbit/s。

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

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

而我們常看到的下載速度KB卻是以字節每秒為單位显示的,1byte = 8bit,所以運營商說的帶寬得先除以8,你的百兆寬帶下載速度,也就是十幾兆了。

編碼錶

為了避免亂碼,人類就約定了一套共同的編碼規則。就像計算機世界的新華字典、牛津英語字典。

編碼錶歷史

ASCII

  • ASCII編碼(讀音:/ˈæski/),美國首先出台。統一規定了常用符號用哪些二進制數來表示。 因為英文字母、数字再加上其他常用符號,也就100來個,因此使用7個比特位(最多表示128位)就夠用了,所以一個字節中被剩下的那個比特位就被默認為0。

  • 但歐洲不光有英語,還有法語字母上的注音符。於是歐洲用了美國剩下的那個比特位,普遍使用一個全字節(8個比特位)進行編碼,最多可表示256位,至此,一個字節就用滿了!

ASCII統一了前面0-127位,但從狀態128到255這一段的解釋就完全亂套了,比如135在法語,希伯來語,俄語編碼中完全是不同的符號。

GB2312和GBK

  • 中國10萬漢字,256位也不夠用。於是一張新編碼錶
    GB2312被中國科學家發明了。 用2個字節,也就是16個比特位,來表示絕大部分(65535個)常用漢字。後來,為了能显示更多的中文,又出台了
    GBK標準。

Unicode

因各個國家的編碼錶都不同。不同國家間通信又會亂碼。

  • 於是
    Unicode(萬國碼)來統一。 這套編碼錶將世界上所有的符號都納入其中。每個符號都有一個獨一無二的編碼,現在Unicode可以容納100多萬個符號,所有語言都可以互通,一個網頁上也可以显示多國語言。

萬國碼的缺點是讓英文字符被迫佔用兩個字節,耗費計算機存儲空間。(如A:用00010001就行,但是為了順從統一,需要用兩個字節:00000000 00010001)

UTF-8

  • UTF-8(8-bit Unicode Transformation Format)被提出。針對Unicode的可變長度字符編碼。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。而當字符在ASCII碼的範圍時,就用一個字節表示,所以UTF-8還可以兼容ASCII編碼。

Unicode與UTF-8這種曖昧的關係一言以蔽之:Unicode是內存編碼的規範,而UTF-8是如何保存和傳輸Unicode的手段。

編碼錶對比

編碼錶 適用性 特點
ASCII碼 英文大小寫,字符,不支持中文 美國人發明,佔用空間小,用一個字節就行
GB2312碼、GBK碼 支持中文 中國人發明,GBK是GB2312的升級,增加了更多原來沒有的文字字符
Unicode碼 支持國際語言,萬國碼 適用性強但佔用空間大。在ASCII碼前面補8個bit位就是Unicode碼
UTF-8碼 支持國際語言 Unicode的升級,兩者容易互相轉化。佔用空間小、適用性強。ASCII碼被UTF-8碼包含。

編碼方案使用情況表

編碼錶 當前使用情況 備註
ASCII碼
GB2312碼、GBK碼 中文的文件和中文網站,使用GBK、GB2312
Unicode碼 計算機內存中處理數據時使用的統一標準格式 Python3中,程序處理我們輸入的字符串使用Unicode編碼
UTF-8碼 數據在硬盤上存儲,或者網絡上傳輸時,用的UTF-8 因為節省空間。程序來轉換編碼。

基於上表,有時候面對不同編碼的數據,我們還需要手動操作實現編碼轉換。就要用到encode(編碼)decode(解碼)

編碼操作和解碼操作

編碼:encode()

語法:

'你想編碼的內容'.encode('你使用的編碼錶名稱')

用法:

print('一天打魚兩個月曬網的小石頭'.encode('utf-8'))
# b'\xe4\xb8\x80\xe5\xa4\xa9\xe6\x89\x93\xe9\xb1\xbc\xe4\xb8\xa4\xe4\xb8\xaa\xe6\x9c\x88\xe6\x99\x92\xe7\xbd\x91\xe7\x9a\x84\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'
print('I Love U'.encode('gbk'))
# b'I Love U'
print('小石頭'.encode('utf-8'))
# b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'

將上述人類語言編碼得到機器語言后的打印結果在註釋里。

字母b

這裏之所以有個字母b,代表他是bytes(字節)類型的數據。 可以用type()函數驗證一下:

print(type(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4')) # <class 'bytes'>

符號\x

另外,幾乎每個字母/数字前邊都有的\x,他的作用是分隔符,用來分隔一個字節和另一個字節。

這樣的分隔符,我們還見過:

<a href="https://www.baidu.com/s?wd=%e5%b0%8f%e7%9f%b3%e5%a4%b4" />

對比發現下邊兩段字符串,你有發現什麼奧妙么!:

%e5%b0%8f%e7%9f%b3%e5%a4%b4
\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4

%\x一樣,都是一種分隔符。只不過%是url中的、\x是python中的

解碼:decode()

語法:

'你想解碼的內容'.encode('你使用的編碼錶名稱')

用法:

print(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'.decode('UTF-8')) # 小石頭

::: warning 注意 你要解碼的內容得跟編碼時用的編碼錶一致。不然會報錯。 :::

也就是說,UTF-8編碼的字節就一定要用UTF-8的規則解碼,其他編碼同理,否則就會出現亂碼或者報錯的情況,

print(b'\xe5\xb0\x8f\xe7\x9f\xb3\xe5\xa4\xb4'.decode('GBK'))
# 把utf-8編碼的字符串用GBK來解碼,就報錯了。
# UnicodeDecodeError: 'gbk' codec can't decode byte 0xb4 in position 8: incomplete multibyte sequence

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

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

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

圖解MySQL索引(二)—為什麼使用B+Tree_網頁設計

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

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

失蹤人口回歸,近期換工作一波三折,耽誤了不少時間,從今開始每周更新~

索引是一種支持快速查詢的數據結構,同時索引優化也是後端工程師的必會知識點。各個公司都有所謂的MySQL”軍規“,其實這些所謂的優化和規定,並不是什麼高深的技術,只是要求大家正確建立和使用索引而已。工欲善其事必先利其器,想要正確運用索引,需要了解其底層實現原理,本文將探索關於索引的“是什麼”以及”為什麼“。

MySQL中關於索引的概念有很多,為了避免混淆,在上一篇文章中關於索引在不同維度分類設計到的一些名詞進行了解釋,如輔助索引,唯一索引,覆蓋索引,B+Tree索引…., 牆裂建議不明白的小夥伴可以先去看看圖解MySQL索引(上)—聊聊索引的分類,本文中關於索引類型的各種定義不再複述。

一,磁盤IO問題

1.1 磁盤IO

所謂磁盤IO,簡單來講就是就是將磁盤中的數據讀取到內存或者是從內存寫入磁盤。在系統開發與設計過程中,磁盤IO的瓶頸往往不可忽略,因為這是一個相對比較耗時的操作。

上圖是一個机械硬盤,雖然速度不如SSD,但是由於價格低廉,目前仍是主流的存儲介質。它的IO操作通常需要尋道,旋轉和傳輸三個步驟。

尋道,是指將讀寫磁頭移動到正確的磁道,尋道時間越短,IO操作越快,目前磁盤的平均尋道時間一般在3-15ms左右。

旋轉,是指將盤片旋轉到請求數據所在的扇區,這部分所需要的時間由硬盤的配置所決定。旋轉延遲由磁盤轉速所決定,也就是常說的7200轉和5400轉等。

例如,7200轉是指每分鐘可以旋轉7200圈,那麼旋轉一圈所需要的時間就是60*1000/7200 ≈ 8.33ms,而旋轉延遲通常取旋轉一周時間的1/2,也就是大約4.17ms。

傳輸,磁盤傳輸的速度通常在幾十到上百M每秒,假設速度為20M/s,要傳輸的數據為64kb,則傳輸時間則是 64 / 1024 / 20 * 1000 = 3.125ms。不過目前流行的SSD傳輸速度大幅度提升,SATA Ⅱ可以達到300M/s,傳輸速度往往遠小於前兩步操作所以傳輸時間往往可以忽略不記。

机械硬盤的連續讀寫性能很好,但隨機讀寫性能很差,這主要是因為磁頭移動到正確的磁道上需要時間,隨機讀寫時,磁頭需要不停的移動,時間都浪費在了磁頭尋址上,所以性能不高。

上述過程是對傳統机械磁盤IO延遲的粗略介紹,目的是告訴大家磁盤IO過程是個耗時的過程,內存操作往往與之速度不在同一個數量級。即使是目前比較流行的SSD,想必內存中數據讀取性能也差之千里。

1.2 局部性原理

由於磁盤IO是一個比較耗時的操作,而操作系統在設計時則定義一個空間局部性原則,局部性原理是指CPU訪問存儲器時,無論是存取指令還是存取數據,所訪問的存儲單元都趨於聚集在一個較小的連續區域中

在操作系統的文件系統中,數據也是按照page劃分的,一般為4k或8k。當計算機訪問一個地址數據時,不僅會加載當前數據所在的數據頁,還會將當前數據頁相鄰的數據頁一同加載到內存。而這個過程實際上只發生了1次磁盤IO,這個理論對於索引的數據結構設計非常有幫助。

二,索引數據結構演進

索引是一種支持快速查找的數據結構,在運用中往往還要求能夠支持順序查詢,而常見的數據結構有很多,比如數組,鏈表,二叉樹,散列表,二叉搜索樹,平衡搜索二叉樹,紅黑樹,跳錶等。僅僅從數據結構那麼為什麼選擇B+Tree呢?

首先對於數組,鏈表這種線性表來說,適合存儲數據,而不是查找數據,同樣,對於普通二叉樹來說,數據存儲沒有特定規律,所以也不適合。

2.1 哈希索引不能滿足業務需求

哈希(Hash)是一種非常快的查找方法,在一般情況下這種查找的時間複雜度為O(1),即一般僅需要一次查找就能定位到數據。在各種編程語言和數據庫中應用廣泛,如Java,Python,Redis中都有使用。

哈希結構在單條數據的等值查詢是性能非常優秀,但是只能用來搜索等值的查詢, 對於範圍查詢,模糊查詢(最左前綴原則)都不支持,所以不能很好的支持業務需求;所以MySQL並沒有顯式支持Hash索引,而是根據數據的訪問頻次和模式自動的為熱點數據頁建立哈希索引,稱之為自適應哈希索引。

並且由於哈希函數的隨機性,Hash索引通常都是隨機的內存訪問,對於緩存不友好,會造成頻繁的磁盤IO。

2.2 二叉搜索樹退化成鏈表

二叉搜索樹,如果左子樹不為空,則左子樹上所有節點均小於根節點,右子樹節點均大於根節點;由其屬性不難看出,這種樹非常適合數據查找。不過有個致命的缺點是二叉搜索樹的樹型取決於數據的輸入順序,極端情況下會退化成鏈表。

2.3 平衡二叉搜索樹過於嚴格

為了解決上述問題,平衡二叉搜索樹就誕生了。在保證數據順序的基礎上,又能維持樹型,保證每個節點的左右子樹高度相差不超過1。

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

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

不過由於要維持樹的平衡,在插入數據時可能要進行大量的數據移動。平衡搜索二叉樹過於嚴格的平衡要求,導致幾乎每次插入和刪除節點都會破壞樹的平衡性,使得樹的性能大打折扣。

2.4 紅黑樹高度過高,磁盤IO次數頻繁

有沒有一種數據結構,即能夠快速查找數據,又不需要頻繁的調整以維持平衡呢?這時紅黑樹就閃亮登場了。

紅黑樹和其他二叉搜索樹類似, 都是在進行插入和刪除操作時通過特定操作保持二叉查找樹的性質,從而獲得較高的查找性能。與之不同的是,紅黑樹的平衡性並不像平衡搜索二叉樹一樣嚴格的同時,又能保證在, O(log n) 時間複雜度內做查找和刪除。

紅黑樹通過改變節點的顏色,可以有效減少節點的移動次數,由於紅黑樹的實現比較複雜,本文不再展開,感興趣的小夥伴可以去深入學習。

看似紅黑樹是一種完美的數據結構,能夠勝任索引的工作。但MySQL並未使用其作為索引的實現,主要原因在於紅黑樹的深度過大,數據檢索時造成磁盤IO頻繁,假設一個每個節點存儲在一個page中,樹的高度為10,則每次檢索可能就需要進行10次磁盤IO。

2.5 B-Tree不支持順序查詢

B-Tree是一種自平衡的多叉搜索樹,一個節點可以擁有兩個以上的子節點。適合讀寫相對大的數據塊的存儲系統,例如磁盤。

由於MySQL索引一般都存儲在內存中,如果使用B-Tree作為索引的話,索引和數據存儲在一塊,分佈在各個節點中;而內存資源往往比較寶貴,一定內存的情況下可以存儲的索引數量相對有限,畢竟每條數據的大小一般遠大於索引列的大小,導致內存使用率不高。

數據查詢過程中往往會有順序查詢,而B-Tree和紅黑樹對於順序查詢並不友好

2.6 為什麼選B+Tree

B+Tree是在B-Tree基礎上演進而來的。與之不同的是B+Tree的數據頁只存儲在恭弘=叶 恭弘子節點中,並且恭弘=叶 恭弘子節點之間通過指針相連,為雙向鏈表結構。

B+Tree的優點可以分為以四個:

  1. 充分利用空間局部性原理,適合磁盤存儲。

  2. 樹的高度很低,能夠在存儲大量數據情況下,進行較少的磁盤IO【見下文介紹】。

  3. 能夠很好支持單值,範圍查詢,有序性查詢。

  4. 索引和數據分開存儲,讓更多的索引存儲在內存中。

三,MySQL中索引實現

3.1 巧妙利用B+Tree

MySQL中的數據存儲通常以Page為單位,俗稱數據頁,每個Page對應B+Tree的一個節點。頁是InnoDB磁盤管理的最小單位,默認每個數據頁的大小為16kb,也可以通過參數innodb_page_size將頁的大小設置成其他值。

數據庫的頁大小和操作系統類似,是指存放數據時,每一塊連續區域數據的大小。比如一個1M的數據存放在數據庫中時, 需要大概64個頁來存放(1024=64*16)。如果是在操作系統上安裝的數據庫,最好將數據庫頁大小設置為操作系統頁大小的倍數,才是最佳設置。

3.2 樹的高度-有效減少磁盤IO次數

通常情況下,一張MySQL表中有成千上萬條數據,而磁盤IO次數往往與數的高度成正比。默認情況下一個Page的大小為16kb,由於每個Page中數據通過指針相連,且每個指針大小為6字節。

在工作中,我們通常使用長度為8個字節的bigint類型作為主鍵id的類型。已知,每一條數據都會包含一個6字節的指針(數據頁中每條記錄都有指向下一條記錄的指針,但是沒有指向上一條記錄的指針);所以一條索引數據大約佔用8+6=14個字節,一個Page中能存儲16 * 1024 / 14 ≈ 1170條索引數據。高度為2的B+Tree大約能存儲1170*16 = 18720條這樣的記錄。同理,高度為3的B+Tree的B+Tree大約能存儲1170 * 1170 * 16 = 21902400,大約兩千萬條數據。 (每個節點大約能存儲1170條記錄,可以理解為此時B+Tree為1170叉樹)

例如,要檢索id=008的數據,則需要進行三次磁盤IO找到對應的數據頁(最多三次,因為Page可能在緩存中),然後在數據頁中進行二分查找,定位到對應的記錄。

四,總結

大家耳熟能詳的B+Tree索引是一種非常優秀的數據結構,也是面試熱點問題。本文從數據結構和磁盤IO兩個方面分析了為什麼使用B+Tree,以及MySQL的InnoDB存儲引擎的索引實現。在筆者面試過程中,被問到MySQL索引時通常也是從底層數據結構特點以及結合磁盤IO兩個角度去分析,屢試不爽。

學習一門技術時,我們不僅要知道其優點更要了解其缺點和瓶頸。在分析MySQL索引的實現時,不妨試試從其他數據結構的缺點入手!在Redis中使用跳錶實現了有序集合Zset,同樣支持高效的順序查詢,對比MySQL索引實現,跳錶能否替換B+Tree?如果不行,是因為什麼呢?

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

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

廣場舞,俘獲多少人的心_台中搬家公司

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

“我和我的祖國”全國廣場舞成果彙報展演現場 傅德偉 攝

沒有哪個舞蹈像廣場舞有着這樣廣泛的群眾基礎,不管是在四季分明的北方,還是綠樹常青的南方,不管是城市還是鄉村,只要有一塊空地,都可以見到隨着音樂翩翩起舞的人群。簡單易學、沒有門檻、有益身心……廣場舞以親民的姿態走進了大眾的視野。

近些年,隨着國家相關政策的推出,廣場舞擾民等問題已不再突出。健康有序、积極向上的廣場舞正在煥發新的光彩,它將如何俘獲億萬國民的心?

“大媽”標籤漸漸淡去

廣場舞還是大媽們的專利么?如果你還這樣認為,你就out啦。

雖然,廣場舞的潮流前線中,大多是大媽們的身影,但隨着我國經濟水平提高,社會老齡化加劇,基本生活得到保障的老年人退休后,有了大把的空閑時間。基於鍛煉身體的需要,脫胎於健身操的廣場舞越來越受到老年人垂青,不僅有大媽,大爺們也越來越活躍在舞蹈的人群中。廣場舞正在籠絡男性以及其他年齡層的“人心”。

記者在“我和我的祖國”——文化新生活全國廣場舞展演中見到了來自河北張家口的武志剛,他所在的廣場舞隊伍中男性佔據了近三分之一。為什麼會跳廣場舞?武志剛說,以前男性退休后,大多打打牌、遛遛鳥,或者宅在家中。看着跳廣場舞的人每天都朝氣蓬勃的,他們也就加入進來,一可以鍛煉身體,二可以結識朋友,逐漸找到了屬於自己的朋友圈。

“廣場舞=大媽們的運動”這種傳統印象正在改變,全國各地的年輕人也開始對廣場舞趨之若鶩。街舞、拉丁舞、爵士舞等流行舞種被年輕人帶到廣場。江西省贛州市上猶縣文化館青年藝術團的16歲女孩張萍,通過跳舞來傾訴內心。為了提升舞蹈水平,她加入廣場舞團隊,在這裏既體味到長輩們的關愛,也可以學到新的舞蹈技巧。

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

近些年,青少年在廣場舞比賽中越來越頻繁地現身。據記者了解,青少年通過參加比賽增加了自我鍛煉和自我展示的機會,“多一個舞台,多一次鍛煉,就可以離自己的舞蹈夢想更近一步。”這是他們共同的想法。

健身需求逐漸多元

對跳廣場舞的老年群體進行調研,你會發現,他們選擇跳廣場舞不僅是為了健身,更重要的是可以“健心”。

退休后的生活單調而孤獨,不是圍著兒孫轉,就是抬腳跑醫院,老年人逐漸在單一的生活中失去了自己的社交圈,這是現代社會中需要關注的問題之一。作為一種集體舞蹈,廣場舞帶給老年人集體的溫暖,在一幫志同道合的舞友中,老年人獲得的不僅是身心愉悅,更是社會歸屬感的重拾。

令人驚喜的是,年輕人除了通過跳舞釋放壓力外,他們走上廣場還與街舞的流行有關:2018年,中國首部原創交響樂街舞作品《黃河》在“荷花獎”當代舞、現代舞評選中榮獲“當代舞獎”;北京舞蹈學院成立了中國街舞文化研究中心;《這就是街舞》《熱血街舞團》等多款街舞綜藝節目大熱;大學校園裡,街舞社團也越來越多……街舞場所與廣場舞場所的重合,是廣場上出現年輕人的重要原因。

從“草台”跳上了舞台

經過多年的發展,由群眾自發組織並在大江南北迅速風靡的廣場舞,已經不只是在公園和廣場上簡單呈現,它們登上了更大的舞台綻放魅力。

成立於2000年的湖北武漢的农民藝術團,是一個平均年齡55歲的群眾廣場舞團隊。最初他們只是在公園裡、廣場上進行活動,如今,由於廣場舞的火熱,他們多次受邀參加活動,足跡遍及北京、上海、香港、澳門等城市。中國舞蹈家協會民族民間舞蹈專業委員會副主任阮蘭玉說,廣場舞不僅體現出基層的文化,更能展現出群眾积極向上、蓬勃活躍的精神面貌。隨着新時代老百姓對生活的新期待和對美的追求的提升,他們更希望走上更大的舞台。

追求藝術性將成未來發展趨勢

對廣場舞未來的發展,舞者與專家各有期許。來自北京的蔣艷芝希望將來的廣場舞有更多專業老師的指導,“草台班子”已經不能滿足她們的需求,她們想要向更高水平邁進。來自江西的朱麗娟認為,越來越多的人加入廣場舞隊伍,需要充足的場地和空間以供使用。中國文化館協會舞蹈委員會主任委員、江蘇省南通市文化館館長曹錦揚則認為,廣場舞是一種表演形式,不是一個舞種。只要動作優美、音樂悅耳、風格濃郁、難易適度就可以歸入廣場舞。集藝術性、審美性、民族性、風格性、娛樂性、科學性為一體,一定是未來廣場舞的發展方向。(記者 杜潔芳 王彬)

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

文化澳門 風景正好_網頁設計公司

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

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

演員在澳門大三巴牌坊前進行澳門國際青年舞蹈節巡遊表演。
  新華社記者 張金加攝

澳門是一座文化城市,歷史和文化是澳門的財富。幾百年來,中西文化的交流與嬗變,賦予澳門獨特的文化魅力。

回歸祖國后,得益於“一國兩制”安排,澳門多元文化碰撞融合,交相輝映,來自世界各地的人在此和諧共處。在中央的支持下,澳門充分發揮自身優勢,助力國際人文交流,促進世界文明互鑒。

中西世界的萬花筒

“我們常說澳門有3張名片:一是2005年,澳門歷史城區被列入《世界遺產名錄》,成為中國第31個世界文化遺產;二是2017年,聯合國教科文組織授予澳門‘創意城市·美食之都’稱號;三是澳門多彩的非物質文化遺產,澳門的文化便蘊含在這些珍貴的文化遺產中。” 澳門特區政府文化局局長穆欣欣介紹,澳門是中西文化交融之地,擁有得天獨厚的歷史文化優勢。

“漫步在澳門的大街小巷,原汁原味的中西建築隨處可見,許多擁有幾百年歷史。穿梭其中,滄桑的歷史和鮮活的生命力共存,這種感覺很奇妙。”在北京工作的閆先生告訴記者,他去過澳門4次,最大的感受是,澳門城市雖小卻包羅萬象,古今中外各種元素在這小小的萬花筒里,組合出了各種風景。

媽閣廟、觀音堂、蓮峰廟等中式廟宇飽含古老中華神韻,給人以歷史的厚重感;澳門市政廳廣場等西式建築則色彩明快,熱情洋溢,風情萬種,讓人彷彿置身南歐小城。來自印度、巴基斯坦、葡萄牙、莫桑比克等世界各地的人生活於此,多元開放的文化讓他們過得愜意自然。

“你可以在澳門的超市買到葡萄牙各式各樣的食物,我常去的那家超市的老闆還會講葡語。”澳門大學的葡萄牙語教授萊昂諾爾·塞亞布拉已經在澳門待了32個年頭,她的兒子在澳門出生長大,畢業后也選擇了在澳門工作生活。

澳門藝術節、音樂節、國際龍舟賽、格蘭披治大賽車……這些承載着澳門歷史文化的活動,每年吸引數不勝數的遊客到訪並參与其中,向世界展示着澳門的獨特魅力。

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

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

既要傳承也要創新

雖說是中西文化交融,但中華文化一直是澳門的主流。“西方文化影響主要體現在建築風格、多元飲食、習俗外貌等表層,澳門人思維、觀念的中庸尚和、忠孝禮義,依然來自中華文化,它才是支撐澳門文化的基石與主流。”全國政協委員、澳門地產業總商會會長鍾小健這樣定義澳門的文化特性。

澳門有“澳門神像雕刻”“澳門哪吒信俗項目”“澳門道教科儀音樂”“澳門媽祖信俗項目”“粵劇”“南音說唱”“魚行醉龍節”和“涼茶製作技藝”等8項非物質文化遺產入選國家級名錄,它們是澳門對中華民族傳統文化傳承與弘揚的重要見證。“保護好它們是我們的使命。在保護的前提下,我們做文化推廣,促進文化的傳承和創新。”穆欣欣說,近年來,澳門不僅每年舉行文化遺產嘉年華,而且從2010年開始,着手將一些文物建築活化,如恭弘=叶 恭弘挺將軍故居、孫中山在澳門行醫的中西藥局舊址、冼星海紀念館等。這些展館連同林則徐紀念館、鄭家大屋等,一同訴說著澳門與中華歷史文化的血脈連接。

回歸祖國后,澳門與內地的頻繁交流,為文化澳門注入更新元素。澳門藝術博物館和故宮博物院連續20年合辦的故宮專題文物特展,成為澳門人文化生活的重要部分。據文化和旅遊部副部長張旭介紹,黨的十八大以來,內地與澳門互派優秀藝術團體和藝術家,積极參加各自舉辦的區域性、國際性文化活動,項目年均交流量達180項,交流人數近3000人次,2018年較2012年交流項目增長10%,交流人數增長30%,不僅豐富當地民眾文化生活,更為自身文化發展注入活力。

着力建設“人文灣區”

炫目的色彩、特色的服裝、精彩的表演、多元的文化,這是日前剛剛結束的2019澳門國際幻彩大巡遊帶給觀眾的感受。澳門開埠400多年,文化開放而包容。在這裏,你可以聽到教堂的鐘聲與寺廟的鐘鼓聲此起彼伏,也可以看到耶穌聖像出遊活動與媽祖誕辰的祭拜活動同時進行。春節、中秋節等中國的傳統節日,慶祝活動十分隆重;聖誕節、復活節等西方節日,活動氛圍也頗有聲勢。

因此,澳門注重利用其文化特色來推動東西方文化交流。“澳門的藝文活動都着重突出多元融合的文化特徵,推動不同民族、不同國家之間的互動互鑒,溝通心靈,融合情感。” 澳門婦女聯合總會會長賀定一表示。

正是得益於多元文化的共融,今年出台的《粵港澳大灣區發展規劃綱要》明確將“建設以中華文化為主流、多元文化共存的交流合作基地”作為澳門的發展定位之一。這讓澳門文化界人士備感振奮,既是對澳門歷史上文化功能的肯定,更賦予澳門文化發展新的使命和機遇,讓更多人有機會一睹“文化澳門”風采。

“一直以來,澳門文化局致力於粵港澳共同推進中華優秀傳統文化傳承與發展,發揮三地地域相近、文脈相親的優勢,合作舉辦各類文化遺產展覽、展演活動,大力支持弘揚以粵劇、龍舟、武術、醒獅等為代表的嶺南文化,彰顯獨特文化魅力。”穆欣欣表示,此外,文化局還致力於推進澳門與葡語國家的文化合作,已經連續兩年成功舉辦“相約澳門——中葡文化藝術節”。隨着粵港澳大灣區建設的不斷深化和加強,澳門正逐漸把中葡文化交流成果帶進“人文灣區”的建設之中,進行融合和互補。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

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

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

三菱重工全系列新陣容亮相,以解疫後攀升的商用、家用空調需求_租車

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

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

相比於全球各國,台灣在疫情方面顯然控制得當更加穩定,雖然在經濟景氣方面略有影響但很慶幸的是台灣的商業行為依然如常,在後疫情時代景氣逐步升溫也帶動市場活絡,各種商辦、工廠、店面、民宿、旅館等承租、開業與興建帶動各種空調設備的需求。上洋產業全新引進三菱重工空調全系列產品陣容,滿足各種商業空間的多元需求。

三菱重工全系列新陣容亮相,以解疫後攀升的商用、家用空調需求

三菱重工以「超速冷、超耐用、超美型、超效能」四大優點受到市場信賴與愛用,無論是商用還是家用產品都是許多人喜愛的選擇品牌,這回上洋產業還禮聘林志玲來作為三菱重工品牌代言人。運用重工級的精密技術開發出有如噴射引擎的鋸齒狀尖端渦輪風扇,以低能耗產生強勁氣流,提供室內機長達 20 米的送風距離,加上以潛水艇概念的延伸設計,最小化室內機運轉噪音。渦捲式壓縮機採用多排氣孔式壓縮技術,讓空調運轉保持超高效率,同時全新的 VTCC 節能功能,可省下 34% 以上的能源消耗,結合重工業精密計算電能使用的技術,PAC 商用空調全面皆達一級能效標準。

全系列產品針對各種不同的族群而生:

  • 家庭、小型工作室
    可採用具備優雅簡約外型的壁掛式室內機,符合現代人對家電用品的美感設計邀要求,三組獨立導風扇與極致靜音技術,讓工作與生活環境恆溫舒適,同時具備節能優點,為業主經省荷包。

  • 發展期公司
    空調搭配設計必須考量到未來業務、人員與空間擴張的可能性來做彈性調整,三菱重工的家用多聯系列可達到最高 183% 連結率;另外, VRF 商用的 Micro KX 系列擁有 150% 連結率,高度僅有 84.5 公分,小巧不佔空間,安裝更方便。

  • 成熟期企業
    在大面積或多隔間的辦公空間中,則可選用 KXZ Lite 室外機,120% 連結率提供全區使用之充足馬力,全規格一級能效;搭配 FDT 嵌入式四方吹室內機,搭載 AirFlex 導風葉片,可讓送風擴散更寬管之外還能避免直吹造成人體不適。最新搭載的升降面板在後續更便於檢修維護,同時可以搭配全屋空氣活化機來促進空氣對流,室內空氣可維持充足的含氧量,並且透過 HEPA 與活性碳濾網有效過濾空氣異味與 PM2.5 等有害粒子,以清新乾淨的好空氣打造優質工作環境。

    ※超省錢租車方案

    商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

  • 長時間或 24 小時營運連鎖商店
    可採用 PAC 商用系列,輕鋼架天花板的空間上可安裝輕巧的 FDTC 迷你四方吹系列,剛好是一格輕鋼架的尺寸。對於潮濕的商用空間,像是火鍋店、美容院等則可採用 FDE 懸吊式系列,避免室內機節滴水的現象。而像是海產店、熱炒店首選 FDF 落地箱式室內機,外觀簡約輕巧,深度僅有 32公分,可將寸土寸金的店面利用率最大化。

  • 整棟商辦建案
    適用於 VRF 商用全系列,其中 FDU 高靜壓吊隱式室內機最適合挑高環境,FDUM 中低靜壓吊隱式室內機則適合寬廣環境,兩者皆內建排水泵,容易安裝保養與維護。而 FDUH 微型吊隱式室內機擁有 57 公分寬的機身,可輕易隱藏於天花板的空間中,最適合各大飯店客房選用。

倘若你的辦公空間、家中正好要選配空調產品,上洋產業引進了三菱重工依照各種空間需求打造的全系列產品,讓你夠依照實際需要從中挑選出最適合的品項,讓生活與工作環境更舒適、更健康。

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

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

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

【JVM】垃圾回收的四大算法_貨運

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

GC垃圾回收

JVM大部分時候回收的都是新生代(伊甸區+倖存0區+倖存1區)。按照回收的區域可以分成兩種類型:Minor GC和Full GC(MajorGC)。

  • Minor GC:只針對新生代區域的GC,大多數Java對象的存活率都不高,Minor GC非常頻繁,回收速度快。
  • Full GC:發生在老年代的GC,經常會伴隨至少一次的Minor GC(但不一定會),Full GC掃描的範圍更廣泛,Full GC的速度比Minor GC慢10倍以上。

 

 

GC四大算法

引用計數法

對於單個對象來說,當有引用發生,引用計數器就+1;當丟失引用,引用計數器就-1。當引用數減到0的時候,說明對象不再有用,被垃圾回收。引用計數法缺點是每次對對象賦值都要維護引用計數器,且計數器本身也有一定的消耗,難以處理引用循環(例如:對象雙方互相引用,但實際上二者為空,此時雙方引用都不為空)。JVM的實現一般不採用這種方式。

複製算法

年輕代中使用的是Minor GC,這種Minor GC採用的是複製算法。複製的思想是將內存分為2快,每次只用其中一塊,當這一塊內存用完,就將或者的對象複製到另一塊上面,複製算法不會產生內存碎片

HotSpot JVM中年輕代可以分成三個部分:Eden區、Survivor0區,Survivor1區,默認比例為8:1:1。Survivor的兩個區在邏輯上可以視為from區和to區,每次GC後會交換from區和to區,在Eden區和from區滿之前,to區始終是為空的區。如果to區也被填滿了,所有對象移動到老年代。

新創建的對象一般會被分配到伊甸區,經過一次Minor GC后,如果對象還存活,就會被移到Survivor區。from區的對象如果繼續存活,且能夠被另一塊倖存區to區容納,則使用複製算法將這些仍然存活的的對象複製到另一塊倖存區to區中,然後清理使用過的Eden和from區(下一次分配就從to區開始,to區成為下一次GC的from區),且這些對象的年齡設置為1,以後對象在倖存區每經歷一次Minor GC,對象的年齡就會+1,當對象的年齡到達某個閾值的時候,這些對象就會進入老年代。(閾值默認是15,可以通過-XX:MaxTenuringThreshhold來設定對象在新生代在存活的次數)。

這種算法的優點了不會產生內存碎片,缺點是浪費內存空間,在HotSpot虛擬機中8:1:1的比例下,可用內存為80%+10%,有10%的內存會被浪費掉。如果對象存活率很高,就需要將所有對象都複製一邊,並重置引用地址。

標記清除(Mark-Sweep)

老年代一般是由標記清除 或者 標記清除和標記整理的混合實現的。

標記清除算法分為兩個步驟,先標記出要回收的對象,然後統一回收這些對象。

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

優點是節約內存空間,不需要額外空間。缺點是兩次掃描,標記和清除的效率都不高,耗時嚴重。標記清除後會產生大量不連續的內存碎片。內存碎片會導致以後程序需要分配大對象的時候,找不到足夠的連續內存,導致提前觸發GC。

 標記整理(Mark-Compact)

和標記清除一樣,先標記出要回收的對象,然後讓存活對象都向一端移動,直接清理掉端邊界 以外的內存。

優點是沒有內存碎片,缺點是效率不高,需要標記存活對象還要整理存活對象的引用地址,從效率上來說是不如複製算法的。

還有一種折衷的方案,將標記清除和標記整理算法相結合,一般直接標記清除,當GC達到一定次數的時候,進行一次標記整理,從而減少了移動對象的成本,又有處理內存碎片的步驟。

總結

效率排名:複製算法>標記清除>標記整理

內存整齊度:複製算法=標記整理>標記清理

內存利用率:標記整理=標記清理>複製算法

四種算法各有優劣,一般的JVM實現會採用分代收集算法,根據不同代所具有的不同特點使用不同的算法。

年輕代的特點是區域較小,對象存活率低,適合使用複製算法。複製算法的效率只和當前存活對象的大小有關,適用於年輕代的回收,內存利用率不高的問題HotSopt通過兩個survivor的設計進行和緩解,新生代可用容量為80%+10%,只有10%的內存被浪費掉。

老年代的特點是區域較大,對象存活率高,適合使用標記清除/標記整理算法。

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

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

還在花錢加裝導航?教授實測哪家手機導航最好用!_台中搬家公司

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

實際上,這幾款比較熱門的導航軟件,無論是定位的精準性還是導航時的精準性,都是值得肯定的,這幾位选手最大的區別,莫過於在路線、額外服務、以及使用便利性上。搜狗地圖推薦指數:在使用軟件過程中,你能發現搜狗地圖的界面設計十分簡潔,在主界面上所能用到功能主要有4個,分別是身邊服務、路線查詢、導航功能、軟件服務。

前言

認為,導航已經成為了我們生活息息相關的一個軟件,隨着導航軟件不斷地更新、換代,無論是我們駕車、還是坐公共交通工具、還是步行或者打車,一個導航軟件就能幫到你,然而市面上哪一款導航使用最為方便好用?為此特意將市面上使用最多的導航軟件下載到了手機上,進行了為期幾天的日常體驗。

從汽車的角度先來說說導航的發展,首先汽車上也具備GpS導航功能,但是使用效率比較低,而且帶有GpS導航功能的一般都要高配車型甚至是頂配車型。可以這麼說,其實買高配的人並不多,所以路上跑的車在原廠狀況下基本是不具備導航功能。

雖然在馬雲家的商店裡有着格式各樣的導航配件,從幾百到幾千元,讓人挑得眼花繚亂。但是這一行水很深,市場上充斥着大量的三無產品、山寨產品,先不說屏幕的分辨率低的問題,而且系統大多都是卡頓、反應緩慢,提供的導航軟件在實際體驗上更是慘不忍睹,也可以這麼說,為什麼現在導航市場還是這麼火熱?在看來大多數車主都是為了那一塊大屏幕。中控加裝一個大屏幕怎麼也比光禿禿的收音機更好看,更高檔次。

拋開山寨廠導航機的問題,雖然車載導航最大的問題就是不能像手機那樣更新迅速,而且更新還得跑回4S店更新有可能要收錢以外,相比手機導航,車載導航信號更為穩定,就算在部分較為偏僻地方手機沒信號,這時候航依舊會擔演一個重要的角色。

相比那一個功能少、反應遲鈍、更新慢的車載導航,手機導航更為靈活。你只需要用一個手機架,就能把手機固定在一個你喜歡的位置,成為導航的角色。另外對於手機這一種聯網的產物來說,導航是可以進行實時更新,並且能夠讓車主知道前方路況。

現在很多比較年輕的司機朋友都喜歡開車就開着導航,然而對於很大一部分老司機來說,實際上對於這一種軟件是持有一種保留的意見。最關鍵的一點就是他們總是認為導航總是繞遠路。又或者去同一個目的地,導航所指路線跟自己預想的不一樣,於是認為導航不準確,實際上雖然導航有可能帶你走遠了幾公里,卻能準確帶你到達目的地。但如果你對道路不熟悉,你卻有可能要多跑上幾十公里,又浪費更多的時間,這就划算了?

回到正題,為了能夠更好地將使用感受告訴大家,已經將App軟件中心下載了那幾款最實用、使用率最高的幾款導航軟件:搜狗地圖、騰訊地圖、高德地圖、百度地圖、蘋果地圖。

實際上,這幾款比較熱門的導航軟件,無論是定位的精準性還是導航時的精準性,都是值得肯定的,這幾位选手最大的區別,莫過於在路線、額外服務、以及使用便利性上。

搜狗地圖

推薦指數:

在使用軟件過程中,你能發現搜狗地圖的界面設計十分簡潔,在主界面上所能用到功能主要有4個,分別是身邊服務、路線查詢、導航功能、軟件服務;在實際體驗中,在導航界面清晰簡潔,而且提供了導航路段的擁堵信息,實際使用感覺良好;另外在軟件服務中,還提供違章查詢、繳款功能、網約車功能、地鐵路線功能、以及霧霾地圖,在功能完善度方面還算齊全。在最常用的導航功能中,在實際使用上跟普通導航並沒太大區別,

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

無論是路口提醒還是測速提醒也都清晰地提示,而且在行駛過程中路面上的路況,譬如塞車,均會提醒。但是在計劃路線的時間上,搜狗地圖所預計的時間都會偏長。

騰訊地圖

推薦指數:

作為騰訊出品的導航軟件在設計方面依舊走簡約風格,但是與上一款導航軟件有別,最常用到的導航地圖功能擺在了最顯眼的位置,使用頻率低的周邊服務等則被放到了發現功能的界面上。另外,在功能服務上,具備違章查詢功能(不具備代繳款功能),網約車服務。在最常使用導航功能,整體布局簡潔、清晰,但是提醒項目卻很多,譬如路上的加油站地點、測速攝像頭都會在路線上表明,另外在攝像頭圖標上還會標明限速標誌,對於我們的行駛時非常有幫助的。另外地圖還提供电子狗功能,實際使用效果一樣好用。

高德地圖

推薦指數:

高德地圖相信是這幾款導航中使用群眾比較多的一款軟件,在實際體驗上,高德地圖無論是實時路況還是時間計算上,都算準確,但是在軟件操作方面,雖然高德地圖都追求簡約,但是在實際操作方面卻發現軟件有種難以下手的感覺,需要一定的時間熟練。但是這款產品的功能非常全面,不但能根據不同交通工具提供了多種路線方案,而且還支持語音導航,能夠即時提示攝像頭、擁堵狀況的路況信息,駕駛時還是比較省心。

百度地圖

推薦指數:

實際上,在體驗各導航軟件時,所使用的導航軟件便是百度地圖,在操作界面方面,認為百度地圖更為簡便,而且每次使用所以提供的路線以及路面上的事實路況均比較準確,在功能性軟件方面也比較齊全,百度地圖也可以說是能媲美高德地圖的一個存在。但是由於使用時間比較長,卻發現百度地圖每月總有幾天的某個時段(譬如上下班時間)是搜索不到衛星信號的,這是扣分項。但是百度地圖卻又一個模式叫做路線雷達模式,在清楚路線的情況下能供更多的路線選擇,並能標出時差。在實用性功能上百度地圖和高德地圖一樣都有語音包選擇,而且語音包豐富度很高,只是語音包並不能完全更換系統聲音,而是在特定的情況譬如超速、前方有測速攝像頭這些特定情況語音包才會起到作用,最後成為一個導航兩種聲音。

蘋果地圖

推薦指數:

作為唯一一款手機原生導航,蘋果地圖可以是做得相當牛逼,整一個界面設計極致簡單,而且操作簡便,而且作為IOS系統下專屬導航,整個界面流暢、功能操作簡便,另外蘋果地圖還提供廣東話語音提示,對於廣東的朋友確實比較體貼。

總結

各款導航都能很好地提供實時交通信息,而提示都會使用綠色、黃色、紅色、深紅色…,只遇過最塞的就是深紅色,至於有沒有更深的紅色,還待探究。而經過多天的使用,得出綠色、黃色路況都是能夠選擇的,而遇到紅色路況也不用左過多的擔心(都是小塞一下),但是碰到深紅色,那就得小心,有可能你會為此塞上一段時間。總結這麼多款導航,其實最好使的,認為還是屬於高德地圖、蘋果地圖兩個,首要原因那就是各大車型都開始普及互聯繫統,先有蘋果的Carplay,再有安卓的AppLink等等一些列的互聯繫統,能夠將特定的導航軟件映射到中控大屏幕上,所以哪一款導航軟件支持汽車中控屏的映射功能,註定受眾更大。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家