后端技术:这35 个细节,提升你的 Java 代码质量
1、盡量指定類、方法的final修飾符
帶有final修飾符的類是不可派生的。在Java核心API中,有許多應(yīng)用final的例子,例如java.lang.String,整個(gè)類都是final的。
為類指定final修飾符可以讓類不可以被繼承,為方法指定final修飾符可以讓方法不可以被重寫。
如果指定了一個(gè)類為final,則該類所有的方法都是final的。
Java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)所有的final方法,內(nèi)聯(lián)對(duì)于提升Java運(yùn)行效率作用重大,具體參見(jiàn)Java運(yùn)行期優(yōu)化。?
此舉能夠使性能平均提高50%?。
2、盡量重用對(duì)象
特別是String對(duì)象的使用,出現(xiàn)字符串連接時(shí)應(yīng)該使用StringBuilder/StringBuffer代替。
由于Java虛擬機(jī)不僅要花時(shí)間生成對(duì)象,以后可能還需要花時(shí)間對(duì)這些對(duì)象進(jìn)行垃圾回收和處理,因此,生成過(guò)多的對(duì)象將會(huì)給程序的性能帶來(lái)很大的影響。
3、盡可能使用局部變量
調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧中速度較快,其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆中創(chuàng)建,速度較慢。
另外,棧中創(chuàng)建的變量,隨著方法的運(yùn)行結(jié)束,這些內(nèi)容就沒(méi)了,不需要額外的垃圾回收。
4、及時(shí)關(guān)閉流
Java編程過(guò)程中,進(jìn)行數(shù)據(jù)庫(kù)連接、I/O流操作時(shí)務(wù)必小心,在使用完畢后,及時(shí)關(guān)閉以釋放資源。
因?yàn)閷?duì)這些大對(duì)象的操作會(huì)造成系統(tǒng)大的開銷,稍有不慎,將會(huì)導(dǎo)致嚴(yán)重的后果。
5、盡量減少對(duì)變量的重復(fù)計(jì)算
明確一個(gè)概念,對(duì)方法的調(diào)用,即使方法中只有一句語(yǔ)句,也是有消耗的,包括創(chuàng)建棧幀、調(diào)用方法時(shí)保護(hù)現(xiàn)場(chǎng)、調(diào)用方法完畢時(shí)恢復(fù)現(xiàn)場(chǎng)等。所以例如下面的操作:
for?(int?i =?0; i <?list.size(); i++) {...}建議替換為:
for?(int?i =?0,?int?length =?list.size(); i < length; i++) {...}這樣,在list.size()很大的時(shí)候,就減少了很多的消耗
6、盡量采用懶加載的策略,即在需要的時(shí)候才創(chuàng)建
例如:
String str =?"aaa";if?(i ==?1) { list.add(str); }建議替換為:
if?(i ==?1) { String str =?"aaa"; list.add(str); }7、慎用異常
異常對(duì)性能不利。
拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對(duì)象,Throwable接口的構(gòu)造函數(shù)調(diào)用名為fillInStackTrace()的本地同步方法,fillInStackTrace()方法檢查堆棧,收集調(diào)用跟蹤信息。
只要有異常被拋出,Java虛擬機(jī)就必須調(diào)整調(diào)用堆棧,因?yàn)樵谔幚磉^(guò)程中創(chuàng)建了一個(gè)新的對(duì)象。異常只能用于錯(cuò)誤處理,不應(yīng)該用來(lái)控制程序流程。
8、不要在循環(huán)中使用try…catch…,應(yīng)該把其放在最外層
除非不得已。
如果毫無(wú)理由地這么寫了,只要你的領(lǐng)導(dǎo)資深一點(diǎn)、有強(qiáng)迫癥一點(diǎn),八成就要罵你為什么寫出這種垃圾代碼來(lái)了。
9、如果能估計(jì)到待添加的內(nèi)容長(zhǎng)度,為底層以數(shù)組方式實(shí)現(xiàn)的集合、工具類指定初始長(zhǎng)度
比如ArrayList、LinkedLlist、StringBuilder、StringBuffer、HashMap、HashSet等等,以StringBuilder為例:
(1)StringBuilder() // 默認(rèn)分配16個(gè)字符的空間
(2)StringBuilder(int size) // 默認(rèn)分配size個(gè)字符的空間
(3)StringBuilder(String str) // 默認(rèn)分配16個(gè)字符+str.length()個(gè)字符空間
可以通過(guò)類(這里指的不僅僅是上面的StringBuilder)的來(lái)設(shè)定它的初始化容量,這樣可以明顯地提升性能。
比如StringBuilder吧,length表示當(dāng)前的StringBuilder能保持的字符數(shù)量。
因?yàn)楫?dāng)StringBuilder達(dá)到最大容量的時(shí)候,它會(huì)將自身容量增加到當(dāng)前的2倍再加2,無(wú)論何時(shí)只要StringBuilder達(dá)到它的最大容量,它就不得不創(chuàng)建一個(gè)新的字符數(shù)組然后將舊的字符數(shù)組內(nèi)容拷貝到新字符數(shù)組中—-這是十分耗費(fèi)性能的一個(gè)操作。
試想,如果能預(yù)估到字符數(shù)組中大概要存放5000個(gè)字符而不指定長(zhǎng)度,最接近5000的2次冪是4096,每次擴(kuò)容加的2不管,那么:
(1)在4096 的基礎(chǔ)上,再申請(qǐng)8194個(gè)大小的字符數(shù)組,加起來(lái)相當(dāng)于一次申請(qǐng)了12290個(gè)大小的字符數(shù)組,如果一開始能指定5000個(gè)大小的字符數(shù)組,就節(jié)省了一倍以上的空間;
(2)把原來(lái)的4096個(gè)字符拷貝到新的的字符數(shù)組中去。
這樣,既浪費(fèi)內(nèi)存空間又降低代碼運(yùn)行效率。所以,給底層以數(shù)組實(shí)現(xiàn)的集合、工具類設(shè)置一個(gè)合理的初始化容量是錯(cuò)不了的,這會(huì)帶來(lái)立竿見(jiàn)影的效果。
但是,注意,像HashMap這種是以數(shù)組+鏈表實(shí)現(xiàn)的集合,別把初始大小和你估計(jì)的大小設(shè)置得一樣,因?yàn)橐粋€(gè)table上只連接一個(gè)對(duì)象的可能性幾乎為0。
初始大小建議設(shè)置為2的N次冪,如果能估計(jì)到有2000個(gè)元素,設(shè)置成new HashMap(128)、new HashMap(256)都可以。
10、當(dāng)復(fù)制大量數(shù)據(jù)時(shí),使用System.arraycopy()命令
11、乘法和除法使用移位操作
例如:
for?(val =?0;?val?<?100000;?val?+=?5) { a?= val *?8; b?= val /?2; }用移位操作可以極大地提高性能,因?yàn)樵谟?jì)算機(jī)底層,對(duì)位的操作是最方便、最快的,因此建議修改為:
for?(val =?0;?val?<?100000;?val?+=?5) { a?= val <<?3; b?= val >>?1; }移位操作雖然快,但是可能會(huì)使代碼不太好理解,因此最好加上相應(yīng)的注釋。
12、循環(huán)內(nèi)不要不斷創(chuàng)建對(duì)象引用
例如:
for?(int i =?1; i <= count; i++) {Object?obj =?new?Object(); }這種做法會(huì)導(dǎo)致內(nèi)存中有count份Object對(duì)象引用存在,count很大的話,就耗費(fèi)內(nèi)存了,建議為改為:
Object?obj =?null; for?(int i =?0; i <= count; i++) { obj =?new?Object(); }這樣的話,內(nèi)存中只有一份Object對(duì)象引用,每次new Object()的時(shí)候,Object對(duì)象引用指向不同的Object罷了,但是內(nèi)存中只有一份,這樣就大大節(jié)省了內(nèi)存空間了。
13、基于效率和類型檢查的考慮,應(yīng)該盡可能使用array,無(wú)法確定數(shù)組大小時(shí)才使用ArrayList
14、盡量使用HashMap、ArrayList、StringBuilder,除非線程安全需要,否則不推薦使用Hashtable、Vector、StringBuffer,后三者由于使用同步機(jī)制而導(dǎo)致了性能開銷
15、不要將數(shù)組聲明為public static final
因?yàn)檫@毫無(wú)意義,這樣只是定義了引用為static final,數(shù)組的內(nèi)容還是可以隨意改變的,將數(shù)組聲明為public更是一個(gè)安全漏洞,這意味著這個(gè)數(shù)組可以被外部類所改變。
16、盡量在合適的場(chǎng)合使用單例
使用單例可以減輕加載的負(fù)擔(dān)、縮短加載的時(shí)間、提高加載的效率,但并不是所有地方都適用于單例,簡(jiǎn)單來(lái)說(shuō),單例主要適用于以下三個(gè)方面:
(1)控制資源的使用,通過(guò)線程同步來(lái)控制資源的并發(fā)訪問(wèn)
(2)控制實(shí)例的產(chǎn)生,以達(dá)到節(jié)約資源的目的
(3)控制數(shù)據(jù)的共享,在不建立直接關(guān)聯(lián)的條件下,讓多個(gè)不相關(guān)的進(jìn)程或線程之間實(shí)現(xiàn)通信
17、盡量避免隨意使用靜態(tài)變量
要知道,當(dāng)某個(gè)對(duì)象被定義為static的變量所引用,那么gc通常是不會(huì)回收這個(gè)對(duì)象所占有的堆內(nèi)存的,如:
public?class?A { private?static?B b =?new?B(); }此時(shí)靜態(tài)變量b的生命周期與A類相同,如果A類不被卸載,那么引用B指向的B對(duì)象會(huì)常駐內(nèi)存,直到程序終止
18、及時(shí)清除不再需要的會(huì)話
為了清除不再活動(dòng)的會(huì)話,許多應(yīng)用服務(wù)器都有默認(rèn)的會(huì)話超時(shí)時(shí)間,一般為30分鐘。
當(dāng)應(yīng)用服務(wù)器需要保存更多的會(huì)話時(shí),如果內(nèi)存不足,那么操作系統(tǒng)會(huì)把部分?jǐn)?shù)據(jù)轉(zhuǎn)移到磁盤,應(yīng)用服務(wù)器也可能根據(jù)MRU(最近最頻繁使用)算法把部分不活躍的會(huì)話轉(zhuǎn)儲(chǔ)到磁盤,甚至可能拋出內(nèi)存不足的異常。
如果會(huì)話要被轉(zhuǎn)儲(chǔ)到磁盤,那么必須要先被序列化,在大規(guī)模集群中,對(duì)對(duì)象進(jìn)行序列化的代價(jià)是很昂貴的。
因此,當(dāng)會(huì)話不再需要時(shí),應(yīng)當(dāng)及時(shí)調(diào)用HttpSession的invalidate()方法清除會(huì)話。
19、實(shí)現(xiàn)RandomAccess接口的集合比如ArrayList,應(yīng)當(dāng)使用最普通的for循環(huán)而不是foreach循環(huán)來(lái)遍歷
這是JDK推薦給用戶的。JDK API對(duì)于RandomAccess接口的解釋是:實(shí)現(xiàn)RandomAccess接口用來(lái)表明其支持快速隨機(jī)訪問(wèn),此接口的主要目的是允許一般的算法更改其行為,從而將其應(yīng)用到隨機(jī)或連續(xù)訪問(wèn)列表時(shí)能提供良好的性能。
實(shí)際經(jīng)驗(yàn)表明,實(shí)現(xiàn)RandomAccess接口的類實(shí)例,假如是隨機(jī)訪問(wèn)的,使用普通for循環(huán)效率將高于使用foreach循環(huán);反過(guò)來(lái),如果是順序訪問(wèn)的,則使用Iterator會(huì)效率更高。
可以使用類似如下的代碼作判斷
if?(list?instanceof?RandomAccess) {?? for?(int i =?0; i <?list.size(); i++){}}elseIterator<?> iterator =?list.iterable();while?(iterator.hasNext()){iterator.next()} }foreach循環(huán)的底層實(shí)現(xiàn)原理就是迭代器Iterator,參見(jiàn)Java語(yǔ)法糖1:可變長(zhǎng)度參數(shù)以及foreach循環(huán)原理。
所以后半句”反過(guò)來(lái),如果是順序訪問(wèn)的,則使用Iterator會(huì)效率更高”的意思就是順序訪問(wèn)的那些類實(shí)例,使用foreach循環(huán)去遍歷。
20、使用同步代碼塊替代同步方法
這點(diǎn)在多線程模塊中的synchronized鎖方法塊一文中已經(jīng)講得很清楚了,除非能確定一整個(gè)方法都是需要進(jìn)行同步的,否則盡量使用同步代碼塊,避免對(duì)那些不需要進(jìn)行同步的代碼也進(jìn)行了同步,影響了代碼執(zhí)行效率。
21、將常量聲明為static final,并以大寫命名
這樣在編譯期間就可以把這些內(nèi)容放入常量池中,避免運(yùn)行期間計(jì)算生成常量的值。
另外,將常量的名字以大寫命名也可以方便區(qū)分出常量與變量
22、不要?jiǎng)?chuàng)建一些不使用的對(duì)象,不要導(dǎo)入一些不使用的類
這毫無(wú)意義,如果代碼中出現(xiàn)”The value of the local variable i is not used”、”The import java.util is never used”,那么請(qǐng)刪除這些無(wú)用的內(nèi)容
23、程序運(yùn)行過(guò)程中避免使用反射
反射是Java提供給用戶一個(gè)很強(qiáng)大的功能,功能強(qiáng)大往往意味著效率不高。
不建議在程序運(yùn)行過(guò)程中使用尤其是頻繁使用反射機(jī)制,特別是Method的invoke方法,如果確實(shí)有必要,一種建議性的做法是將那些需要通過(guò)反射加載的類在項(xiàng)目啟動(dòng)的時(shí)候通過(guò)反射實(shí)例化出一個(gè)對(duì)象并放入內(nèi)存—-用戶只關(guān)心和對(duì)端交互的時(shí)候獲取最快的響應(yīng)速度,并不關(guān)心對(duì)端的項(xiàng)目啟動(dòng)花多久時(shí)間。
24、使用數(shù)據(jù)庫(kù)連接池和線程池
這兩個(gè)池都是用于重用對(duì)象的,前者可以避免頻繁地打開和關(guān)閉連接,后者可以避免頻繁地創(chuàng)建和銷毀線程
25、使用帶緩沖的輸入輸出流進(jìn)行IO操作
帶緩沖的輸入輸出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,這可以極大地提升IO效率
26、順序插入和隨機(jī)訪問(wèn)比較多的場(chǎng)景使用ArrayList,元素刪除和中間插入比較多的場(chǎng)景使用LinkedList這個(gè),理解ArrayList和LinkedList的原理就知道了
27、不要讓public方法中有太多的形參
public方法即對(duì)外提供的方法,如果給這些方法太多形參的話主要有兩點(diǎn)壞處:
1、違反了面向?qū)ο蟮木幊趟枷?#xff0c;Java講求一切都是對(duì)象,太多的形參,和面向?qū)ο蟮木幊趟枷氩⒉黄鹾?/p>
2、參數(shù)太多勢(shì)必導(dǎo)致方法調(diào)用的出錯(cuò)概率增加
至于這個(gè)”太多”指的是多少個(gè),3、4個(gè)吧。
比如我們用JDBC寫一個(gè)insertStudentInfo方法,有10個(gè)學(xué)生信息字段要插如Student表中,可以把這10個(gè)參數(shù)封裝在一個(gè)實(shí)體類中,作為insert方法的形參。
28、字符串變量和字符串常量equals的時(shí)候?qū)⒆址A繉懺谇懊?/strong>
這是一個(gè)比較常見(jiàn)的小技巧了,如果有以下代碼:
String str =?"123"; if?(str.equals("123")) {...}建議修改為:String str =?"123"; if?("123".equals(str)) { ... }這么做主要是可以避免空指針異常
29、請(qǐng)知道,在java中if (i == 1)和if (1 == i)是沒(méi)有區(qū)別的,但從閱讀習(xí)慣上講,建議使用前者
平時(shí)有人問(wèn),”if (i == 1)”和”if (1== i)”有沒(méi)有區(qū)別,這就要從C/C++講起。
在C/C++中,”if (i == 1)”判斷條件成立,是以0與非0為基準(zhǔn)的,0表示false,非0表示true,如果有這么一段代碼:
int?i =?2; if?(i ==?1) { ... }else{ ... }C/C++判斷”i==1″不成立,所以以0表示,即false。但是如果:
int?i =?2;if?(i =?1) { ... }else{ ... }萬(wàn)一程序員一個(gè)不小心,把”if (i == 1)”寫成”if (i = 1)”,這樣就有問(wèn)題了。
在if之內(nèi)將i賦值為1,if判斷里面的內(nèi)容非0,返回的就是true了,但是明明i為2,比較的值是1,應(yīng)該返回的false。
這種情況在C/C++的開發(fā)中是很可能發(fā)生的并且會(huì)導(dǎo)致一些難以理解的錯(cuò)誤產(chǎn)生,所以,為了避免開發(fā)者在if語(yǔ)句中不正確的賦值操作,建議將if語(yǔ)句寫為:
int?i =?2;if?(1?== i) { ... }else{ ... }這樣,即使開發(fā)者不小心寫成了”1 = i”,C/C++編譯器也可以第一時(shí)間檢查出來(lái),因?yàn)槲覀兛梢詫?duì)一個(gè)變量賦值i為1,但是不能對(duì)一個(gè)常量賦值1為i。
但是,在Java中,C/C++這種”if (i = 1)”的語(yǔ)法是不可能出現(xiàn)的,因?yàn)橐坏懥诉@種語(yǔ)法,Java就會(huì)編譯報(bào)錯(cuò)”Type mismatch: cannot convert from int to boolean”。
但是,盡管Java的”if (i == 1)”和”if (1 == i)”在語(yǔ)義上沒(méi)有任何區(qū)別,但是從閱讀習(xí)慣上講,建議使用前者會(huì)更好些。
30、不要對(duì)數(shù)組使用toString()方法
看一下對(duì)數(shù)組使用toString()打印出來(lái)的是什么:
public?static?void?main(String[] args) {?int[]?is?=?new?int[]{1,?2,?3}; System.out.println(is.toString()); }結(jié)果是:
[I@18a992f本意是想打印出數(shù)組內(nèi)容,卻有可能因?yàn)閿?shù)組引用is為空而導(dǎo)致空指針異常。
不過(guò)雖然對(duì)數(shù)組toString()沒(méi)有意義,但是對(duì)集合toString()是可以打印出集合里面的內(nèi)容的,因?yàn)榧系母割怉bstractCollections重寫了Object的toString()方法。
31、不要對(duì)超出范圍的基本數(shù)據(jù)類型做向下強(qiáng)制轉(zhuǎn)型
這絕不會(huì)得到想要的結(jié)果:
public?static?void?main(String[] args) { long?l =?12345678901234L;int?i = (int)l;System.out.println(i); }我們可能期望得到其中的某幾位,但是結(jié)果卻是:
1942892530解釋一下。Java中l(wèi)ong是8個(gè)字節(jié)64位的,所以12345678901234在計(jì)算機(jī)中的表示應(yīng)該是:
0000 0000 0000 0000 0000 1011 0011 1010 0111 0011 1100 1110 0010 1111 1111 0010一個(gè)int型數(shù)據(jù)是4個(gè)字節(jié)32位的,從低位取出上面這串二進(jìn)制數(shù)據(jù)的前32位是:
0111 0011 1100 1110 0010 1111 1111 0010這串二進(jìn)制表示為十進(jìn)制1942892530,所以就是我們上面的控制臺(tái)上輸出的內(nèi)容。從這個(gè)例子上還能順便得到兩個(gè)結(jié)論
1、整型默認(rèn)的數(shù)據(jù)類型是int,long l = 12345678901234L,這個(gè)數(shù)字已經(jīng)超出了int的范圍了,所以最后有一個(gè)L,表示這是一個(gè)long型數(shù)。
順便,浮點(diǎn)型的默認(rèn)類型是double,所以定義float的時(shí)候要寫成””float f = 3.5f”
2、接下來(lái)再寫一句”int ii = l + i;”會(huì)報(bào)錯(cuò),因?yàn)閘ong + int是一個(gè)long,不能賦值給int
32、公用的集合類中不使用的數(shù)據(jù)一定要及時(shí)remove掉
如果一個(gè)集合類是公用的(也就是說(shuō)不是方法里面的屬性),那么這個(gè)集合里面的元素是不會(huì)自動(dòng)釋放的,因?yàn)槭冀K有引用指向它們。
所以,如果公用集合里面的某些數(shù)據(jù)不使用而不去remove掉它們,那么將會(huì)造成這個(gè)公用集合不斷增大,使得系統(tǒng)有內(nèi)存泄露的隱患。
33、把一個(gè)基本數(shù)據(jù)類型轉(zhuǎn)為字符串,基本數(shù)據(jù)類型.toString()是最快的方式、String.valueOf(數(shù)據(jù))次之、數(shù)據(jù)+””最慢
把一個(gè)基本數(shù)據(jù)類型轉(zhuǎn)為一般有三種方式,我有一個(gè)Integer型數(shù)據(jù)i,可以使用i.toString()、String.valueOf(i)、i+””三種方式,三種方式的效率如何,看一個(gè)測(cè)試:
public?static?void?main(String[] args) { int?loopTime =?50000; Integer i =?0;long?startTime = System.currentTimeMillis();for?(int?j =?0; j < loopTime; j++){String str = String.valueOf(i); } System.out.println("String.valueOf():"?+ (System.currentTimeMillis() - startTime) +?"ms"); startTime = System.currentTimeMillis();for?(int?j =?0; j < loopTime; j++) { String str = i.toString(); } System.out.println("Integer.toString():"?+ (System.currentTimeMillis() - startTime) +?"ms"); startTime = System.currentTimeMillis();for?(int?j =?0; j < loopTime; j++) { String str = i +?""; } System.out.println("i + \"\":"?+ (System.currentTimeMillis() - startTime) +?"ms"); }運(yùn)行結(jié)果為:
String.valueOf():11ms Integer.toString():5ms i +?"":25ms所以以后遇到把一個(gè)基本數(shù)據(jù)類型轉(zhuǎn)為String的時(shí)候,優(yōu)先考慮使用toString()方法。至于為什么,很簡(jiǎn)單:
1、String.valueOf()方法底層調(diào)用了Integer.toString()方法,但是會(huì)在調(diào)用前做空判斷
2、Integer.toString()方法就不說(shuō)了,直接調(diào)用了
3、i + “”底層使用了StringBuilder實(shí)現(xiàn),先用append方法拼接,再用toString()方法獲取字符串
三者對(duì)比下來(lái),明顯是2最快、1次之、3最慢
34、使用最有效率的方式去遍歷Map
遍歷Map的方式有很多,通常場(chǎng)景下我們需要的是遍歷Map中的Key和Value,那么推薦使用的、效率最高的方式是:
public?static?void?main(String[] args) { HashMap<String,?String> hm =?new?HashMap<String,?String>();hm.put("111",?"222");Set<Map.Entry<String,?String>> entrySet = hm.entrySet();Iterator<Map.Entry<String,?String>> iter = entrySet.iterator();?while?(iter.hasNext()){ Map.Entry<String,?String> entry = iter.next(); System.out.println(entry.getKey() +?"\t"?+ entry.getValue()); } }如果你只是想遍歷一下這個(gè)Map的key值,那用”Set keySet = hm.keySet();”會(huì)比較合適一些
35、對(duì)資源的close()建議分開操作
意思是,比如我有這么一段代碼:
try{ XXX.close(); YYY.close(); }catch?(Exception?e) {...}建議修改為:
try{ XXX.close(); }catch (Exception e) { ... }try{ YYY.close(); }catch (Exception e) { ... }雖然有些麻煩,卻能避免資源泄露。
我想,如果沒(méi)有修改過(guò)的代碼,萬(wàn)一XXX.close()拋異常了,那么就進(jìn)入了cath塊中了,YYY.close()不會(huì)執(zhí)行,YYY這塊資源就不會(huì)回收了,一直占用著,這樣的代碼一多,是可能引起資源句柄泄露的。
而改為上面的寫法之后,就保證了無(wú)論如何XXX和YYY都會(huì)被close掉。
收外國(guó)男騙中國(guó)妹子的炮?天朝竟有這樣一幫「女權(quán)組織」 2018-03-19 INSIGHT視界 From 酷玩實(shí)驗(yàn)室 微信號(hào):coollabs 其實(shí)我讀書的時(shí)候 也曾經(jīng)想過(guò)做一個(gè)女權(quán)主義者 但是后來(lái)發(fā)生了一些事情 讓我選擇了放棄 簡(jiǎn)單來(lái)說(shuō)是這么一個(gè)事情:我發(fā)現(xiàn) 女權(quán)對(duì)于一些中國(guó)人來(lái)說(shuō)是信仰 但是對(duì)另一些中國(guó)人來(lái)說(shuō)是生意 所謂的“偽女權(quán)”“女權(quán)癌” 大概就是這么回事 盡管早就有這樣的思想準(zhǔn)備 但讓我沒(méi)想到的是 這兩天,知乎上曝光了一件大事 還是讓我三觀震碎 我沒(méi)想到,這些“偽女權(quán)” 竟然已經(jīng)形成了黑色產(chǎn)業(yè)鏈 讓人細(xì)思恐極—— 國(guó)內(nèi)竟然有一群人 打著“女權(quán)主義”的名號(hào) 從事著組織賣淫的事情 在中國(guó)女生不知情的情況下 把她們賣給外國(guó)男人!事情是這樣的:根據(jù)知乎用戶伊利丹·怒風(fēng)的爆料 他在知乎和一個(gè)偽女權(quán)主義者 吵了起來(lái) 一開始,他可能以為這只是一個(gè) 腦子比較軸的偽女權(quán)主義者 所以兩人就吵了一通 本來(lái),他以為就是撕個(gè)逼而已 沒(méi)想到的是 這個(gè)偽女權(quán)主義者 可不是什么好惹的主 這個(gè)自稱為“瑪麗女王”的人 竟然在半個(gè)月中 持續(xù)不斷地騷擾他 而最夸張的是 瑪麗女王聲稱 自己有能力 讓伊利丹的QQ號(hào) 在5天之內(nèi)被封掉 到這里為止 伊利丹一直以為 他不過(guò)是碰到了一個(gè)杠精 但是萬(wàn)萬(wàn)沒(méi)想到 5天之后 他的QQ號(hào)竟然真的被永久封禁了!說(shuō)真的,這就有點(diǎn)嚇人了 這個(gè)不起眼的瑪麗女王 竟然還能操控別人的QQ賬號(hào)被封?難不成,她真的背后有人?伊利丹這才意識(shí)到 自己好像惹到了一個(gè)組織 他去扒了扒這個(gè)瑪麗女王的QQ空間 這才發(fā)現(xiàn) 自己簡(jiǎn)直捅出一個(gè)馬蜂窩:這個(gè)人平時(shí)干的 竟然是把中國(guó)女生 賣給外國(guó)男人的皮肉生意!真的,我本來(lái)以為 我是一個(gè)見(jiàn)過(guò)不少套路的人 但沒(méi)想到 這一套操作 真的是驚為天人 簡(jiǎn)單來(lái)說(shuō)是這樣的 首先,瑪麗女王自稱是“女權(quán)主義者” 但是實(shí)際上她的言論 宣傳的卻是 中國(guó)男人配不上中國(guó)女人 她甚至惡意辱罵中國(guó)男人 恨不得中國(guó)男人全部死光 連自己的爸爸都不放過(guò) 但是,這么做對(duì)她有什么好處呢?很簡(jiǎn)單 罵完中國(guó)男人以后 接下來(lái)她就說(shuō)—— 既然中國(guó)男人這么差勁 那就找外國(guó)男人吧!于是,她就經(jīng)常發(fā)布外國(guó)男人的介紹 看起來(lái)是一個(gè)熱心的媒婆 還在各種QQ和微信群里 散播此類信息 但是看到這里 我們不難發(fā)現(xiàn)有點(diǎn)問(wèn)題 看看其中這些不堪入目的措辭 這并不是普通的介紹男友啊!這簡(jiǎn)直是在拉皮條啊!果然,伊利丹發(fā)現(xiàn) 瑪麗女王真的在 拉皮條的過(guò)程中 收外國(guó)男人的錢!下面是聊天記錄實(shí)錘:而且,請(qǐng)注意—— 在這個(gè)過(guò)程中 她會(huì)收外國(guó)男人的錢 但是錢不給中國(guó)女生 卻落到了她自己的腰包 于是一個(gè)詭異的情況出現(xiàn)了:中國(guó)妹子 并不知道收錢這回事 還以為是正常交友 而外國(guó)男人 卻都交了錢 很可能認(rèn)為自己是在買春!額,也就是說(shuō) 在中國(guó)女孩不知情的情況下 她們被“賣”給了外國(guó)男人 而好處費(fèi) 卻全都進(jìn)了瑪麗女王的腰包... 我真的是沒(méi)見(jiàn)過(guò)這種操作 這說(shuō)輕了是騙炮 說(shuō)重了,已經(jīng)可以算是賣淫了吧?我想請(qǐng)熟悉刑法的朋友們看看 這個(gè)瑪麗女王 至少應(yīng)該算是個(gè) 介紹組織賣淫罪吧?而且,從伊利丹曝光的資料看來(lái) 這個(gè)組織規(guī)模不小 瑪麗女王甚至把外國(guó)男生的信息 建了一個(gè)完整的表格 有詳細(xì)的個(gè)人資料、照片 可以說(shuō) 是一條非常完整的產(chǎn)業(yè)鏈 那如果按照這樣操作 外國(guó)男人都是來(lái)嫖的 中國(guó)女生卻不知道 還以為是要跟他們談戀愛(ài) 那雙方難道不會(huì)穿幫嗎?恩,在這方面 瑪麗女王早有對(duì)策 根據(jù)知乎一位 從事過(guò)這個(gè)產(chǎn)業(yè)的匿名用戶提供的信息 針對(duì)這種情況 瑪麗女王們 還會(huì)手把手地教外國(guó)男人 怎么快速擺脫女生的糾纏 怎么調(diào)教中國(guó)女生 怎么讓女生覺(jué)得自己很可愛(ài) 可以說(shuō) 各種套路一應(yīng)俱全 甚至還可以開發(fā)票!看到這里 她們背后的產(chǎn)業(yè)就非常清楚了 這個(gè)瑪麗女王 她根本就不是什么女權(quán)主義者 而是打著女權(quán)主義的口號(hào) 販賣中國(guó)女生的人販子 一方面 她們通過(guò)辱罵中國(guó)男人 吸引對(duì)外國(guó)男人感興趣的中國(guó)女生 另一方面 她們向外國(guó)男人收錢 然后把中國(guó)女生賣給他們!圖片來(lái)源:知乎@渭水徐工 而可憐的中國(guó)妹子們 還以為自己是在 追求男女平權(quán) 其實(shí),不過(guò)是淪為了 這些老鴇的賺錢工具 伊利丹把這整個(gè)事情 寫出來(lái)以后 在知乎、微博引起了巨大的關(guān)注 關(guān)于其中提到的 伊利丹的QQ被永久封禁的問(wèn)題 騰訊經(jīng)過(guò)核查 目前也有了結(jié)果:經(jīng)調(diào)查,是瑪麗女王利用偽造證據(jù) 惡意舉報(bào)了伊利丹的QQ號(hào) 目前,騰訊已經(jīng)將伊利丹的QQ解封 同時(shí)封禁了瑪麗女王等人的 兩個(gè)QQ賬號(hào) 警方也就此事立案?jìng)刹榱?相信很快就會(huì)有結(jié)果 這個(gè)事情算是告一段落了 但是在我看來(lái) 卻有一件事讓我無(wú)法釋懷:為什么“女權(quán)主義”竟然會(huì)和 辱罵中國(guó)男性等同起來(lái)?為什么“和外國(guó)男人交友” 竟然還能演變成 一個(gè)免費(fèi)的陪睡組織?我想,這個(gè)瑪麗女王 也許只是一個(gè) 發(fā)現(xiàn)了惡性賺錢模式的生意人 但是在這背后隱藏的 其實(shí)是一個(gè)很深的問(wèn)題:為什么有不少中國(guó)女人 越來(lái)越看不上中國(guó)男人 甚至覺(jué)得嫁給外國(guó)男人 是一種時(shí)尚?這里面的原因可能非常復(fù)雜 我這里先提供一個(gè)思路 供大家討論:我發(fā)現(xiàn) 現(xiàn)在中國(guó)很多大型的女權(quán)組織 背后都有著西方勢(shì)力的影子 她們打著女權(quán)的名號(hào) 為自己謀取暴利 為西方國(guó)家從事破壞活動(dòng) 而那些真正為女性平權(quán)而奔走的人 卻得不到應(yīng)有的幫助 我之所以這樣說(shuō) 并不是信口開河 而是有充足的證據(jù) 有一個(gè)非常有名的民間女權(quán)組織 叫做“女權(quán)之聲” 它一再聲稱 自己只是一個(gè)自發(fā)的民間組織 致力于促進(jìn)男女平等的 它所有的微博賬號(hào)、微信賬號(hào) 全部都是由一個(gè) 叫做婦女傳媒監(jiān)測(cè)網(wǎng)絡(luò)的創(chuàng)辦的 而這個(gè)婦女傳媒監(jiān)測(cè)網(wǎng)絡(luò) 有這么多媒體產(chǎn)品 那它的錢都是哪里來(lái)的呢?從她們介紹的合作組織里 我們可以清楚地找到 她們的資助者—— 竟然有西方的福特基金會(huì) 有人也許會(huì)問(wèn) 收了西方的錢怎么了?中國(guó)的組織不能收西方的錢嗎?然而,她們不只是收了西方的錢而已 女權(quán)之聲組織里 有一個(gè)人叫做鄭楚然 她除了女權(quán)運(yùn)動(dòng)之外 沒(méi)有任何其他工作 表面上,是一個(gè)全職的女權(quán)工作者 在2015年的時(shí)候 她還因?yàn)閷め呑淌?被警察拘留過(guò)30多天 甚至在她被拘留的時(shí)候 希拉里還借題發(fā)揮 指責(zé)中國(guó)侵犯人權(quán)、壓制民主 一個(gè)中國(guó)的小小民間組織的首領(lǐng) 在互聯(lián)網(wǎng)上的粉絲還沒(méi)有我多 竟然能得到希拉里這個(gè)級(jí)別的關(guān)注?我真的是驚掉了下巴 這樣看來(lái) 我離希拉里也不是很遠(yuǎn)了??而不止是希拉里 這樣一個(gè)明明思想上毫無(wú)建樹的人 卻被西方媒體BBC評(píng)為了 全球百大思想家 圖:鄭楚然在王寶強(qiáng)事件中發(fā)表的言論 除此以外 更讓人匪夷所思的 是她們平時(shí)就喜歡攻擊政府 甚至于,她們還會(huì)試圖分裂我們國(guó)家 比如,女權(quán)之聲這個(gè)組織里 著名的女權(quán)斗士洪理達(dá) 就曾經(jīng)轉(zhuǎn)發(fā)著名的港獨(dú)媒體 Hong Kong Free Press的言論 甚至曾公開發(fā)表過(guò) 支持藏獨(dú)、港獨(dú)、臺(tái)獨(dú)的言論 她也經(jīng)常和鄭楚然混在一起 我很想不通 如果她們真的只是單純的女權(quán)主義者 為何要發(fā)表分裂國(guó)家的言論?為何要支持藏獨(dú)、港獨(dú)、臺(tái)獨(dú)?我只能說(shuō),這大概就叫 拿人家的手短,吃人家的嘴軟吧 以前,我在接觸中國(guó)的女權(quán)組織時(shí) 我就覺(jué)得很奇怪 她們都喜歡聲稱 自己是不盈利的非政府組織 但是她們無(wú)論是宣傳 還是組織各類活動(dòng) 都需要大量的錢 如果她們真的不盈利 那這些錢都是哪里來(lái)的呢?而這些外國(guó)的金主 他們也更加不可能是什么慈善組織 大發(fā)善心來(lái)給中國(guó)人投錢 每一分投出去的錢 一定都是要有回報(bào)的 那么,他們的回報(bào)是什么呢?他們給中國(guó)的“女權(quán)組織”投錢 能得到什么利益呢?聯(lián)想到中國(guó)網(wǎng)絡(luò)上 如火如荼的對(duì)中國(guó)男人的討伐 我只能說(shuō),細(xì)思恐極 我絕不是危言聳聽(tīng) 因?yàn)槲覀兙涂床贿h(yuǎn)的鄰國(guó)日本 近些年來(lái)日本對(duì)于西方的崇拜 可謂深入骨髓 已經(jīng)到了崇洋媚外的程度 而這其中 當(dāng)然也包括對(duì)白人男性的崇拜 甚至在2016年一個(gè)瑞士白人 發(fā)了一個(gè)視頻,赤裸裸的說(shuō) “在東京,只要你是白人, 做什么都可以” 視頻里面他在日本便利店 隨意的親吻不認(rèn)識(shí)的收銀員女孩 在酒吧把不認(rèn)識(shí)的日本女孩 按向自己的褲襠 而日本女孩回應(yīng)的卻是諂媚的笑容 我想,并不會(huì)有那么多中國(guó)人 真正被西方偽女權(quán)主義控制 但是,我們要警惕的是 別在你自己都沒(méi)有察覺(jué)的時(shí)候 被別有用心的人洗了腦 更有甚者 別在你自己都不知道的情況下 被別人賣給了外國(guó)男人 還去幫他數(shù)錢 本文系授權(quán)發(fā)布,From 酷玩實(shí)驗(yàn)室,微信號(hào):coollabs,歡迎分享到朋友圈,未經(jīng)許可不得轉(zhuǎn)載,INSIGHT視界 誠(chéng)意推薦 Forwarded from Official Account 酷玩實(shí)驗(yàn)室 酷玩實(shí)驗(yàn)室 Learn More Scan QR Code via WeChat to follow Official Account 采集文章采集樣式近似文章查看封面
IT技術(shù)分享社區(qū)
個(gè)人博客網(wǎng)站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠(yuǎn)程辦公:常用的遠(yuǎn)程協(xié)助軟件,你都知道嗎?51單片機(jī)程序下載、ISP及串口基礎(chǔ)知識(shí)硬件:斷路器、接觸器、繼電器基礎(chǔ)知識(shí)
總結(jié)
以上是生活随笔為你收集整理的后端技术:这35 个细节,提升你的 Java 代码质量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: boblog任意变量覆盖漏洞(二)
- 下一篇: springboot启动过程_sprin