




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、如何用如何用JavaJava進(jìn)行高性能網(wǎng)站開發(fā)進(jìn)行高性能網(wǎng)站開發(fā)Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧生成對象時,合理分配空間和大?。荷蓪ο髸r,合理分配空間和大?。篔ava中的很多類都有它的默認(rèn)的空間分配大小,對于一些有大小的對象的初始化,應(yīng)該預(yù)計對象的大小,然后使用進(jìn)行初始化。例如:我們在使用例如:我們在使用Vector,當(dāng)聲明,當(dāng)聲明Vector vectnew Vector()時,系統(tǒng)調(diào)用:時,系統(tǒng)調(diào)用:public Vector() / 缺省構(gòu)造函數(shù)缺省構(gòu)造函數(shù)this(10); / 容量是容量是 10;缺省分配缺省分配10個對象大小容量。當(dāng)執(zhí)行個對象大小容量。當(dāng)執(zhí)行add方法時,
2、可以看到具體實現(xiàn)為:方法時,可以看到具體實現(xiàn)為:.public synchronized boolean add(Object o) modCount+;ensureCapacityHelper(elementCount+1);elementDataelementCount+ =o;return true;Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧生成對象時,合理分配空間和大?。荷蓪ο髸r,合理分配空間和大?。簆rivate void ensureCapacityHelper(int minCapacity) int oldCapacity = elementData.length;if (mi
3、nCapacity oldCapacity) Object oldData = elementData;int newCapacity = (capacityIncrement 0) ? (oldCapacity + capacityIncrement) :(oldCapacity * 2);if (newCapacity minCapacity) newCapacity = minCapacity;elementData = new ObjectnewCapacity;System.arraycopy(oldData, 0, elementData, 0, elementCount);我們可
4、以看到,當(dāng)Vector大小超過原來的大小時,一些代碼的目的就是為了做容量的擴充,在預(yù)先知道該Vector大小的話,可以指定其大小,避免容量擴充的開銷。 Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧優(yōu)化循環(huán)體:優(yōu)化循環(huán)體:循環(huán)是比較重復(fù)運行的地方,如果循環(huán)次數(shù)很大,循環(huán)體內(nèi)不好的代碼對效率的影響就會被放大而變的突出。讓我們看看下面的代碼片:.Vector vect = new Vector(1000);.for( inti=0; ivect.size(); i+).for循環(huán)部分改寫成:循環(huán)部分改寫成:int size = vect.size();for( int i=0; isize; i+).如
5、果size=1000,就可以減少1000次size()的系統(tǒng)調(diào)用開銷,避免了循環(huán)體重復(fù)調(diào)用。Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧優(yōu)化循環(huán)體:優(yōu)化循環(huán)體:再看如下的代碼片:再看如下的代碼片:.for (int i = 0;i 100000;i+)if (i%10 = 9) . / 每十次執(zhí)行一次每十次執(zhí)行一次改寫成也可以提高效率:改寫成也可以提高效率:.for(inti =0,j =10; i100000; i+,j-)if(j = 0). / 每十次執(zhí)行一次每十次執(zhí)行一次j = 10;所以,當(dāng)有較大的循環(huán)時,應(yīng)該檢查循環(huán)內(nèi)是否有效率不高的地方,尋找更優(yōu)的方案加以改進(jìn)。 Java程序性能優(yōu)化
6、技巧程序性能優(yōu)化技巧少用少用newnew初始化一個實例:初始化一個實例:盡量少用new來初始化一個類的實例,當(dāng)一個對象是用new進(jìn)行初始化時,其構(gòu)造函數(shù)鏈的所有構(gòu)造函數(shù)都被調(diào)用到,所以new操作符是很消耗系統(tǒng)資源的,new一個對象耗時往往是局部變量賦值耗時的上千倍。同時,當(dāng)生成對象后,系統(tǒng)還要花時間進(jìn)行垃圾回收和處理。當(dāng)new創(chuàng)建對象不可避免時,注意避免多次的使用new初始化一個對象。盡量在使用時再創(chuàng)建該對象。如:NewObject object = new NewObject();int value;if(i0 )value =object.getValue();Java程序性能優(yōu)化技巧程序
7、性能優(yōu)化技巧少用少用newnew初始化一個實例:初始化一個實例:上面一段代碼可以修改為:上面一段代碼可以修改為:int value;if(i0 )NewObject object = new NewObject();Value =object.getValue();另外,應(yīng)該盡量重復(fù)使用一個對象,而不是聲明新的同類對象。一個重用對象的方法是改變對象的值,如可以通過setValue之類的方法改變對象的變量達(dá)到重用的目的。 Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧選擇合適的方法調(diào)用:選擇合適的方法調(diào)用:在Java中,一切都是對象,如果有方法(Method)調(diào)用,處理器先要檢查該方法是屬于哪個對象,
8、該對象是否有效,對象屬于什么類型,然后選擇合適的方法并調(diào)用??梢詼p少方法的調(diào)用,同樣一個方法:public void CallMethod(int i )if( i =0 )return;. / 其他處理其他處理如果直接調(diào)用,如果直接調(diào)用,int i = 0;.CallMethod(i);Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧選擇合適的方法調(diào)用:選擇合適的方法調(diào)用:上面的代碼,就應(yīng)該寫成:int i = 0;.if( i =0 )CallMethod(i);不影響可讀性等情況下,可以把幾個小的方法合成一個大的方法。另外,在方法前加上final,private關(guān)鍵字有利于編譯器的優(yōu)化。 Jav
9、a程序性能優(yōu)化技巧程序性能優(yōu)化技巧異常處理技巧:異常處理技巧:異常是Java的一種錯誤處理機制,對程序來說是非常有用的,但是異常對性能不利。拋出異常首先要創(chuàng)建一個新的對象,并進(jìn)行相關(guān)的處理,造成系統(tǒng)的開銷,所以異常應(yīng)該用在錯誤處理的情況,不應(yīng)該用來控制程序流程,流程盡量用while,if等處理。在不是很影響代碼健壯性的前提下,可以把幾個try/catch塊合成一個。盡量使用局部變量和靜態(tài)變量:盡量使用局部變量和靜態(tài)變量:盡量使用局部變量,調(diào)用方法時傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時變量都保存在棧(Stack) 中,速度較快。其他變量,如靜態(tài)變量、實例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。盡
10、量使用靜態(tài)變量,即加修飾符static,如果類中的變量不會隨他的實例而變化,就可以定義為靜態(tài)變量,從而使他所有的實例都共享這個變量。 同步處理技巧:同步處理技巧:同步主要出現(xiàn)在多線程的情況,為多線程同時運行時提供對象數(shù)據(jù)安全的機制,多線程是比較復(fù)雜話題,應(yīng)用多線程也是為了獲得性能的提升,應(yīng)該盡可能減少同步。另外,如果需要同步的地方,可以減少同步的代碼段,如只同步某個方法或函數(shù),而不是整個代碼。Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧盡可能的使用盡可能的使用JavaJava自身提供的自身提供的APIAPI:Java的API一般都做了性能的考慮,如果完成相同的功能,優(yōu)先使用API而不是自己寫的代碼
11、,如數(shù)組復(fù)制通常的代碼如下:int size = 1000;String strArray1 = new Stringsize;String strArray2 = new Stringsize;for(inti=0;isize;i+) / 賦值賦值strArray1 = (new String(Array: + i);for(inti=0;isize;i+) / 復(fù)制復(fù)制strArray2=(new String(String)a);Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧盡可能的使用盡可能的使用JavaJava自身提供的自身提供的APIAPI:上面那段代碼,如果使用Java提供的API,就
12、可以提高性能:int size = 1000;String strArray1 = new Stringsize;String strArray2 = new Stringsize;for(inti=0;isize;i+) / 賦值strArray1 = (new String(Array: + i);System.arraycopy(strArray1,0,strArray2,0,size); / 復(fù)制同樣的一個規(guī)則是,當(dāng)有大量數(shù)據(jù)的復(fù)制時,應(yīng)該使用System.arraycopy()。 Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧盡量減少盡量減少I/OI/O操作:操作: 輸入/輸出(I/O)包
13、括很多方面,我們知道,進(jìn)行I/O操作是很消耗系統(tǒng)資源的。程序中應(yīng)該盡量少用I/O操作。使用時可以注意: . 合理控制輸出函數(shù)System.out.println()對于大多時候是有用的,特別是系統(tǒng)調(diào)試的時候,但也會產(chǎn)生大量的信息出現(xiàn)在控制臺和日志上,同時輸出時,有序列化和同步的過程,造成了開銷。特別是在發(fā)行版中,要合理的控制輸出,可以在項目開發(fā)時,設(shè)計好一個Debug的工具類,在該類中可以實現(xiàn)輸出開關(guān),輸出的級別,根據(jù)不同的情況進(jìn)行不同的輸出的控制。盡量使用緩存:盡量使用緩存:讀寫內(nèi)存要比讀寫硬盤上的文件要快很多,應(yīng)盡可能使用緩沖,以便直接從內(nèi)存中讀取數(shù)據(jù)。盡可能使用帶有Buffer的類代替沒
14、有Buffer的類,如可以用BufferedReader 代替Reader,用BufferedWriter代替Writer來進(jìn)行處理I/O操作。同樣可以用BufferedInputStream代替InputStream都可以獲得性能的提高 Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧盡量不使用同步:盡量不使用同步:Servlet是多線程的,以處理不同的請求,基于前面同步的分析,如果有太多的同步就失去了多線程的優(yōu)勢了。不用保存太多的信息在不用保存太多的信息在HttpSession中中很多時候,存儲一些對象在HttpSession中是有必要的,可以加快系統(tǒng)的開發(fā),如網(wǎng)上商店系統(tǒng)會把購物車信息保存在該用
15、戶的Session中,但當(dāng)存儲大量的信息或是大的對象在會話中時,是有害的,特別是當(dāng)系統(tǒng)中用戶的訪問量很大,對內(nèi)存的需求就會很高。具體開發(fā)時,在這兩者之間應(yīng)作好權(quán)衡。Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧清除清除SESSIONSESSION:通常情況,當(dāng)達(dá)到設(shè)定的超時時間時,同時有些Session沒有了活動,服務(wù)器會釋放這些沒有活動的Session,. 不過這種情況下,特別是多用戶并訪時,系統(tǒng)內(nèi)存要維護(hù)多個的無效Session。當(dāng)用戶退出時,應(yīng)該手動釋放,回收資源,實現(xiàn)如下:.HttpSession theSession = request.getSession();/ 獲取當(dāng)前Session
16、if(theSession != null)theSession.invalidate(); / 使該Session失效。緩存緩存HomeHome接口:接口:EJB庫使用Enterprise Bean 的客戶端通過它的Home接口創(chuàng)建它的實例??蛻舳四芡ㄟ^JNDI訪問它。服務(wù)器通過Lookup方法來獲取。JNDI是個遠(yuǎn)程對象,通過RMI方式調(diào)用,對它的訪問往往是比較費時的。所以,在設(shè)計時可以設(shè)計一個類專門用來緩存Home接口,在系統(tǒng)初始化時就獲得需要的Home接口并緩存,以后的引用只要引用緩存即可。Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧使用快速度的使用快速度的JdbcJdbc驅(qū)動:驅(qū)動:JD
17、BC API包括兩種實現(xiàn)接口形式,一種是純Java實現(xiàn)的驅(qū)動,一種利用ODBC驅(qū)動和數(shù)據(jù)庫客戶端實現(xiàn),具體有四種驅(qū)動模式: 第一類:JDBC-ODBC橋,再加上ODBC驅(qū)動程序。第一類JDBC驅(qū)動程序是JDBC-ODBC橋再加上一個ODBC驅(qū)動程序。建議第一類驅(qū)動程序只用于原型開發(fā),而不要用于正式的運行環(huán)境。橋接驅(qū)動程序由Sun提供,它的目標(biāo)是支持傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)。Sun為該軟件提供關(guān)鍵問題的補丁,但不為該軟件的最終用戶提供支持。一般地,橋接驅(qū)動程序用于已經(jīng)在ODBC技術(shù)上投資的情形,例如已經(jīng)投資了Windows應(yīng)用服務(wù)器。盡管Sun提供了JDBC-ODBC橋接驅(qū)動程序,但由于ODBC會在客戶
18、端裝載二進(jìn)制代碼和數(shù)據(jù)庫客戶端代碼,這種技術(shù)不適用于高事務(wù)性的環(huán)境。另外,第一類JDBC驅(qū)動程序不支持完整的Java命令集,而是局限于ODBC驅(qū)動程序的功能,這種驅(qū)動方式也叫胖客戶,主要用于低并發(fā)請求,大數(shù)據(jù)量傳輸?shù)膽?yīng)用。Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧使用快速度的使用快速度的JdbcJdbc驅(qū)動:驅(qū)動:第二類:本機API,部分是Java的驅(qū)動程序。第二類JDBC驅(qū)動程序是本機API的部分Java代碼的驅(qū)動程序,用于把JDBC調(diào)用轉(zhuǎn)換成主流數(shù)據(jù)庫API的本機調(diào)用。這類驅(qū)動程序也存在與第一類驅(qū)動程序一樣的性能問題,即客戶端載入二進(jìn)制代碼的問題,而且它們被綁定了特定的平臺。第二類驅(qū)動程序要
19、求編寫面向特定平臺的代碼,主流的數(shù)據(jù)庫廠商,例如Oracle和IBM,都為它們的企業(yè)數(shù)據(jù)庫平臺提供了第二類驅(qū)動程序,使用這些驅(qū)動程序的開發(fā)者必須及時跟進(jìn)不同數(shù)據(jù)庫廠商針對不同操作系統(tǒng)發(fā)行的各個驅(qū)動程序版本。另外,由于第二類驅(qū)動程序沒有使用純Java的API,把Java應(yīng)用連接到數(shù)據(jù)源時,往往必須執(zhí)行一些額外的配置工作。很多時候,第二類驅(qū)動程序不能在體系結(jié)構(gòu)上與大型主機的數(shù)據(jù)源兼容;即使做到了兼容,效果也是比較差。Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧使用快速度的使用快速度的JdbcJdbc驅(qū)動:驅(qū)動:第一類和第二類驅(qū)動的比較Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧使用快速度的使用快速度的Jd
20、bcJdbc驅(qū)動:驅(qū)動:第三類:面向數(shù)據(jù)庫中間件的純Java驅(qū)動程序。第三類JDBC驅(qū)動程序是面向數(shù)據(jù)庫中間件的純Java驅(qū)動程序,JDBC調(diào)用被轉(zhuǎn)換成一種中間件廠商的協(xié)議,中間件再把這些調(diào)用轉(zhuǎn)換到數(shù)據(jù)庫API。第三類JDBC驅(qū)動程序的優(yōu)點是它以服務(wù)器為基礎(chǔ),也就是不再需要客戶端的本機代碼,這使第三類驅(qū)動程序要比第一、二兩類快。另外,開發(fā)者還可以利用單一的驅(qū)動程序連接到多種數(shù)據(jù)庫。Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧使用快速度的使用快速度的JdbcJdbc驅(qū)動:驅(qū)動:第四類:直接面向數(shù)據(jù)庫的純Java驅(qū)動程序。 第四類JDBC驅(qū)動程序是直接面向數(shù)據(jù)庫的純Java驅(qū)動程序,即所謂的“瘦”(t
21、hin)驅(qū)動程序,它把JDBC調(diào)用轉(zhuǎn)換成某種直接可被DBMS使用的網(wǎng)絡(luò)協(xié)議,這樣,客戶機和應(yīng)用服務(wù)器可以直接調(diào)用DBMS服務(wù)器。對于第四類驅(qū)動程序,不同DBMS的驅(qū)動程序不同。因此,在一個異構(gòu)計算環(huán)境中,驅(qū)動程序的數(shù)量可能會比較多。但是,由于第四類驅(qū)動程序具有較高的性能,能夠直接訪問DBMS,所以這一問題就不那么突出了, 這種驅(qū)動方式,主要用于高并發(fā),低數(shù)據(jù)量請求的應(yīng)用中。Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧使用快速度的使用快速度的JdbcJdbc驅(qū)動:驅(qū)動:第三類和第四類驅(qū)動的比較Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧使用Jdbc鏈接池為了提高訪問數(shù)據(jù)庫的性能,我們還可以使用JDBC
22、2.0的一些規(guī)范和特性,JDBC是占用資源的,在使用數(shù)據(jù)庫連接時可以使用連接池Connection Pooling,避免頻繁打開、關(guān)閉Connection。而我們知道,獲取Connection是比較消耗系統(tǒng)資源的。Connection緩沖池:當(dāng)一個應(yīng)用程序關(guān)閉一個數(shù)據(jù)庫連接時,這個連接并不真正釋放而是被循環(huán)利用,建立連接是消耗較大的操作,循環(huán)利用連接可以顯著的提高性能,因為可以減少新連接的建立。一個通過DataSource獲取緩沖池獲得連接,并連接到一個CustomerDB數(shù)據(jù)源的代碼演示如下:Context ctx = new InitialContext();DataSource data
23、Source = (DataSource) ctx.lookup(jdbc/CustomerDB);Connection conn = dataSource.getConnection(password,username);Java程序性能優(yōu)化技巧程序性能優(yōu)化技巧緩存緩存DataSorceDataSorce一個DataSource對象代表一個實際的數(shù)據(jù)源。這個數(shù)據(jù)源可以是從關(guān)系數(shù)據(jù)庫到表格形式的文件,完全依賴于它是怎樣實現(xiàn)的,一個數(shù)據(jù)源對象注冊到JNDI名字服務(wù)后,應(yīng)用程序就可以從JNDI服務(wù)器上取得該對象,并使用之和數(shù)據(jù)源建立連接。通過上面的例子,我們知道DataSource是從連接池獲得連
24、接的一種方式,通過JNDI方式獲得,是占用資源的。為了避免再次的JNDI調(diào)用,可以系統(tǒng)中緩存要使用的DataSource。即時關(guān)閉使用過的資源即時關(guān)閉使用過的資源互聯(lián)網(wǎng)應(yīng)用系統(tǒng)一般是并發(fā)的系統(tǒng),在每次申請和使用完資源后,應(yīng)該釋放供別人使用,使用完成后應(yīng)該保證徹底的釋放。如何利用如何利用Java開發(fā)高性能、高并發(fā)開發(fā)高性能、高并發(fā)Web應(yīng)用應(yīng)用架構(gòu)選型架構(gòu)選型在網(wǎng)站W(wǎng)eb應(yīng)用開發(fā)中,系統(tǒng)的整體架構(gòu)是決定網(wǎng)站性能、穩(wěn)定性、并發(fā)、可擴展性的關(guān)鍵因素。下面以世界著名網(wǎng)站應(yīng)用軟件提供商CoreMediaCMS系統(tǒng)為例,進(jìn)行架構(gòu)分析如何利用如何利用Java開發(fā)高性能、高并發(fā)開發(fā)高性能、高并發(fā)Web應(yīng)用應(yīng)用
25、架構(gòu)選型架構(gòu)選型CoreMediaCMS將整個應(yīng)用分成四成架構(gòu),每一層都可以獨立于其他層而正常運行,每一層都可以分布式布署,極大的提高了應(yīng)用系統(tǒng)的穩(wěn)定性、可擴展性、支持高并發(fā)的要求,每一次之前通過中間件Corba進(jìn)行穩(wěn)定的傳輸數(shù)據(jù)。如何利用如何利用Java開發(fā)高性能、高并發(fā)開發(fā)高性能、高并發(fā)Web應(yīng)用應(yīng)用開發(fā)框架的選型開發(fā)框架的選型充分利用開源框架,可以大大提高開發(fā)效率。很多初級開發(fā)者,都采用DB+JavaBean+JSP這種初級的開發(fā)模式,而現(xiàn)在主要使用Struts、Spring等MVC開發(fā)框架。常用開發(fā)框架構(gòu)選型有:Struts、Spring、Webwork等。天極傳媒選擇的開發(fā)框架是:Struts+Spring+iBatis,在這個開發(fā)框架里,充分利用了Struts、Spring各自己的優(yōu)點,可以選擇StutsMVC,也可以選擇Spring MVC。如何利用如何利用Java開發(fā)高性能、高并發(fā)開發(fā)高性能、高并發(fā)Web應(yīng)用應(yīng)用分級存儲分級存儲)數(shù)據(jù)庫數(shù)據(jù)分級存儲:將經(jīng)常訪問的數(shù)據(jù)和訪問頻度低的數(shù)據(jù),分別存放到不同的分區(qū),
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字編碼器課件
- 鐵路市場營銷市場營銷發(fā)展的新趨勢88課件
- 鐵路貨物行李包裹損失責(zé)任范圍與免責(zé)條件課件
- 鐵路信號與通信設(shè)備接發(fā)列車工作99課件
- 中國世界名畫創(chuàng)意美術(shù)課件
- 中東多元文化課件圖片
- 高速公路建設(shè)工程合同協(xié)議
- 版?zhèn)€人住宅買賣合同樣本
- 貨物采購合同范文
- 農(nóng)產(chǎn)品批發(fā)市場購銷合同
- 腹針療法完整
- 人工智能在市場營銷中的應(yīng)用與前景展望
- 來料檢驗規(guī)范-(適用于電子廠)(共11份)
- 2024年推動全球治理體系變革
- 介紹國際商事仲裁與調(diào)解
- 第三單元《屈原列傳》《蘇武傳》《過秦論》《伶官傳序》文言知識綜合檢測題 統(tǒng)編版高中語文選擇性必修中冊
- 【典型例題系列】2023-2024學(xué)年三年級數(shù)學(xué)下冊重點培優(yōu)第三單元復(fù)式統(tǒng)計表(原卷版)人教版
- 居民死亡醫(yī)學(xué)證明(推斷)書+空白表
- 2023年04月北京外國語大學(xué)管理及教輔崗位招考聘用筆試歷年難易錯點考題含答案帶詳細(xì)解析
- (全)美容師(技師)作業(yè)模擬考試題庫附答案(內(nèi)部題庫2024版)
- 讓時間陪你慢慢變富
評論
0/150
提交評論