凤凰平台怎么开户:女大学生为了不在食堂吃饭,她不惜付出了令人心疼的代价

港铁公司(00066)发布公告,于2019年10月10日,根据2007年认股权计划使认股权(公司的董事使除外)而发9500股,每股发行价为28.65港元,较10月9日收市价43.2港元折让33.68%。

  

  ZIONCOM(08287)发布公告,公司已于2019年10月9日采纳中文名称“百家淘客股份有限公司”以资识别。

  尽管人类在与肿瘤抗争的道路上已经取得了无数骄人的战果,但不得不说,时至今日,我们仍然无法扼住肿瘤的喉咙,做到真正意义、绝对意义上的预防。就像不吸烟并非一定不会得肺癌,不食用腌渍烧烤类食物并非一定不会得胃癌一样,我们的预防“赌”的是一种概率,而很难做到彻底隔绝。但是,有这么一种癌症,只要你做对了一件事,就可以有效避免它的发生。它就是结直肠癌,而这件事就是结肠镜筛查。

  而且你知道吗?据统计,我国青少年近视的患病率居全球首位,近年来近视的发病年龄更是从13至18岁提前到了9至14岁。每年10月份的第二个星期四是世界视力日,在这里提醒大家,防止孩子近视,家长至关重要,一定要督促孩子做到以下这几点。

    恒基发展(0.64, 0.00, 0.00%) (00097)   0.64元   无升跌

  “纳采”是《仪礼·士昏礼》记载的合乎礼法的周代士阶层“婚姻六礼”,即纳采、问名、纳吉、纳徵、请期、亲迎中的第一项礼仪。意图缔结婚姻的一方(周代起,大多为男方),派使者(秦汉以后派媒人)携雁为“挚”(礼物),至另一方,向对方通达嫁娶之意。自此以后,“纳采”礼成为古代中国婚姻礼俗中必不可缺的环节(男女有情人或相约私奔,或特殊情况下匆遽婚配,无此礼节)。自秦汉迄今明清,纳采礼的形式、内容,也随时代、朝代、民族的变化,在大致传承周礼的基础上,又屡有变异。下面,我们就一起来看看古代中国的纳采礼吧。一、周代的纳采礼《仪礼·士昏礼》记载的周代纳采礼,主要有两个值得注意的问题:一是行纳采礼时,提出联姻者派遣使者携带的“挚”(礼物)为什么是大雁?二是纳采礼的仪节,和双方固定的“套词”分别是什么?郑玄画像 汉代儒学大师郑玄解释为何纳采以雁为“挚”的原因说:“用雁为挚者,取其顺阴阳往来”古人,尤其是中原地区的古代汉族人,通过长期的观察发现:大雁每年秋季天气逐渐变冷时,会从北方飞往南方;春季天气逐渐变暖时,又会从南方飞回北方。大雁的这种生活习性,被古人视为通晓阴阳消长变化的象征。加之古人认为,男子为阳,女子为阴。故包括纳采在内的诸婚礼仪式,皆用大雁为“挚”,取女子应象大雁一样,从男、从夫的寓意。 《仪礼·士昏礼》记载“纳采”的礼节大略是:男方派遣的使者到达女方家后,先向女方家的“擯者”(女方家中协助家长,一般是女孩子的父亲、兄长,行礼的人,类似后世管家、司仪等)禀报,“擯者”再向家长禀告。女方家长至大门,迎接使者。双方互相作揖行礼。使者进门后,在“门屏”(后世也叫做“影壁”)处左拐,向西走;走至对应西边上堂的台阶处,然后右拐,向北行走;经由西阶(也叫客阶)到堂上。主人入门后,在“门屏”处右拐,向东走;走至对应东边上堂的台阶处,然后左拐,向北行走,经由东阶(也叫主阶)到堂上,面朝西。古代房屋庭院(图取其意) 主、宾双方在堂上站定后,男方使者面朝东,向女方家长说:“吾子(女方家长)有惠,贶(kuàng 恩赐)室某(婿名)也。某(婿父名)有先人之礼,使某(使者名)也请纳采”(注意:此几句话中,“某”所指人物不同)女方家长站在阼阶上,面朝北,行再拜礼后,回答说:“某之子憃愚,又弗能教。吾子命之,某不敢辞”使者在楹(堂上的柱子)间,将雁授予给主人。使者及主人皆走下台阶,主人将雁交给“老”(贵族家庭中总理家务的家臣,类似后世的管家)。然后,使者走出女方家门,等待进行“问名”之礼。二、秦汉时期的纳采礼秦汉时,媒人在缔结婚姻过程中,发挥着沟通男女双方意愿、信息的重要作用。西汉人刘向曾说:“妇人因媒而嫁”汉代人比较普遍地认为,无媒不成婚“夫自炫向媒者,士女之丑行也”王莽 《汉书·王莽传上》记载,西汉末皇帝立皇后中的“纳采”礼仪:专擅朝政的王莽意欲将女儿嫁给汉平帝为皇后,以便更好地控制皇帝。负责此事的官员将候选女子的名单拟定呈奏。王莽审阅时,发现王氏宗族的很多女子,竟然都在侯选之列。王莽唯恐这些王氏宗族的女子与自己的女儿竞争皇后之位,但一时又想不出将她们摒弃出候选行列的办法来。经过一番思虑后,王莽决定采取以退为进的策略。《母仪天下》王政君剧照 他一方面上奏皇太后(王莽的姑姑王政君)说,自己德行一般,女儿材能低下,自愿退出候选。皇太后误以为王莽所言至诚可信,于是下诏允准。王莽另一方面暗地里唆使公卿大臣,乃至庶民百姓,上书“请愿”,“庶民、诸生、郎吏以上守阙上书者日千余人”,大家强烈呼吁:“愿得公女为天下母”王莽虽假惺惺地派长安有关官员“劝阻”请愿,结果却恰得其反,“上书者愈甚”最后,不堪聒噪的皇太后不得不“顺从”民意,派长乐少府、宗正、尚书令去王莽家,行纳采礼。三人回宫后,自然夸赞王莽的女儿“渐渍德化,有窈窕之容”,“才貌双全”的王莽女儿就这样顺利通过“海选”,成为皇后。三、魏晋南北朝时期的纳采礼魏晋时期,天下大乱,包括“纳采”礼在内的“婚姻六礼”,或许不再被普遍的施用。直至升平元年(357年),东晋穆帝纳皇后何氏,始命负责礼仪的太常王彪之撰作“纳采”版文。版文的内容,不外乎是阐述婚礼的重要性(“以奉天地宗庙社稷”)、派遣行纳采礼的官员等。被采择的女方家长,也要遵礼答诏:自谦为“陋族”,本家女子“未闲教训”,遵奉传统礼典云云。这一时期公卿士大夫的纳采礼,和皇族有别。《通典》对公卿士大夫阶层的纳采版文、纳采仪节等,均有所记载:“纳采”版文上、下、左、右四方,都要书写礼文,及新婿父亲的名讳,媒人的姓名要书写在版文的正中。版文左方用皂色(黑色)的布囊包裹,然后用白绳缠绕,如同公文上的封章一般。上面写上“某官某君大门下封”、“某官甲乙白奏”等。若没有官职,布囊上就写“贱子某某”等。写好后,将纳采礼版放到案上。 向女方馈赠的酒、羊、雁、缯、采、钱、米、肉等内容、数量,要写在另一张版文(实际上就是后世的“礼单”)上。写完后,用白缯将它包裹起来,与誊写礼文的纳采礼版一起放在案上。前往女家行纳采礼时,使者的随从们要牵着羊,用笼子盛着猪、雁,用笥盛缯,用奁盛采,用黄绢做成的布囊盛米。马王堆汉墓出土笥(左)奁(右)四、唐宋时期的纳采礼唐代纳采礼,如《大唐开元礼》的有关规定,大略与《仪礼·士昏礼》所载同。 不过,有的地方的纳采礼俗,颇具时代、地域特色。如在敦煌发现的男女对答式的《愿嫁歌》表明,唐朝时,地处西北边陲的敦煌虽民风彪悍,但豪迈飒爽的女子对未来夫婿的文采要求也相当高:“女问:‘何方所营?谁人伴唤?次第申陈,不须潦乱’儿答:‘敦煌县摄,公子伴涉,三史明闲,九经为业’” 敦煌文书 宋代一般先由男家采取口头或书面的形式,通过媒人,向女家提出联姻的请求。士大夫们为郑重、礼貌起见,一般采用书面形式。这种求婚文书,叫做“求婚启”现存宋人文集中,还收录了许多“求婚启”如写出“大江东去,浪淘尽,千古风流人物”豪迈诗句的北宋大文豪苏轼,也不能免俗,为孙子写了一篇“俗不可耐”的“求婚启”启中,自然先是一番自谦之辞,“轼长子某第二子符,天质下中,生有蓬麻之陋”;然后将女方夸赞一番:“先辈之爱女第十四小娘子,禀粹德门,教成家庙”希冀女方允准联姻。 女家收到男家的“求婚启”,或媒人的口头请求后,如果有意,就将自家祖孙三代姓名、官衔、女子的姓名、母亲的姓氏、嫁妆的数量等信息,写在帖子上,谓之“草帖子”(俗称“八字帖”),交给媒人。媒人再将女家草帖子转递给男家。宋代女家“纳采”时的“草帖子” 男家得到女家的“草帖子”后,进行占卜。若占卜结果吉利,男家就要将新婿祖孙三代的姓名、官衔等信息,写在“草帖子”上,回送女家。宋代男家“纳采”时的“草帖子” 女家接到男家的“草帖子”后,也要进行占卜。若占卜结果吉利,则通报男家,继续下一婚姻程序。五、金元时期的纳采礼《精忠岳飞》中的女真武士 建立金朝的女真人,及建立元朝的蒙古人,都有提亲议亲的婚姻礼俗。女真族与汉族“纳采”礼性质大致相当的,是所谓“拜门”礼,又称“男下女”礼。一般由男家先向女家提出联姻的请求,然后约定日期行“拜门”礼。到行礼之日,男家的戚属携带酒馔,全体出动,浩浩荡荡地前往女家。女家人无论长幼,皆坐在炕上;男家人在炕下地上,行跪拜礼,谓之“男下女”这一礼俗直到清代,仍盛行不衰。 蒙元时期,蒙古人议婚,一般也是男方向女方求婚。若女方愿与男方缔结婚姻,就招待男家人吃“不兀勒札儿”(颈喉,指羊颈喉)。羊颈喉筋肉坚韧、耐嚼,许婚时吃羊颈喉,取定婚不悔、坚久不离、百年合好的吉祥寓意。所以,汉人多将“不兀勒札儿”译成“许婚筵席”男女双方定婚后,彼此称“忽答”,即姻亲之意。 至元八年(1271 年),元朝统治者参照朱熹《家礼·婚礼》,制定《至元婚礼》。其中,关于“纳采”(当时也叫做“下定”)的礼仪是:男方家长将送往女方的礼品写在纸上。早起盥洗后,将纸供奉在祠堂中。如没祠堂,或可画祖先的影像,或可书写祖先的神位牌,向祖先禀报此事。然后,或亲自前往,或派家庭/族子弟为使者,至女方家行“纳采”礼。女方家长接见男方家长或使者,将男方送来的礼书送至祠堂,向祖先禀告。女方若愿与男方缔婚,就将男方礼品写在文书上,并以礼招待使者。六、明清时期的纳采礼明代,天子行纳采礼前,要先卜选吉日,派官员祭告天地、宗庙。行纳采礼时,有关官员先设好御坐、制案、卤簿等。礼部将要送至女方的礼物陈列在丹陛上、文楼下。皇帝穿戴冕服,坐在御座上。百官和纳采礼正、副使穿戴朝服,行礼如仪。传制官宣制曰:“兹选某官某女为皇后,命卿等持节行纳采问名礼” 皇帝起驾回宫,正、副使将符节及制书放到彩舆中,在仪仗乐队前导下,出大明门,乘马前往皇后家,行纳采礼。 皇后家的尊长事先在大门、正堂等处,分别设置幕次、香案、制案等,恭候纳采正、副使到来。使者到后,主人朝服出迎。礼官宣敕说:“奉制建后,遣使行纳采问名礼”执事官将纳采礼陈列在正堂上,使者将制书端放在香案上。主人行礼,跪于案前。正使取纳采诏书,宣读后,授主人。主人接制,端放在案上。主人将谢表放进使者彩舆中。纳采礼毕,主人准备酒馔,款待使者。宴毕,使者返回宫中,主人送至大门外。使者随彩舆进宫,将女方谢表交给司礼监,向皇帝复命。清代皇帝的皇后,大都由皇太后指定,或由皇太后与辅政大臣议定,称作“议婚”“议婚”后,皇太后下慈谕,令皇帝立某女为后。然后由内阁(后改为翰林院)撰册文、宝文,礼部监制金册、金宝,内务府准备纳采礼,钦天监卜选行纳采礼的吉日。皇帝大婚,纳采礼包括10匹鞍辔具全的文马、10副甲胄、100匹缎、200匹布。清代皇帝大婚纳采礼,虽与明朝大略相同,但也有显著不同之处:纳采宣敕等礼仪结束后,皇家要在皇后家设纳采宴,宴请皇后家人。皇太后、皇帝诏命公主、大臣命妇在内堂宴请皇后的母亲,八旗公、侯以下、满汉二品以上官员在外厅宴请皇后的父亲。 清代汉族普通百姓家纳采礼俗,大致遵循《仪礼·士昏礼》所载,及宋明时期的相关礼俗。满族普通百姓的“纳采”礼,仍基本传承金朝女真人的“男下女”礼。文史君说“纳采”礼是《仪礼·士昏礼》记载的周代“婚姻六礼”的第一道环节。自秦汉至明清时期,人们在提亲议亲时,大致传承《仪礼·士昏礼》有关仪节记载行礼。当然,由于时代、社会的变迁,由于不同地域、民族传统风俗的影响,古代中国“纳采”礼俗,也呈千姿百态,极大丰富、发展了古代中国婚姻礼俗。对当今社会,依然具有一定的借鉴意义。参考文献1. (春秋战国)佚名撰、(东汉)郑玄注、(唐)贾公彦疏、(清)阮元校刻:《仪礼注疏》,北京:中华书局,1980年。2. 陈鹏:《中国婚姻史稿》,北京:中华书局,1990年。3. 陈绍棣、彭卫等:《中国风俗通史》,上海:上海文艺出版社,2001年。4. 钟敬文主编:《中国民俗史》,北京:人民出版社,2008年。(作者:浩然文史·郛生)本文为文史科普自媒体浩然文史原创作品,未经授权禁止转载!本文所用图片,除特别说明外都来自互联网,如有侵权烦请联系作者删除,谢谢!我们会每天为大家奉上精彩的历史文章,恳请各位读者朋友关注我们的账号!您的点赞、转发、评论,这是对我们最好的支持!

       

本文为锦鲤妈咪原创作品生没生娃的都知道分娩的痛苦,那种传说中十二级疼痛,几乎会让人痛不欲生,但只有当了母亲之后才知道,相比分娩的痛苦,有些因为生产带来的问题其实更加让人恐惧,比如产后抑郁。失手捅死丈夫、因一句话一跳两命,产后抑郁有多可怕?昨晚上宝妈群里无意中谈论起了产后抑郁的问题,很多宝妈对此都是模棱两可,有的觉得问题不严重,有的觉得产后抑郁非常可怕,还有一部分人认为产后抑郁只是宝妈矫情。事情哪有这么简单,不久前内蒙古某地就发生过一起因为产后抑郁引发的恶性案件。一位刚生产完宝妈,出现了严重的产后抑郁,在孩子仅出生七天之后,就用刀子捅死了自己的丈夫。据说事发当天,宝妈就拿着刀子在家里乱砍乱挥,报警之后也未能查明原因,出对妻子的爱护,丈夫没有对其采取强制措施,结果当天晚上七点多,就死在了妻子的刀下。后来经过调查发现,之前夫妻俩因为和某个说话难听的亲戚经常起争执,那时候开始宝妈的精神状态就已经不太正常了,时常会叨咕着要“捅人”,结果没想到,惨剧还是发生了。还是如此的突然。除了这件事,我小时候亲身经历的一件事情至今也让我心有余悸,小时候家里刚住楼房,同单元五楼是一对家境富裕的小夫妻,妥妥的郎才女貌。几年后妻子怀孕了,怀胎临产一切都顺利,生了个胖小子,后来儿子的妈妈来帮忙伺候月子带孩子,不过不知从什么时候起,开始有传言说那个小媳妇患上了“精神病”,现在想来其实就是产后抑郁,只是那时候并没有这个名词。之后有一次婆媳矛盾,婆婆说了很伤人的话,儿媳妇抱着孩子闹着要跳楼,结果丈夫赶回来一句话直接葬送了两条性命,丈夫说,“你别闹了!赶快下来!”当时的妻子应该很绝望吧,自己的抑郁无处发泄,和婆婆起了矛盾自己的丈夫不问青红皂白只觉得自己的是在胡闹,既然如此,那我就最后胡闹一次吧。我想丈夫可能怎么也没想到,自己的妻子会如此决绝,也没想到自己的一句话会产生这么严重的后果。由此可见,产后抑郁不是小事,更不是很多人误会的矫情产后抑郁的主要原因1、生理原因,体内激素产生了变化宝妈在生产完毕之后,体内的激素在短期之内产生了大幅度的变化,这种变化会直接导致宝妈本就起伏的情绪更加波动变化,同时还会让宝妈变得更加敏感,这时候宝妈自己是意识不到这些的,这也是他们自己没法控制的,但在旁人眼中,我们会觉得产妇十分“矫情”、“多疑”、“敏感”可这并不是宝妈的错。2、分娩时的心理阴影“想起来后怕”才真正人让人害怕,对于分娩也是一样,当时极大的痛苦宝妈可能都忍受了,不过生产完毕之后,每每回想起来却感觉更加可怕,这种回想的可怕也会给宝妈带来极大的心理阴影,如果不进行及时的心理疏导,严重的可能会造成一辈的心理创伤,进而引发产后抑郁。3、被家人的冷落导致心理落差巨大怀孕期间,宝妈简直会被大家“供”起来,每天好吃好喝的伺候着,整整十个月,而分娩之后,家人们自然而然的会把一部分甚至大部分精力分给孩子,这样宝妈就会一定程度的受到冷落,而这种心理落差又会被敏感和多疑无限放大,患上产后抑郁也就不难理解了。了解了原因之后,作为家人究竟应该怎么做呢?1、保持对宝妈一样程度的关心首先,作为丈夫,这是最重要的一点,无论别人怎么做,丈夫一定要把注意力放在妻子身上,这是对妻子最大的安慰和保护,妻子在生产之后,丈夫一样要想以前那样关心宝妈,不要冷落了妻子,更重要的是时刻注意妻子的精神状态,不样让坏情绪占领主导。一旦发现有什么异常的地方及时咨询医生,采取相关的措施。2、帮忙分担能做的一切事情,减小宝妈的压力妻子辛苦的怀孕十个月,最后冒着生命危险,承受着巨大的痛苦把孩子生下来了,作为丈夫,作为孩子父亲,做一些换尿布,冲奶粉,洗衣做饭等等这些力所能及的事情真不算什么,毕竟你妻子那是给你生了个孩子出来,不是简简单单随随便便闹着玩似的就变出个孩子来。孩子出生之后,除了喂奶,其余的一切都交给丈夫也不算过分,或者说本该如此。只有这样才能最大程度的减小妻子的压力,对于妻子、孩子、和家庭来说都是好事。3、多倾听妻子心里的想法,多沟通,别觉得妻子矫情在家庭中,妻子最大的仰仗和依靠就是自己的丈夫,丈夫也是妻子最后的心理防线,只要这根心理防线不崩塌,妻子也基本会远离产后抑郁就像上文中的丈夫,但凡能稍微理解一下妻子,说话过一下脑子,恐怕都不会出现“一跳两命”的悲惨结局。对于妻子来说,能和丈夫掏掏心窝子,丈夫能仔细听听自己的内心,那么多半的抑郁烦躁情绪都会被消除掉,产后抑郁也就能最大程度的避免。所以总的来说,产后抑郁并不是一件小事,危害也十分巨大,但是同样的这种情况也不难解决,也很容易的避免,关键要看丈夫怎么做。我是幸运的锦鲤妈咪,在生娃带娃的路上过关斩将。关注我,学习最实用的孕产、育儿知识,有关于这方面的困惑,也可以给我发私信哦。希望我的回答,可以帮助到您,为您解决一点困惑。(此处已添加圈子卡片,请到今日头条客户端查看)





导读唐宋八大家之一欧阳修在《卖油翁》中写道:翁取一葫芦置于地,以钱覆其口,徐以杓酌油沥之,自钱孔入,而钱不湿。因曰:“我亦无他,唯手熟尔”编写代码的"老司机"也是如此,"老司机"之所以被称为"老司机",原因也是"无他,唯手熟尔"编码过程中踩过的坑多了,获得的编码经验也就多了,总结的编码技巧也就更多了。总结的编码技巧多了,凡事又能够举一反三,编码的速度自然就上来了。笔者从数据结构的角度,整理了一些Java编程技巧,以供大家学习参考。1.使用HashSet判断主键是否存在HashSet实现Set接口,由哈希表(实际上是HashMap)支持,但不保证set 的迭代顺序,并允许使用null元素。HashSet的时间复杂度跟HashMap一致,如果没有哈希冲突则时间复杂度为O(1),如果存在哈希冲突则时间复杂度不超过O(n)。所以,在日常编码中,可以使用HashSet判断主键是否存在。案例:给定一个字符串(不一定全为字母),请返回第一个重复出现的字符。/** 查找第一个重复字符 */public static Character findFirstRepeatedChar(String string) { // 检查空字符串 if (Objects.isNull(string) || string.isEmpty()) { return null; } // 查找重复字符 char[] charArray = string.toCharArray(); Set charSet = new HashSet<>(charArray.length); for (char ch : charArray) { if (charSet.contains(ch)) { return ch; } charSet.add(ch); } // 默认返回为空 return null;}其中,由于Set的add函数有个特性——如果添加的元素已经再集合中存在,则会返回false。可以简化代码为:if (!charSet.add(ch)) { return ch;}2.使用HashMap存取键值映射关系简单来说,HashMap由数组和链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。如果定位到的数组位置不含链表,那么查找、添加等操作很快,仅需一次寻址即可,其时间复杂度为O(1);如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n)——首先遍历链表,存在即覆盖,不存在则新增;对于查找操作来讲,仍需要遍历链表,然后通过key对象的equals方法逐一对比查找。从性能上考虑,HashMap中的链表出现越少,即哈希冲突越少,性能也就越好。所以,在日常编码中,可以使用HashMap存取键值映射关系。案例:给定菜单记录列表,每条菜单记录中包含父菜单标识(根菜单的父菜单标识为null),构建出整个菜单树。/** 菜单DO类 */@Setter@Getter@ToStringpublic static class MenuDO { /** 菜单标识 */ private Long id; /** 菜单父标识 */ private Long parentId; /** 菜单名称 */ private String name; /** 菜单链接 */ private String url;}/** 菜单VO类 */@Setter@Getter@ToStringpublic static class MenuVO { /** 菜单标识 */ private Long id; /** 菜单名称 */ private String name; /** 菜单链接 */ private String url; /** 子菜单列表 */ private List<MenuVO> childList;}/** 构建菜单树函数 */public static List<MenuVO> buildMenuTree(List<MenuDO> menuList) { // 检查列表为空 if (CollectionUtils.isEmpty(menuList)) { return Collections.emptyList(); } // 依次处理菜单 int menuSize = menuList.size(); List<MenuVO> rootList = new ArrayList<>(menuSize); Map<Long, MenuVO> menuMap = new HashMap<>(menuSize); for (MenuDO menuDO : menuList) { // 赋值菜单对象 Long menuId = menuDO.getId(); MenuVO menu = menuMap.get(menuId); if (Objects.isNull(menu)) { menu = new MenuVO(); menu.setChildList(new ArrayList<>()); menuMap.put(menuId, menu); } menu.setId(menuDO.getId()); menu.setName(menuDO.getName()); menu.setUrl(menuDO.getUrl()); // 根据父标识处理 Long parentId = menuDO.getParentId(); if (Objects.nonNull(parentId)) { // 构建父菜单对象 MenuVO parentMenu = menuMap.get(parentId); if (Objects.isNull(parentMenu)) { parentMenu = new MenuVO(); parentMenu.setId(parentId); parentMenu.setChildList(new ArrayList<>()); menuMap.put(parentId, parentMenu); } // 添加子菜单对象 parentMenu.getChildList().add(menu); } else { // 添加根菜单对象 rootList.add(menu); } } // 返回根菜单列表 return rootList;}3.使用ThreadLocal存储线程专有对象ThreadLocal提供了线程专有对象,可以在整个线程生命周期中随时取用,极大地方便了一些逻辑的实现。常见的ThreadLocal用法主要有两种:保存线程上下文对象,避免多层级参数传递;保存非线程安全对象,避免多线程并发调用。3.1.保存线程上下文对象,避免多层级参数传递这里,以PageHelper插件的源代码中的分页参数设置与使用为例说明。设置分页参数代码:/** 分页方法类 */public abstract class PageMethod { /** 本地分页 */ protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>(); /** 设置分页参数 */ protected static void setLocalPage(Page page) { LOCAL_PAGE.set(page); } /** 获取分页参数 */ public static <T> Page<T> getLocalPage() { return LOCAL_PAGE.get(); } /** 开始分页 */ public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) { Page<E> page = new Page<E>(pageNum, pageSize, count); page.setReasonable(reasonable); page.setPageSizeZero(pageSizeZero); Page<E> oldPage = getLocalPage(); if (oldPage != null && oldPage.isOrderByOnly()) { page.setOrderBy(oldPage.getOrderBy()); } setLocalPage(page); return page; }}使用分页参数代码:/** 虚辅助方言类 */public abstract class AbstractHelperDialect extends AbstractDialect implements Constant { /** 获取本地分页 */ public <T> Page<T> getLocalPage() { return PageHelper.getLocalPage(); } /** 获取分页SQL */ @Override public String getPageSql(MappedStatement ms, BoundSql boundSql, Object parameterObject, RowBounds rowBounds, CacheKey pageKey) { String sql = boundSql.getSql(); Page page = getLocalPage(); String orderBy = page.getOrderBy(); if (StringUtil.isNotEmpty(orderBy)) { pageKey.update(orderBy); sql = OrderByParser.converToOrderBySql(sql, orderBy); } if (page.isOrderByOnly()) { return sql; } return getPageSql(sql, page, pageKey); } ...}使用分页插件代码:/** 查询用户函数 */public PageInfo<UserDO> queryUser(UserQuery userQuery, int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<UserDO> userList = userDAO.queryUser(userQuery); PageInfo<UserDO> pageInfo = new PageInfo<>(userList); return pageInfo;}如果要把分页参数通过函数参数逐级传给查询语句,除非修改MyBatis相关接口函数,否则是不可能实现的。3.2.保存非线程安全对象,避免多线程并发调用在写日期格式化工具函数时,首先想到的写法如下:/** 日期模式 */private static final String DATE_PATTERN = "yyyy-MM-dd";/** 格式化日期函数 */public static String formatDate(Date date) { return new SimpleDateFormat(DATE_PATTERN).format(date);}其中,每次调用都要初始化DateFormat导致性能较低,把DateFormat定义成常量后的写法如下:/** 日期格式 */private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");/** 格式化日期函数 */public static String formatDate(Date date) { return DATE_FORMAT.format(date);}由于SimpleDateFormat是非线程安全的,当多线程同时调用formatDate函数时,会导致返回结果与预期不一致。如果采用ThreadLocal定义线程专有对象,优化后的代码如下:/** 本地日期格式 */private static final ThreadLocal<DateFormat> LOCAL_DATE_FORMAT = new ThreadLocal<DateFormat>() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd"); }};/** 格式化日期函数 */public static String formatDate(Date date) { return LOCAL_DATE_FORMAT.get().format(date);}这是在没有线程安全的日期格式化工具类之前的实现方法。在JDK8以后,建议使用DateTimeFormatter代替SimpleDateFormat,因为SimpleDateFormat是线程不安全的,而DateTimeFormatter是线程安全的。当然,也可以采用第三方提供的线程安全日期格式化函数,比如apache的DateFormatUtils工具类。注意:ThreadLocal有一定的内存泄露的风险,尽量在业务代码结束前调用remove函数进行数据清除。4.使用Pair实现成对结果的返回在C/C++语言中,Pair(对)是将两个数据类型组成一个数据类型的容器,比如std::pair。Pair主要有两种用途:把key和value放在一起成对处理,主要用于Map中返回名值对,比如Map中的Entry类;当一个函数需要返回两个结果时,可以使用Pair来避免定义过多的数据模型类。第一种用途比较常见,这里主要说明第二种用途。4.1.定义模型类实现成对结果的返回函数实现代码:/** 点和距离类 */@Setter@Getter@ToString@AllArgsConstructorpublic static class PointAndDistance { /** 点 */ private Point point; /** 距离 */ private Double distance;}/** 获取最近点和距离 */public static PointAndDistance getNearestPointAndDistance(Point point, Point[] points) { // 检查点数组为空 if (ArrayUtils.isEmpty(points)) { return null; } // 获取最近点和距离 Point nearestPoint = points[0]; double nearestDistance = getDistance(point, points[0]); for (int i = 1; i < points.length; i++) { double distance = getDistance(point, point[i]); if (distance < nearestDistance) { nearestDistance = distance; nearestPoint = point[i]; } } // 返回最近点和距离 return new PointAndDistance(nearestPoint, nearestDistance);}函数使用案例:Point point = ...;Point[] points = ...;PointAndDistance pointAndDistance = getNearestPointAndDistance(point, points);if (Objects.nonNull(pointAndDistance)) { Point point = pointAndDistance.getPoint(); Double distance = pointAndDistance.getDistance(); ...}4.2.使用Pair类实现成对结果的返回在JDK中,没有提供原生的Pair数据结构,也可以使用Map::Entry代替。不过,Apache的commons-lang3包中的Pair类更为好用,下面便以Pair类进行举例说明。函数实现代码:/** 获取最近点和距离 */public static Pair<Point, Double> getNearestPointAndDistance(Point point, Point[] points) { // 检查点数组为空 if (ArrayUtils.isEmpty(points)) { return null; } // 获取最近点和距离 Point nearestPoint = points[0]; double nearestDistance = getDistance(point, points[0]); for (int i = 1; i < points.length; i++) { double distance = getDistance(point, point[i]); if (distance < nearestDistance) { nearestDistance = distance; nearestPoint = point[i]; } } // 返回最近点和距离 return Pair.of(nearestPoint, nearestDistance);}函数使用案例:Point point = ...;Point[] points = ...;Pair<Point, Double> pair = getNearestPointAndDistance(point, points);if (Objects.nonNull(pair)) { Point point = pair.getLeft(); Double distance = pair.getRight(); ...}5.定义Enum类实现取值和描述在C++、Java等计算机编程语言中,枚举类型(Enum)是一种特殊数据类型,能够为一个变量定义一组预定义的常量。在使用枚举类型的时候,枚举类型变量取值必须为其预定义的取值之一。5.1.用class关键字实现的枚举类型在JDK5之前,Java语言不支持枚举类型,只能用类(class)来模拟实现枚举类型。/** 订单状态枚举 */public final class OrderStatus { /** 属性相关 */ /** 状态取值 */ private final int value; /** 状态描述 */ private final String description; /** 常量相关 */ /** 已创建(1) */ public static final OrderStatus CREATED = new OrderStatus(1, "已创建"); /** 进行中(2) */ public static final OrderStatus PROCESSING = new OrderStatus(2, "进行中"); /** 已完成(3) */ public static final OrderStatus FINISHED = new OrderStatus(3, "已完成"); /** 构造函数 */ private OrderStatus(int value, String description) { this.value = value; this.description = description; } /** 获取状态取值 */ public int getValue() { return value; } /** 获取状态描述 */ public String getDescription() { return description; }}5.2.用enum关键字实现的枚举类型JDK5提供了一种新的类型——Java的枚举类型,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常量使用,这是一种非常有用的功能。/** 订单状态枚举 */public enum OrderStatus { /** 常量相关 */ /** 已创建(1) */ CREATED(1, "已创建"), /** 进行中(2) */ PROCESSING(2, "进行中"), /** 已完成(3) */ FINISHED(3, "已完成"); /** 属性相关 */ /** 状态取值 */ private final int value; /** 状态描述 */ private final String description; /** 构造函数 */ private OrderStatus(int value, String description) { this.value = value; this.description = description; } /** 获取状态取值 */ public int getValue() { return value; } /** 获取状态描述 */ public String getDescription() { return description; }}其实,Enum类型就是一个语法糖,编译器帮我们做了语法的解析和编译。通过反编译,可以看到Java枚举编译后实际上是生成了一个类,该类继承了 java.lang.Enum,并添加了values()、valueOf()等枚举类型通用方法。6.定义Holder类实现参数的输出在很多语言中,函数的参数都有输入(in)、输出(out)和输入输出(inout)之分。在C/C++语言中,可以用对象的引用(&)来实现函数参数的输出(out)和输入输出(inout)。但在Java语言中,虽然没有提供对象引用类似的功能,但是可以通过修改参数的字段值来实现函数参数的输出(out)和输入输出(inout)。这里,我们叫这种输出参数对应的数据结构为Holder(支撑)类。Holder类实现代码:/** 长整型支撑类 */@Getter@Setter@ToStringpublic class LongHolder { /** 长整型取值 */ private long value; /** 构造函数 */ public LongHolder() {} /** 构造函数 */ public LongHolder(long value) { this.value = value; }}Holder类使用案例:/** 静态常量 *//** 页面数量 */private static final int PAGE_COUNT = 100;/** 最大数量 */private static final int MAX_COUNT = 1000;/** 处理过期订单 */public void handleExpiredOrder() { LongHolder minIdHolder = new LongHolder(0L); for (int pageIndex = 0; pageIndex < PAGE_COUNT; pageIndex++) { if (!handleExpiredOrder(pageIndex, minIdHolder)) { break; } }}/** 处理过期订单 */private boolean handleExpiredOrder(int pageIndex, LongHolder minIdHolder) { // 获取最小标识 Long minId = minIdHolder.getValue(); // 查询过期订单(按id从小到大排序) List<OrderDO> orderList = orderDAO.queryExpired(minId, MAX_COUNT); if (CollectionUtils.isEmpty(taskTagList)) { return false; } // 设置最小标识 int orderSize = orderList.size(); minId = orderList.get(orderSize - 1).getId(); minIdHolder.setValue(minId); // 依次处理订单 for (OrderDO order : orderList) { ... } // 判断还有订单 return orderSize >= PAGE_SIZE;}其实,可以实现一个泛型支撑类,适用于更多的数据类型。7.定义Union类实现数据体的共存在C/C++语言中,联合体(union),又称共用体,类似结构体(struct)的一种数据结构。联合体(union)和结构体(struct)一样,可以包含很多种数据类型和变量,两者区别如下:结构体(struct)中所有变量是“共存”的,同时所有变量都生效,各个变量占据不同的内存空间;联合体(union)中是各变量是“互斥”的,同时只有一个变量生效,所有变量占据同一块内存空间。当多个数据需要共享内存或者多个数据每次只取其一时,可以采用联合体(union)。在Java语言中,没有联合体(union)和结构体(struct)概念,只有类(class)的概念。众所众知,结构体(struct)可以用类(class)来实现。其实,联合体(union)也可以用类(class)来实现。但是,这个类不具备“多个数据需要共享内存”的功能,只具备“多个数据每次只取其一”的功能。这里,以微信协议的客户消息为例说明。根据我多年来的接口协议封装经验,主要有以下两种实现方式。7.1.使用函数方式实现UnionUnion类实现:/** 客户消息类 */@ToStringpublic class CustomerMessage { /** 属性相关 */ /** 消息类型 */ private String msgType; /** 目标用户 */ private String toUser; /** 共用体相关 */ /** 新闻内容 */ private News news; ... /** 常量相关 */ /** 新闻消息 */ public static final String MSG_TYPE_NEWS = "news"; ... /** 构造函数 */ public CustomerMessage() {} /** 构造函数 */ public CustomerMessage(String toUser) { this.toUser = toUser; } /** 构造函数 */ public CustomerMessage(String toUser, News news) { this.toUser = toUser; this.msgType = MSG_TYPE_NEWS; this.news = news; } /** 清除消息内容 */ private void removeMsgContent() { // 检查消息类型 if (Objects.isNull(msgType)) { return; } // 清除消息内容 if (MSG_TYPE_NEWS.equals(msgType)) { news = null; } else if (...) { ... } msgType = null; } /** 检查消息类型 */ private void checkMsgType(String msgType) { // 检查消息类型 if (Objects.isNull(msgType)) { throw new IllegalArgumentException("消息类型为空"); } // 比较消息类型 if (!Objects.equals(msgType, this.msgType)) { throw new IllegalArgumentException("消息类型不匹配"); } } /** 设置消息类型函数 */ public void setMsgType(String msgType) { // 清除消息内容 removeMsgContent(); // 检查消息类型 if (Objects.isNull(msgType)) { throw new IllegalArgumentException("消息类型为空"); } // 赋值消息内容 this.msgType = msgType; if (MSG_TYPE_NEWS.equals(msgType)) { news = new News(); } else if (...) { ... } else { throw new IllegalArgumentException("消息类型不支持"); } } /** 获取消息类型 */ public String getMsgType() { // 检查消息类型 if (Objects.isNull(msgType)) { throw new IllegalArgumentException("消息类型无效"); } // 返回消息类型 return this.msgType; } /** 设置新闻 */ public void setNews(News news) { // 清除消息内容 removeMsgContent(); // 赋值消息内容 this.msgType = MSG_TYPE_NEWS; this.news = news; } /** 获取新闻 */ public News getNews() { // 检查消息类型 checkMsgType(MSG_TYPE_NEWS); // 返回消息内容 return this.news; } ...}Union类使用:String accessToken = ...;String toUser = ...;List<Article> articleList = ...;News news = new News(articleList);CustomerMessage customerMessage = new CustomerMessage(toUser, news);wechatApi.sendCustomerMessage(accessToken, customerMessage);主要优缺点:优点:更贴近C/C++语言的联合体(union);缺点:实现逻辑较为复杂,参数类型验证较多。7.2.使用继承方式实现UnionUnion类实现:/** 客户消息类 */@Getter@Setter@ToStringpublic abstract class CustomerMessage { /** 属性相关 */ /** 消息类型 */ private String msgType; /** 目标用户 */ private String toUser; /** 常量相关 */ /** 新闻消息 */ public static final String MSG_TYPE_NEWS = "news"; ... /** 构造函数 */ public CustomerMessage(String msgType) { this.msgType = msgType; } /** 构造函数 */ public CustomerMessage(String msgType, String toUser) { this.msgType = msgType; this.toUser = toUser; }}/** 新闻客户消息类 */@Getter@Setter@ToString(callSuper = true)public class NewsCustomerMessage extends CustomerMessage { /** 属性相关 */ /** 新闻内容 */ private News news; /** 构造函数 */ public NewsCustomerMessage() { super(MSG_TYPE_NEWS); } /** 构造函数 */ public NewsCustomerMessage(String toUser, News news) { super(MSG_TYPE_NEWS, toUser); this.news = news; }}Union类使用:String accessToken = ...;String toUser = ...;List<Article> articleList = ...;News news = new News(articleList);CustomerMessage customerMessage = new NewsCustomerMessage(toUser, news);wechatApi.sendCustomerMessage(accessToken, customerMessage);主要优缺点:优点:使用虚基类和子类进行拆分,各个子类对象的概念明确;缺点:与C/C++语言的联合体(union)差别大,但是功能上大体一致。在C/C++语言中,联合体并不包括联合体当前的数据类型。但在上面实现的Java联合体中,已经包含了联合体对应的数据类型。所以,从严格意义上说,Java联合体并不是真正的联合体,只是一个具备“多个数据每次只取其一”功能的类。8.使用泛型屏蔽类型的差异性在C++语言中,有个很好用的模板(template)功能,可以编写带有参数化类型的通用版本,让编译器自动生成针对不同类型的具体版本。而在Java语言中,也有一个类似的功能叫泛型(generic)。在编写类和方法的时候,一般使用的是具体的类型,而用泛型可以使类型参数化,这样就可以编写更通用的代码。许多人都认为,C++模板(template)和Java泛型(generic)两个概念是等价的,其实实现机制是完全不同的。C++模板是一套宏指令集,编译器会针对每一种类型创建一份模板代码副本;Java泛型的实现基于"类型擦除"概念,本质上是一种进行类型限制的语法糖。8.1.泛型类以支撑类为例,定义泛型的通用支撑类:/** 通用支撑类 */@Getter@Setter@ToStringpublic class GenericHolder<T> { /** 通用取值 */ private T value; /** 构造函数 */ public GenericHolder() {} /** 构造函数 */ public GenericHolder(T value) { this.value = value; }}8.2.泛型接口定义泛型的数据提供者接口:/** 数据提供者接口 */public interface DataProvider<T> { /** 获取数据函数 */ public T getData();}8.3.泛型方法定义泛型的浅拷贝函数:/** 浅拷贝函数 */public static <T> T shallowCopy(Object source, Class<T> clazz) throws BeansException { // 判断源对象 if (Objects.isNull(source)) { return null; } // 新建目标对象 T target; try { target = clazz.newInstance(); } catch (Exception e) { throw new BeansException("新建类实例异常", e); } // 拷贝对象属性 BeanUtils.copyProperties(source, target); // 返回目标对象 return target;}8.4.泛型通配符泛型通配符一般是使用"?"代替具体的类型实参,可以把"?"看成所有类型的父类。当具体类型不确定的时候,可以使用泛型通配符 "?";当不需要使用类型的具体功能,只使用Object类中的功能时,可以使用泛型通配符 "?"/** 打印取值函数 */public static void printValue(GenericHolder<?> holder) { System.out.println(holder.getValue());}/** 主函数 */public static void main(String[] args) { printValue(new GenericHolder<>(12345)); printValue(new GenericHolder<>("abcde"));}在Java规范中,不建议使用泛型通配符"?",上面函数可以改为:/** 打印取值函数 */public static <T> void printValue(GenericHolder<T> holder) { System.out.println(holder.getValue());}8.5.泛型上下界在使用泛型的时候,我们还可以为传入的泛型类型实参进行上下界的限制,如:类型实参只准传入某种类型的父类或某种类型的子类。泛型上下界的声明,必须与泛型的声明放在一起 。上界通配符(extends):上界通配符为”extends”,可以接受其指定类型或其子类作为泛参。其还有一种特殊的形式,可以指定其不仅要是指定类型的子类,而且还要实现某些接口。例如:List<? extends A>表明这是A某个具体子类的List,保存的对象必须是A或A的子类。对于List<? extends A>列表,不能添加A或A的子类对象,只能获取A的对象。下界通配符(super):下界通配符为”super”,可以接受其指定类型或其父类作为泛参。例如:List<? super A>表明这是A某个具体父类的List,保存的对象必须是A或A的超类。对于List<? super A>列表,能够添加A或A的子类对象,但只能获取Object的对象。PECS(Producer Extends Consumer Super)原则:作为生产者提供数据(往外读取)时,适合用上界通配符(extends);作为消费者消费数据(往里写入)时,适合用下界通配符(super)。在日常编码中,比较常用的是上界通配符(extends),用于限定泛型类型的父类。例子代码如下:/** 数字支撑类 */@Getter@Setter@ToStringpublic class NumberHolder<T extends Number> { /** 通用取值 */ private T value; /** 构造函数 */ public NumberHolder() {} /** 构造函数 */ public NumberHolder(T value) { this.value = value; }}/** 打印取值函数 */public static <T extends Number> void printValue(GenericHolder<T> holder) { System.out.println(holder.getValue());}后记笔者曾在通信行业从业十余年,接入了各类网管和设备的北向接口协议上百余种,涉及到传输、交换、接入、电源、环境等专业,接触了CORBA、HTTP/HTTPS、WebService、Socket TCP/UDP、串口RS232/485等接口,总结出一套接口协议封装的"方法论"其中,把接口协议文档中的数据格式转化为Java的枚举、结构体、联合体等数据结构,是接口协议封装中极其重要的一步。作者:陈昌毅,花名常意

来源:中国网财经



房产是一种透支未来的消费方式,也可以看做是一种投资未来的理财行为。早在去年就有专家表示,中国住宅人均达1.1套,人均建筑面积大概在35-40平米之间。可能这里许多无房一族又要拍“砖”——“我的房子去哪了”!很显然,一定是被平均了。事实上,买房已经超出了消费的范畴,更像是一种基于需求的从众行为。关于买房,首先需要明白的一个浅显的道理是:刚需什么时候买都合适,越早下手越好。至于怎么买划算?我们今天就来重点讲一讲这个问题。 买房该怎么贷款?我们知道,贷款是实现购房愿望的一个有效的支点,能帮助购房者通过首付来撬动遥不可及的房子。这里强调一下,有能力一次性付款的土豪,不在本文探讨之列。我们先从贷款买房的两个必选“动作”——贷款年限与还款方式说起。众所周知,房贷在政策允许范围内的最高贷款年限是30年(会受年龄的限制)。当然,购房者也可以选择30年内的任意年限作为房贷的借贷周期。在买房时,可能很多人都会思考一个,贷多长时间比较合适?以上是我们按LPR为4.85%贷款100W,分别计算出贷款20年和30年的还贷情况(均采用等额本息还款方式)。计算结果很直观地告诉我们:贷款20年要比30年每月多还1240元,同时,总利息要少还约33.56W元。也就是说,选择贷款年限少一些,虽然前期还款压力会大一些,但是在贷款周期内能省下不少的利息。那么,贷款年限短就一定好么?我们接着从另一个维度看。我们知道无论是商贷、公积金贷款还是公积金和商贷的组合贷款,还款方式无非就两种,即等额本息和等额本金。但是,无论我们选择哪种方式,都是在跟银行比算账。最终的结果,可想而知……如上,我们还是按LPR为4.85%的利率,以商业贷款100W来算,在30年的还款周期中,等额本金的还款方式,要比等额本息的方式少还170170元的利息。所以,很多购房者在算账时,多数是这样的思维——贷款年限越短越省钱,等额本金的还款方式比等额本息的还款方式更省钱。这无可厚非。因为这是明面上的账,这样算并没有错。但是,从长远来看,或许也是值得商榷的。前述提到,房贷的基准利率自2015年调整之后,均保持在4.9%左右,如今按LPR来计算,不低于4.85%的利率标准,相较于其他贷款更是比较低了。即便是利率加更高的基点(10月,现阶段目前大多数是4.85%+55个基点,首套在5.4%左右),通常来看,也算是“低息”贷款。我们拿蚂蚁JB普遍0.04%(根据信用指数,万四是相对普遍的利率)的利率来算,100W的借款,等额本息的还款方式,30年的利息为2477835元。与同样是100W的房贷,等额本息还款方式,30年约899691元的利息相比,整整多出约2.75倍。分晓立见。房贷利率的优势不言自明。也就是说,与其用缩短贷款年限、等额本金还款的方式,增加当前的还款压力以节省未来的利息支出,还不如最大限度的用好银行给予的“空间”,让自己手里多点钱,用“钱生钱”的方式去创造更高的价值。因此,在房贷利率处于较低水平(比如LPR为4.85%)的前提下,长贷、多贷是一种相对划算的方式。即便是利率大涨,或者受其他不可预知的政策影响,也不用担心。别忘了,购房者手里还有一张万不得已时可使用的牌——“提前还贷” 提前还款划算?为什么要把“提前还贷”说成是万不得已之举呢?其实,前面已经说得很明确了,房贷这种相对“低息”的贷款,完全属于不用白不用的“实惠”所以,不用太过计较明面上的账,不要想着缩短贷款期限或者选择省钱的还款方式为未来节省多少利息,更不用想着通过提前还款来终结银行的利息收入。事实上,实践的经验已经告诉我们,房价涨幅的盈余大多是能跑赢房贷利息支出的。因此,提前还款对于购房者而言,是一件比较没有实际意义的事情。特别是采用等额本息的还款方式的购房者,从一开始就是在多还利息(相比等额本金),提前还款等于把后面的利息提前还了,等同于没有享受到房贷的“低息”红利。当然,除非你需要换取贷票(首套资格),否则,提前还款的意义真心不大。20年期(基准利率为4.9%)房贷还款变化图(来源于网络)如果非要提前还贷,10头牛都拉不回来那种,那么,什么时候还款相对要划算一些呢?大概总结下来就是(以30年的贷款周期计算):等额本息不超过贷款年限的1/3,也就是10年;等额本金不超过贷款年限的一半,也就是15年。具体来看,等额本息是把贷款的本金总额与利息总额相加,然后平均分摊到每个月,这样一来,每月还款中的本金比重逐月递增、利息比重在逐月递减。如果30年的贷款期限,你已经还了将近1/3了,等于已经还了大部分的利息,在这之后提前还贷就没有什么意义了。因此,房贷初期利息还得多,提前还可以减少利息负担,相对划算一些。而等额本金是将贷款的本金总额平分,然后根据所剩本金计算每期的还款利息,越到后期,所剩本金越少,所产生的利息也越少。同样,如果贷款已经还了将近一半的时间,意味着利息也还了一大半了,所以这时候提前还款也变得没有意义了。当然,以上列出的只是提前还贷相对划算的时间点,是非还不可的前提下的一种选择。事实上,对于提前还款而言,重要的不是要不要提前还,而是还了干什么!之前,在《预算100W如何买房?》一文中,就破解“限贷”进行了详细阐述,后面咱们也提到过利用父母名字购房的“接力贷”(详见前文《10月到了开发商打折了吗》),都是一种有效规避限贷的手段,最终目的,也是最大化的利用房贷的杠杆,实现买房的目的。更直白地说,与其提前还房贷,不如拿准备去提前还贷的钱去做能够跑赢房贷利率的事情,或者,干脆再买一套房(要自己评估还款能力哟)。相信,能算得清楚房贷这笔账的人,都会明白这个道理的!

return;



大家好,今天给大家说说猫咪吐毛球的防治方法,猫咪呕吐不是小事,你见过猫吐毛球?发现猫咪吐毛球需要怎么处理,这种现象正常吗?猫咪是一种呕吐机制非常发达的动物。大多数情况下,它们的呕吐是一种正常的生理反应。吃得太多太胀,吃了猫毛,误食了异物等,它们都会呕吐,要将一切令它不舒服的东西统统吐出去,这种呕吐属于生理性呕吐,但还有一些疾病,也会造成猫咪呕吐。但这两者之间的界限非常模糊,主人一定要注意分辨。另外,即便是生理性呕吐,也并不代表猫咪没有身体问题,其实呕吐不是小事,下面来数一数有哪些注意事项吧。猫咪会吐毛球的情况,是因为它们有舔毛发进行自我清洁的习惯,在舔毛的过程中它们难免会将一部分猫毛吞进肚子里。这部分猫毛累积到一定的量后,猫咪就会通过呕吐排出粗条状毛团,这些毛球看上去有些像猫咪的便便,这是因为它们已经在胃部存在了一段时间,颜色跟没有消化的实物颜色近似,被吐出来的时候,被食道挤压成很紧实的梭形。还有些时候,由于猫毛进入猫咪胃部时间太长,来不及结成团就因为刺激被吐出来。所以,主人会在家里发现被猫咪吐出来的食物残渣,伴随着沾着黏液的猫毛。到底是吐毛球好?还是不吐毛球好?毛球、便便你真的能分清楚?毛球不会像便便那么有味道,毛球是猫毛的结合,毛球的周围一般伴随着食物、胃液等。有些主人从来没见过猫咪吐毛球,只见过猫咪干呕。这有三种可能性;一种是猫咪呕吐的力量不足,没能将毛球吐出;一种可能是毛球已经阻塞了消化道,导致猫咪根本吐不出毛球;一种是猫咪患有其他疾病。有些猫咪会经由肠道排出毛球,主人也认为这样更安心一些。殊不知,经常由肠道排出毛球,一旦毛球量过大,而猫咪的肠道蠕动不足,便会出现毛球卡住肠道,导致严重的肠梗阻的出现。不能忽视猫咪的每一次呕吐。有时候,激烈的呕吐也会带出猫咪胃里一部分毛球。主人还是需要综合观察猫咪的表现才能做出准确的判断。如果进入猫咪消化道的毛球无法排除,会导致猫咪只要进食就会呕吐。如情况进一步恶化,猫咪会出现精神差、没食欲、毛发粗糙、便秘等现象。当猫咪胃肠道被毛球堵住,猫咪很快会出现脱水及脏器衰竭的情况,此时就需要进行手术治疗了。对抗毛球的方式有哪些?化毛膏,主要包括植物有和矿物油。这些油脂的作用就是润滑消化道,以及帮助软化被毛,防止纠结成团。化毛膏里添加了猫咪所需的多种维生素、牛磺酸等营养,以及肉或奶酪成分,让猫咪主动舔甚至喜欢吃化毛膏,能增加消化道蠕动。去毛球干粮,去毛球猫粮以及去毛球零食。其作用机理是将超细的纤维粉添加到猫粮中,促进猫咪肠胃蠕动。去毛球湿粮,添加益生菌和粗纤维的排毛球罐头,起到帮助猫咪消化、排出毛球的作用。天然猫草,对猫咪无毒,低过敏性可食用的植物。长用的猫草有大麦、小麦、燕麦、裸麦等初生的麦苗猫草,它们即是高纤维食物,能促进消化帮助分解毛球,又能促进肠胃蠕动,同时叶子上的绒毛可以起到催吐的作用。主人可以自种,也可以购买干猫草。不过,相对于新鲜的猫草,干猫草的催吐性要差一些。如果猫咪自己不吃猫草,可以将猫草切碎了拌在猫粮中给猫咪喂食。经常梳理被毛,当然是减少猫咪因舔吃进过量猫毛的重要手段之一。增加运动量,增加猫咪的运动可以促进猫咪肠胃蠕动,增强球的排出能力。重点提示,很多的猫咪会因为换粮以及去毛球成分的刺激,在更换了有去毛球效果的猫粮之后出现经常呕吐或腹泻的情况。这需要主人按照换粮的流程及时正确换粮,同时,在喂食一段时间去毛球猫粮达到预期效果后需要及时换回正常猫粮。去毛球湿粮比去毛球干粮对猫咪的刺激性小。其实长毛猫、老年猫以及患有异食癖的猫咪需要主人格外留意。长毛猫被毛层次更多,每到换毛季节,被吞进胃里的毛会比短毛猫多。同时,由于它们被毛的质地更柔软细腻,也就更容易纠结成团,因此,长毛猫患毛球症的可能性要高于短毛猫。好了关于猫咪吐毛球的一些诊断跟治疗方法就说到这里了,谢谢大家的观看,有疑问可以在下方留言区进行讨论。

新京报讯(记者 刘洋)演员叶璇在高铁上阻止一名大声外放手机音乐的老人,被对方反怼,她将此视频发布在微博上引发网友关注。今日(10月12日)上午,中国铁路客户服务中心(12306)人员接到新京报记者反映后坦言,乘客在高铁上有此行为只能由工作人员帮助进行劝阻,确实尚无强制性规定,会将此建议向相关部门反映,加强管理工作。

"从无到有 从小到大 从弱到强

新加坡义安理工学院成立于1965年,是新加坡政府创办五所理工学院之一,属国立大学。该校环境优美,具有现代化气息,同时学院有现代化的图书馆,学生发展中心,所有的教室和图书馆都有空调,学院设施齐全,教学环境幽雅吸引着无数的海内外学子,在培养学生掌握各种专业技术的同时,还注意培养学生的创新思维能力,使学生毕业后成为一名全面发展的高科技管理人才。怎么样能考上新加坡义安理工学院?高三在读,各科成绩在80%以上/会考成绩在70%以上高中毕业,高考成绩在65%以上;并需要参加校方入学考试(英语、数学、物理、面试)高考分数达到二本线新加坡义安理工学院特色义安理工学院的治学以全球发展趋势为导向,结合独特的教育思想和管理经验,学科布局合理,教学模式先进。首创的义安学习模式,面向实践, 课程设置灵活多样,多元化的跨学科教学打破了传统教育的局限,应用多媒体科技和网上教学,让学生的学习生活多姿多彩,贴近实际而又充满活力。据立思辰留学了解,在课程设计和发展上,学院注重学生反馈与专家意见,力争做到与时并进。充满挑战性的课程让学生充分发挥潜能,为将来的事业发展打下牢固基础。义安理工学院重视与国内外企业的合作,积极建立合作网络,拓展学生就业市场。

热点栏目


[责任编辑:励诗婷]
返回小宋网首页