1 Star 0 Fork 0

Beny / BenyZheng

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
index.html 114.16 KB
一键复制 编辑 原始数据 按行查看 历史
Beny 提交于 2020-11-25 00:40 . Site updated: 2020-11-25 00:39:13
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332
<!DOCTYPE html>
<html class="theme-next muse use-motion" lang="zh-Hans">
<head><meta name="generator" content="Hexo 3.8.0">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<script src="/libs/pace/pace.min.js?v=1.0.2"></script>
<link rel="stylesheet" href="/libs/pace/pace-theme-flash.min.css?v=1.0.2">
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Monda:300,300italic,400,400italic,700,700italic|Roboto Slab:300,300italic,400,400italic,700,700italic|Monda:300,300italic,400,400italic,700,700italic|Lobster Two:300,300italic,400,400italic,700,700italic|Monda:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext">
<link rel="stylesheet" href="/libs/font-awesome/css/font-awesome.min.css?v=4.6.2">
<link rel="stylesheet" href="/css/main.css?v=7.1.0">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=7.1.0">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon.ico?v=7.1.0">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon_small.ico?v=7.1.0">
<link rel="mask-icon" href="/images/logo.svg?v=7.1.0" color="#222">
<script id="hexo.configurations">
var NexT = window.NexT || {};
var CONFIG = {
root: '/',
scheme: 'Muse',
version: '7.1.0',
sidebar: {"position":"left","display":"hide","offset":12,"onmobile":true,"dimmer":false},
back2top: true,
back2top_sidebar: false,
fancybox: false,
fastclick: false,
lazyload: false,
tabs: true,
motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
algolia: {
applicationID: '',
apiKey: '',
indexName: '',
hits: {"per_page":10},
labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
}
};
</script>
<meta property="og:type" content="website">
<meta property="og:title" content="Beny&#39;s blog">
<meta property="og:url" content="https://benyzheng.github.io/index.html">
<meta property="og:site_name" content="Beny&#39;s blog">
<meta property="og:locale" content="zh-Hans">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Beny&#39;s blog">
<link rel="canonical" href="https://benyzheng.github.io/">
<script id="page.configurations">
CONFIG.page = {
sidebar: "",
};
</script>
<title>Beny's blog</title>
<noscript>
<style>
.use-motion .motion-element,
.use-motion .brand,
.use-motion .menu-item,
.sidebar-inner,
.use-motion .post-block,
.use-motion .pagination,
.use-motion .comments,
.use-motion .post-header,
.use-motion .post-body,
.use-motion .collection-title { opacity: initial; }
.use-motion .logo,
.use-motion .site-title,
.use-motion .site-subtitle {
opacity: initial;
top: initial;
}
.use-motion .logo-line-before i { left: initial; }
.use-motion .logo-line-after i { right: initial; }
</style>
</noscript>
</head>
<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">
<div class="container sidebar-position-left
page-home">
<div class="headband"></div>
<header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-wrapper">
<div class="site-meta">
<div class="custom-logo-site-title">
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<span class="site-title">Beny's blog</span>
<span class="logo-line-after"><i></i></span>
</a>
</div>
<p class="site-subtitle">Nothing worth having comes easy.</p>
</div>
<div class="site-nav-toggle">
<button aria-label="切换导航栏">
<span class="btn-bar"></span>
<span class="btn-bar"></span>
<span class="btn-bar"></span>
</button>
</div>
</div>
<nav class="site-nav">
<ul id="menu" class="menu">
<li class="menu-item menu-item-home menu-item-active">
<a href="/" rel="section"><i class="menu-item-icon fa fa-fw fa-home"></i> <br>首页</a>
</li>
<li class="menu-item menu-item-tags">
<a href="/tags/" rel="section"><i class="menu-item-icon fa fa-fw fa-tags"></i> <br>标签<span class="badge">21</span></a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives/" rel="section"><i class="menu-item-icon fa fa-fw fa-archive"></i> <br>归档<span class="badge">89</span></a>
</li>
<li class="menu-item menu-item-search">
<a href="javascript:;" class="popup-trigger">
<i class="menu-item-icon fa fa-search fa-fw"></i> <br>搜索</a>
</li>
</ul>
<div class="site-search">
<div class="popup search-popup local-search-popup">
<div class="local-search-header clearfix">
<span class="search-icon">
<i class="fa fa-search"></i>
</span>
<span class="popup-btn-close">
<i class="fa fa-times-circle"></i>
</span>
<div class="local-search-input-wrapper">
<input autocomplete="off" placeholder="搜索..." spellcheck="false" type="text" id="local-search-input">
</div>
</div>
<div id="local-search-result"></div>
</div>
</div>
</nav>
</div>
</header>
<a href="https://github.com/bengzheng" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewbox="0 0 250 250" style="fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"/><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"/><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"/></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style>
<main id="main" class="main">
<div class="main-inner">
<div class="content-wrap">
<div id="content" class="content">
<section id="posts" class="posts-expand">
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://benyzheng.github.io/2020/11/08/Java基础/Java知识随记/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Beny">
<meta itemprop="description" content>
<meta itemprop="image" content="/uploads/avatar.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Beny's blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2020/11/08/Java基础/Java知识随记/" class="post-title-link" itemprop="url">Java知识随记</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2020-11-08 12:12:57" itemprop="dateCreated datePublished" datetime="2020-11-08T12:12:57+08:00">2020-11-08 12:12:57</time>
<!-- old version
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2020-11-09 00:05:56" itemprop="dateModified" datetime="2020-11-09T00:05:56+08:00">2020-11-09</time>
-->
<!-- new version -->
<span class="post-updated">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time itemprop="dateUpdated" datetime="2020-11-09T00:05:56+08:00" content="2020-11-09">
2020-11-09 00:05:56
</time>
</span>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Java基础/" itemprop="url" rel="index"><span itemprop="name">Java基础</span></a></span>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/2020/11/08/Java基础/Java知识随记/#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/2020/11/08/Java基础/Java知识随记/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h2 id="使用set存储对象为什么需要重写equals和hascode方法"><a href="#使用set存储对象为什么需要重写equals和hascode方法" class="headerlink" title="使用set存储对象为什么需要重写equals和hascode方法"></a>使用set存储对象为什么需要重写equals和hascode方法</h2><p>equals和hascode方法是Object的两个方法,作用是:</p>
<p>1、区分两个Object</p>
<p>2、给子类重写,让子类去实现自己的区分逻辑。</p>
<p>Object的源码是如何区分两个Object的</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">public boolean equals(Object obj) &#123;</span><br><span class="line"> return (this == obj);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p><strong>对于hashCode,源码注释中这样解释的</strong></p>
<p>1、它是一个代表Object的整数int值,它有利于哈希表的存储使用。(重要)</p>
<p>2、无论何时调用同一对象此方法,返回值都应是相同的。(equals用到的比较信息没有被修改的情况下)</p>
<p>3、如果equals()方法确定了两个对象相等,则这两个对象的hashCode必须返回相同的值(这点就可以决定重写equals()方法就必须重写hashCode方法了)</p>
<p>4、如果equals()方法确定了两个对象不相等,这个两个对象的hashCode还是有可能相等的。但是我们强烈建议不同的对象应该有着不同的hashCode,这样可以提高hash tables的使用效率。</p>
<p><strong>为什么要重写equals()和hashCode()方法的原因有两个</strong></p>
<p>1、重写equals()是为了实现自己的区分逻辑。</p>
<p>2、重写hashCode()是为了提高hash tables的使用效率。</p>
<p>所以当set存储对象,set集合只能存储不同的元素,对象如果不重写equals方法,则会以==比较两个对象的内存地址,这个是必然不相同的,所以重写equals方法让两个对象的比较是对象中其中一个或几个属性的内容比较如id、name</p>
<p>重写equals为什么需要重写hascode方法呢?原因是当需要使用到一些集合类如hashmap、hashset等存储对象时候,是通过equals方法去判断是否相等,如果不重写hascode方法,但equals判断相同时候,hascode值可能不同,因为equals判断相同的因素和hascode不同(举例:equals判断对象的属性,hascode判断对象的地址),所以当重写equals方法时候,必须重写hascode方法,避免在使用该对象存储的集合类出现判断相不相同的情况出现不一致。</p>
<h2 id="java和mysql时间处理"><a href="#java和mysql时间处理" class="headerlink" title="java和mysql时间处理"></a>java和mysql时间处理</h2><table>
<thead>
<tr>
<th>MySql的时间类型</th>
<th>Java中与之对应的时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>date</td>
<td>java.sql.Date</td>
</tr>
<tr>
<td>Datetime</td>
<td>java.sql.Timestamp</td>
</tr>
<tr>
<td>Timestamp</td>
<td>java.sql.Timestamp</td>
</tr>
<tr>
<td>Time</td>
<td>java.sql.Time</td>
</tr>
<tr>
<td>Year</td>
<td>java.sql.Date</td>
</tr>
</tbody>
</table>
<h2 id="java流式操作"><a href="#java流式操作" class="headerlink" title="java流式操作"></a>java流式操作</h2><p>它抽象出一种叫做流的东西让你以声明的方式处理数据,更重要的是,它还实现了多线程:帮你处理底层诸如线程、锁、条件变量、易变变量等等。</p>
<p>假定你需要过滤出一沓发票找出哪些跟特定消费者相关的,以金额大小排列,再取出这些发票的ID。如果用Stream API,你很容易写出下面这种优雅的查询:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">List ids = invoices.stream().filter(</span><br><span class="line"> inv -&gt;inv.getCustomer() == Customer.ORACLE)</span><br><span class="line"> .sorted(comparingDouble(Invoice::getAmount))</span><br><span class="line"> .map(Invoice::getId).collect(Collectors.toList());</span><br></pre></td></tr></table></figure>
<h4 id="什么是流:"><a href="#什么是流:" class="headerlink" title="什么是流:"></a>什么是流:</h4><p>通俗地讲,你可以认为是支持类似数据库操作的“花哨的迭代器”。技术上讲,它是从某个数据源获得的支持聚合操作的元素序列。下面着重介绍一下正式的定义:<br><strong>元素序列</strong><br>针对特定元素类型的有序集合流提供了一个接口。但是流不会存储元素,只会根据要求对其做计算。<br><em>数据源</em><br>流所用到的数据源来自集合、数组或者I/O。<br><strong>聚合操作</strong><br>流支持类似数据库的操作以及函数式语言的基本操作,比如filter,map,reduce,findFirst,allMatch,sorted等待。</p>
<p>此外,流操作还有两种额外的基础属性根据不同的集合区分:<br><strong>管道连接</strong><br>许多流操作返回流本身,这种操作可以串联成很长的管道,这种方式更加有利于像延迟加载,短路,循环合并等操作。<br><strong>内部迭代器 </strong><br>不像集合依赖外部迭代器,流操作在内部帮你实现了迭代器。</p>
<h4 id="流操作"><a href="#流操作" class="headerlink" title="流操作"></a>流操作</h4><p>流接口在java.util.stream.Stream定义了许多操作,这些可以分为以下两类:</p>
<ul>
<li>像filter,sorted和map一样的可以被连接起来形成一个管道的操作。</li>
<li>像collect,findFirst和allMatch一样的终止管道并返回数据的操作。</li>
</ul>
<p>可以被连接起来的操作被称为<em>中间操作</em>,它们能被连接起来是因为都返回流。中间操作都“很懒”并且可以被优化。终止一个流管道的操作被叫做<em>结束操作</em>,它们从流管道返回像List,Integer或者甚至是void等非流类型的数据。<br>下面我们介绍一下流里面的一些方法,完整的方法列表可以在java.util.stream.Stream找到。</p>
<h4 id="Filter"><a href="#Filter" class="headerlink" title="Filter"></a>Filter</h4><p>有好几个方法可以用来从流里面过滤出元素:<br>filter<br>通过传递一个预期匹配的对象作为参数并返回一个包含所有匹配到的对象的流。<br>distinct<br>返回包含唯一元素的流(唯一性取决于元素相等的实现方式)。<br>limit<br>返回一个特定上限的流。<br>skip<br>返回一个丢弃前n个元素的流。<br><code>List expensiveInvoices= invoices.stream().filter(inv -&gt; inv.getAmount() &gt; 10_000).limit(5).collect(Collectors.toList());</code></p>
<h4 id="Matching"><a href="#Matching" class="headerlink" title="Matching"></a>Matching</h4><p>匹配是一个判断是否匹配到给定属性的普遍的数据处理模式。你可以用anyMatch,allMatch和noneMatch来匹配数据,它们都需要一个预期匹配的对象作为参数并返回一个boolen型的数据。例如,你可以用allMatch来检查是否所有的发票流里面的元素的值都大于1000:<br><code>boolean expensive =invoices.stream().allMatch(inv -&gt; inv.getAmount() &gt; 1_000);</code></p>
<h4 id="Finding"><a href="#Finding" class="headerlink" title="Finding"></a>Finding</h4><p>此外,流接口还提供了像findFirst和findAny等从流中取出任意的元素。它们能与像filter方法相连接。findFirst和findAny都返回一个可选对象(我们已经在第一章中讨论过)。<br><code>Optional =invoices.stream().filter(inv -&gt;inv.getCustomer() == Customer.ORACLE).findAny();</code></p>
<h4 id="Mapping"><a href="#Mapping" class="headerlink" title="Mapping"></a>Mapping</h4><p>流支持映射方法,传递一个函数对象作为方法,把流中的元素转换成另一种类型。这种方法应用于单个元素,将其映射成新元素。<br>例如,你有可能想用它来提取流中每个元素的信息。下面这段代码从一列发票中返回一列ID:<br><code>List ids= invoices.stream().map(Invoice::getId).collect(Collectors.toList());</code></p>
<h4 id="Reducing"><a href="#Reducing" class="headerlink" title="Reducing"></a>Reducing</h4><p>另一个常用的模式是把数据源中的所有元素结合起来提供单一的值。例如,“计算最高金额的发票” 或者 “计算所有发票的总额”。 这可以应用流中的reduce方法反复应用于每个元素直到返回最后数据。<br>下面是reduce模式的例子,能帮你了解如何用for循环来计算一列数据的和:<br><code>int sum = 0;for (int x : numbers) {sum += x;}</code><br>对一列数据的每一个元素的值反复应用加法运算符获得结果,最终将一列值减少到一个值。这段代码用到两个参数:初始化总和变量,这里是0;用来结合所有列表里面元素的操作方法,这里是加法操作。<br>在流上应用reduce方法,可以把流里面的所有元素相加,如下:<br><code>int sum = numbers.stream().reduce(0, (a, b) -&gt; a + b);</code><br>reduce方法需要两个参数:</p>
<ul>
<li>初始值,这里是0</li>
<li>一个BinaryOperator方法连接两个元素产生一个新元素。reduce方法本质上是抽象了重复方法模式。其他查询像“计算总和” 或者“计算最大值” 都是reduce方法的特殊用例,比如:</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">int product = numbers.stream().reduce(1, (a, b) -&gt; a * b);int max = numbers.stream().reduce(Integer.MIN_VALUE,Integer::max);</span><br></pre></td></tr></table></figure>
<h4 id="Collectors"><a href="#Collectors" class="headerlink" title="Collectors"></a>Collectors</h4><p>目前为止你所了解的方法都是返回另一个流或者一个像boolean,int类型的值,或者返回一个可选对象。相比之下,collect方法是一个结束操作,它可以使流里面的所有元素聚集到汇总结果。<br>传递给collect方法参数是一个java.util.stream.Collector类型的对象。Collector对象实际上定义了一个如何把流中的元素聚集到最终结果的方法。最开始,工厂方法Collectors.toList()被用来返回一个描述了如何把流转变成一个List的Collector对象。后来Collectors类又内建了很多相似的collectors变量。例如,你可以用Collectors.groupingBy方法按消费者把发票分组,如下:<br><code>Map&lt;Customer, List&gt; customerToInvoices= invoices.stream().collect(Collectors.groupingBy(Invoice::getCustomer));</code></p>
<h4 id="Putting-It-All-Together"><a href="#Putting-It-All-Together" class="headerlink" title="Putting It All Together"></a>Putting It All Together</h4><p>下面是一个手把手的例子你可以练习如何把老式代码用Stream API重构。下面代码的用途是按照特定消费者过滤出的与训练有关的发票,以金额高低排序,最后提取出最高的前5张发票的ID:<br><code>List oracleAndTrainingInvoices = new ArrayList();List ids = new ArrayList();List firstFiveIds = new ArrayList();for(Invoice inv: invoices) {if(inv.getCustomer() == Customer.ORACLE) {if(inv.getTitle().contains(&quot;Training&quot;)) {oracleAndTrainingInvoices.add(inv);}}}Collections.sort(oracleAndTrainingInvoices,new Comparator() {@Overridepublic int compare(Invoice inv1, Invoice inv2) {return Double.compare(inv1.getAmount(), inv2.getAmount());}});for(Invoice inv: oracleAndTrainingInvoices) {ids.add(inv.getId());}for(int i = 0; i &lt; 5; i++) {firstFiveIds.add(ids.get(i));}</code><br>接下来,你将用Stream API一步一步地重构这些代码。首先,你或者注意到代码中用到了一个中间容器来存储那些消费者是Customer.ORACLE并且title中含有“Training”字段的发票。这正是应用filter方法的地方:<br><code>Stream oracleAndTrainingInvoices= invoices.stream().filter(inv -&gt;inv.getCustomer() == Customer.ORACLE).filter(inv -&gt;inv.getTitle().contains(&quot;Training&quot;));</code><br>接下来,你需要按照数量来把这些发票排序,你可以用新的工具方法Comparator.comparing结合sorted方法来实现:<br><code>Stream sortedInvoices= oracleAndTrainingInvoices.sorted(comparingDouble(Invoice::getAmount));</code><br>下面,你需要提取ID,这是map方法的用途:<br><code>Stream ids= sortedInvoices.map(Invoice::getId);</code><br>最后,你只对前5张发票感兴趣。你可以用limit方法截取这5张发票。当你整理一下代码,再用collect方法,最终的代码如下:<br><code>List firstFiveIds= invoices.stream().filter(inv -&gt;inv.getCustomer() == Customer.ORACLE).filter(inv -&gt;inv.getTitle().contains(&quot;Training&quot;)).sorted(comparingDouble(Invoice::getAmount)).map(Invoice::getId).limit(5).collect(Collectors.toList());</code><br>当你观察一下老式的代码你会发现每一个本地变量只被存储了一次,被下一段代码用了一次。当用Stream API之后,就完全消除了这个本地变量。</p>
<h4 id="Parallel-Streams"><a href="#Parallel-Streams" class="headerlink" title="Parallel Streams"></a>Parallel Streams</h4><p>Stream API 支持方便的数据并行。换句话说,你可以明确地让流管道以并行的方式运行而不用关心底层的具体实现。在这背后,Stream API使用了Fork/Join框架充分利用了你机器的多核架构。<br>你所需要做的无非是用parallelStream()方法替换stream()方法。例如,下面代码显示如何并行地过滤金额高的发票:<br><code>List expensiveInvoices= invoices.parallelStream().filter(inv -&gt; inv.getAmount() &gt; 10_000).collect(Collectors.toList());</code><br>此外,你可以用并行方法将现有的Stream转换成parallel Stream:<br><code>Stream expensiveInvoices= invoices.stream().filter(inv -&gt; inv.getAmount() &gt; 10_000);List result= expensiveInvoices.parallel().collect(Collectors.toList());</code><br>然而,并不是所有的地方都可以用parallel Stream,从性能角度考虑,有几点你需要注意:<br><em>Splittability</em><br>parallel streams的内部实现依赖于将数据结构划分成可以让不同线程使用的难易程度。像数组这种数据结构很容易划分,而像链表或者文件这种数据结构很难划分。<br><em>Cost per element</em><br>越是计算流中单个元素花费的资源最高,应用并行越有意义。<br><em>Boxing</em><br>如果可能的话尽量用原始数据类型,这样可以占用更少的内存,也更缓存命中率也更高。<br><em>Size</em><br>流中元素的数据量越大越好,因为并行的成本会分摊到所有元素,并行节省的时间相对会更多。当然,这也跟单个元素计算的成本相关。<br><em>Number of cores</em><br>一般来说,核越多越好。<br>在实践中,如果你想提高代码的性能,你应该检测你代码的指标。Java Microbenchmark Harness (JMH) 是一个Oracle维护的流行的框架,你可以用它来帮你完成代码分析检测。如果不检测的话,简单的应用并行,代码的性能或许更差。</p>
<h4 id="Summary"><a href="#Summary" class="headerlink" title="Summary"></a>Summary</h4><p>下面是本章的重点内容:</p>
<ul>
<li><ul>
<li>流是一列支持聚合操作的来自于不同数据源的元素列表</li>
<li>流有两种类型的操作方法:中间方法和终结方法</li>
<li>中间方法可以被连接起来形成管道</li>
<li>中间方法包括filter,map,distinct和sorted</li>
<li>终结方法处理流管道并返回一个结果</li>
<li>终结方法包括allMatch,collect和forEach</li>
<li>Collectors是一个第应以了如何将流中的元素聚集到最终结果的方法,包括像List和Map一样的容器</li>
<li>流管道可以被并行地计算</li>
<li>当应用parallel stream 来提高性能时有很多个方面需要考虑,包括数据结构划分的难易程度,计算每个元素花费的高低,装箱的难易,数据量的多少和可用核的数量。</li>
</ul>
</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://benyzheng.github.io/2020/11/05/IDEA快捷键/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Beny">
<meta itemprop="description" content>
<meta itemprop="image" content="/uploads/avatar.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Beny's blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2020/11/05/IDEA快捷键/" class="post-title-link" itemprop="url">未命名</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2020-11-05 23:19:58" itemprop="dateCreated datePublished" datetime="2020-11-05T23:19:58+08:00">2020-11-05 23:19:58</time>
<!-- old version
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2020-11-10 23:17:14" itemprop="dateModified" datetime="2020-11-10T23:17:14+08:00">2020-11-10</time>
-->
<!-- new version -->
<span class="post-updated">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time itemprop="dateUpdated" datetime="2020-11-10T23:17:14+08:00" content="2020-11-10">
2020-11-10 23:17:14
</time>
</span>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/2020/11/05/IDEA快捷键/#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/2020/11/05/IDEA快捷键/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h2 id="IDEA快捷键"><a href="#IDEA快捷键" class="headerlink" title="IDEA快捷键"></a>IDEA快捷键</h2><h3 id="搜索快捷键"><a href="#搜索快捷键" class="headerlink" title="搜索快捷键"></a>搜索快捷键</h3><h4 id="1-当前类搜索"><a href="#1-当前类搜索" class="headerlink" title="1.当前类搜索"></a>1.当前类搜索</h4><h5 id="1-1-ctrl-F12"><a href="#1-1-ctrl-F12" class="headerlink" title="1.1 ctrl+F12"></a>1.1 ctrl+F12</h5><p>查看当前类中的所有成员:方法、属性、内部类</p>
<p>搜索类中某个成员位置,直接输入关键字就会匹配出当前类中所有符合的成员。选择查询结果直接定位到跳转到代码位置。</p>
<h4 id="2-项目中搜索"><a href="#2-项目中搜索" class="headerlink" title="2.项目中搜索"></a>2.项目中搜索</h4><h5 id="2-1-ctrl-shift-F"><a href="#2-1-ctrl-shift-F" class="headerlink" title="2.1 ctrl+shift+F"></a>2.1 ctrl+shift+F</h5><p>功能:在整个项目中搜索匹配符合关键词的位置</p>
<h5 id="2-2-Shift-Shift"><a href="#2-2-Shift-Shift" class="headerlink" title="2.2 Shift+Shift"></a>2.2 Shift+Shift</h5><p>功能:在整个项目中搜索匹配符合关键词的位置<br>亮点:Symbols支持模糊查询只要记住几个字母就能查询出位置</p>
<h4 id="3-查看最近修改的文件"><a href="#3-查看最近修改的文件" class="headerlink" title="3.查看最近修改的文件"></a>3.查看最近修改的文件</h4><p>快捷键:Ctrl+e 查看最近操作的文件</p>
<h2 id="IDEA断点debug调试"><a href="#IDEA断点debug调试" class="headerlink" title="IDEA断点debug调试"></a>IDEA断点debug调试</h2><p>step over:程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行)</p>
<p>step into:程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)</p>
<p>Force step into:该按钮在调试的时候能进入任何方法。</p>
<p>step out:如果在调试的时候,step into / force step into进入了一个方法,并觉得该方法没有问题,你就可以使用step out跳出该方法,返回该方法被调用处的下一行语句,注意:该方法已执行完毕。</p>
<p>Drop frame:点击该按钮后,将返回到当前方法的调用处重新执行,并且所有上下文变量都回到那个时候,只要调用链中还有上级方法,可以跳到其中的任何一个方法。</p>
<p>跨断点调试:设置多个断点开始调试,想移动到下一个断点,点击的|&gt;按钮。</p>
<p>设置变量值:这个功能可以更加快速的跳出循环语句,图形像个计算器的</p>
<p>跳到断点处:step over的前一个</p>
<p>跳到光标所在行:drop frame的后一个</p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://benyzheng.github.io/2020/10/28/mybatis/mybatis知识点/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Beny">
<meta itemprop="description" content>
<meta itemprop="image" content="/uploads/avatar.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Beny's blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2020/10/28/mybatis/mybatis知识点/" class="post-title-link" itemprop="url">mybatis知识点</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2020-10-28 00:00:00 / 修改时间:23:11:55" itemprop="dateCreated datePublished" datetime="2020-10-28T00:00:00+08:00">2020-10-28 00:00:00</time>
<!-- old version
-->
<!-- new version -->
<span class="post-updated">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time itemprop="dateUpdated" datetime="2020-10-28T23:11:55+08:00" content="2020-10-28">
2020-10-28 23:11:55
</time>
</span>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/mybatis/" itemprop="url" rel="index"><span itemprop="name">mybatis</span></a></span>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/2020/10/28/mybatis/mybatis知识点/#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/2020/10/28/mybatis/mybatis知识点/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://benyzheng.github.io/2020/10/18/mybatis/mybatis使用常见错误/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Beny">
<meta itemprop="description" content>
<meta itemprop="image" content="/uploads/avatar.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Beny's blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2020/10/18/mybatis/mybatis使用常见错误/" class="post-title-link" itemprop="url">mybatis使用常见错误</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2020-10-18 00:00:00 / 修改时间:19:27:24" itemprop="dateCreated datePublished" datetime="2020-10-18T00:00:00+08:00">2020-10-18 00:00:00</time>
<!-- old version
-->
<!-- new version -->
<span class="post-updated">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time itemprop="dateUpdated" datetime="2020-10-18T19:27:24+08:00" content="2020-10-18">
2020-10-18 19:27:24
</time>
</span>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/mybatis/" itemprop="url" rel="index"><span itemprop="name">mybatis</span></a></span>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/2020/10/18/mybatis/mybatis使用常见错误/#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/2020/10/18/mybatis/mybatis使用常见错误/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h3 id="1、使用-Param绑定对象"><a href="#1、使用-Param绑定对象" class="headerlink" title="1、使用@Param绑定对象"></a>1、使用@Param绑定对象</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">当定义接口</span><br><span class="line">int insert(HourRoomEntity hourRoomEntity);</span><br><span class="line">&lt;insert id=&quot;insert&quot; parameterType=&quot;com.qunar.scm.ct.model.hourRoom.HourRoomEntity&quot; useGeneratedKeys=&quot;true&quot; keyProperty=&quot;id&quot;&gt;</span><br><span class="line"> insert into hour_room(</span><br><span class="line"> version,</span><br><span class="line"> pkg_serial,</span><br><span class="line"> attribute,</span><br><span class="line"> create_time</span><br><span class="line"> )</span><br><span class="line"> values(</span><br><span class="line"> #&#123;version&#125;,</span><br><span class="line"> #&#123;pkgSerial&#125;,</span><br><span class="line"> #&#123;attribute&#125;,</span><br><span class="line"> now()</span><br><span class="line"> )</span><br><span class="line"> &lt;/insert&gt;</span><br><span class="line">如上去使用没有问题</span><br></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">当接口加入@param修饰对象时</span><br><span class="line">int insert(@Param(&quot;hourRoomEntity&quot;) HourRoomEntity hourRoomEntity);</span><br><span class="line"></span><br><span class="line">此时就会报错</span><br><span class="line">Error rg.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘version’ not found. Available parameters are param1, hourRoomEntity</span><br></pre></td></tr></table></figure>
<p>是因为当使用@param时,会将@param的所有参数封装到map中,必须写下如下格式</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">#&#123;hourRoomEntity.version&#125;,</span><br><span class="line">#&#123;hourRoomEntity.pkgSerial&#125;,</span><br><span class="line">#&#123;hourRoomEntity.attribute&#125;,</span><br></pre></td></tr></table></figure>
<p>对于使用@Param修饰一个对象类型,需要使用如下格式</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">#&#123;对象.成员&#125;</span><br></pre></td></tr></table></figure>
<p>当不使用@Param时,就当成一个对象来处理,只需要写成</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">#&#123;version&#125;,</span><br><span class="line">#&#123;pkgSerial&#125;,</span><br><span class="line">#&#123;attribute&#125;,</span><br></pre></td></tr></table></figure>
<p>建议@param只是在多个参数(多个简单类型或者多个实体类对象类型)中使用</p>
<p>@Param和parameterType的关系</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">二者的关系如下</span><br><span class="line"></span><br><span class="line">如果使用了@Param,就不需要在mapper.xml中设置parameterType属性了</span><br><span class="line">如果不使用@Param,就需要在mapper.xml中设置parameterType属性了。</span><br><span class="line"></span><br><span class="line">所以进行如下总结</span><br><span class="line">如果在dao接口代码中,函数中参数只有一个,那么此时就在mapper.xml中使用parameterType,不使用@param了;</span><br><span class="line">如果在dao接口中代码中,函数中参数有多个参数时,此时就使用@param,在mapper.xml中不再需要parameterType了。</span><br></pre></td></tr></table></figure>
<h3 id="2、Mybatis插入语句在mysql设置的默认值不生效问题"><a href="#2、Mybatis插入语句在mysql设置的默认值不生效问题" class="headerlink" title="2、Mybatis插入语句在mysql设置的默认值不生效问题"></a>2、Mybatis插入语句在mysql设置的默认值不生效问题</h3><p>Mybatis插入语句默认值不生效,但直接在mysql命令行是生效的</p>
<p>Mybatis语句:insert into UserInfo (userName,age,sex) values (#{userName},#{age},#{sex})</p>
<p>其中 只给userName和age传入值,sex没有传入值,期望用默认值(建数据表时规定default)填入</p>
<p>Mysql命令行语句:INSERT INTO UserInfo (userName,age) VALUE (“阿三”,18)</p>
<p>原因:</p>
<p>对比MyBatis和Mysql两条sql语句,mysql没有写sex,而MyBatis写了sex,但又没有给sex赋值因为mybatis中的sql语句是这样的,如果sex在mysql有默认值,这里使用这么一个通用的语句,如果此时不给sex传入值最后导致sex为空,也就是默认值不生效, mybatis xml代码如下:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">insert into UserInfo (userName,age,sex) values (#&#123;userName&#125;,#&#123;age&#125;,#&#123;sex&#125;)</span><br></pre></td></tr></table></figure>
<p>用动态sql insert语句解决。代码判断有某个字段的值时sql语句才包含这个字段,例如:如果有sex值传入时 insert语句里才有sex字段否者没有sex字段,具体代码如下: </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">&lt;!--一种动态的insert语句--&gt;</span><br><span class="line">&lt;sql id=&quot;userInfoColumns&quot;&gt;</span><br><span class="line"> &lt;trim suffixOverrides=&quot;,&quot;&gt;</span><br><span class="line"> &lt;if test=&quot;userName != null&quot;&gt;userName,&lt;/if&gt;</span><br><span class="line"> &lt;if test=&quot;age != null&quot;&gt;age,&lt;/if&gt;</span><br><span class="line"> &lt;if test=&quot;sex != null&quot;&gt;sex&lt;/if&gt;</span><br><span class="line"> &lt;/trim&gt;</span><br><span class="line">&lt;/sql&gt;</span><br><span class="line"> </span><br><span class="line">&lt;sql id=&quot;userInfoValues&quot;&gt;</span><br><span class="line"> &lt;trim suffixOverrides=&quot;,&quot;&gt;</span><br><span class="line"> &lt;if test=&quot;userName != null&quot;&gt;#&#123;userName&#125;,&lt;/if&gt;</span><br><span class="line"> &lt;if test=&quot;age != null&quot;&gt;#&#123;age&#125;,&lt;/if&gt;</span><br><span class="line"> &lt;if test=&quot;sex != null&quot;&gt;#&#123;sex&#125;&lt;/if&gt;</span><br><span class="line"> &lt;/trim&gt;</span><br><span class="line">&lt;/sql&gt;</span><br><span class="line"> </span><br><span class="line">&lt;insert id=&quot;insert&quot; parameterType=&quot;com.example.mybatisdemo1.domin.UserInfo&quot; keyColumn=&quot;userInfoId&quot; keyProperty=&quot;userInfoId&quot; useGeneratedKeys=&quot;true&quot;&gt;</span><br><span class="line"> insert into UserInfo(&lt;include refid=&quot;userInfoColumns&quot;/&gt;)</span><br><span class="line"> values (&lt;include refid=&quot;userInfoValues&quot;/&gt;)</span><br><span class="line">&lt;/insert&gt;</span><br><span class="line"></span><br><span class="line">&lt;trim&gt;标签去除片段首尾可能出现的多余的“,”字符</span><br></pre></td></tr></table></figure>
<h3 id="3、mybatis查询没有数据返回list时是返回空List-size-0-而不是null"><a href="#3、mybatis查询没有数据返回list时是返回空List-size-0-而不是null" class="headerlink" title="3、mybatis查询没有数据返回list时是返回空List(size=0)而不是null"></a>3、mybatis查询没有数据返回list时是返回空List(size=0)而不是null</h3><p>查询出返回的List是为空即isEmpty(),size=0,而不是null</p>
<p>所以在foreach循环list时候,不用判断list是否为null,遍历size为空则会直接跳出,不会报错</p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://benyzheng.github.io/2020/09/23/零散记/git/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Beny">
<meta itemprop="description" content>
<meta itemprop="image" content="/uploads/avatar.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Beny's blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2020/09/23/零散记/git/" class="post-title-link" itemprop="url">未命名</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2020-09-23 23:19:04" itemprop="dateCreated datePublished" datetime="2020-09-23T23:19:04+08:00">2020-09-23 23:19:04</time>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/2020/09/23/零散记/git/#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/2020/09/23/零散记/git/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>在dev分支上</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br><span class="line">git commit -m &apos;提交的备注信息&apos;</span><br><span class="line">git push -u origin dev</span><br></pre></td></tr></table></figure>
<h2 id="想将dev分支合并到master分支,操作如下:"><a href="#想将dev分支合并到master分支,操作如下:" class="headerlink" title="想将dev分支合并到master分支,操作如下:"></a>想将dev分支合并到master分支,操作如下:</h2><ul>
<li>1、首先切换到master分支上</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git checkout master</span><br></pre></td></tr></table></figure>
<ul>
<li>2、如果是多人开发的话 需要把远程master上的代码pull下来</li>
</ul>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git pull origin master</span><br><span class="line"><span class="comment">//如果是自己一个开发就没有必要了,为了保险期间还是pull</span></span><br><span class="line"> </span><br><span class="line">git pull 是将master先拉下来和本地代码合并</span><br></pre></td></tr></table></figure>
<ul>
<li>3、然后我们把dev分支的代码合并到master上</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge dev</span><br></pre></td></tr></table></figure>
<ul>
<li>4、然后查看状态及执行提交命令</li>
</ul>
<figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br><span class="line"></span><br><span class="line">On branch master</span><br><span class="line">Your branch <span class="keyword">is</span> ahead of <span class="string">'origin/master'</span> <span class="keyword">by</span> <span class="number">12</span> commits.</span><br><span class="line"> (use <span class="string">"git push"</span> to publish your local commits)</span><br><span class="line">nothing to commit, working tree clean</span><br><span class="line"></span><br><span class="line"><span class="comment">//上面的意思就是你有12个commit,需要push到远程master上 </span></span><br><span class="line">&gt; 最后执行下面提交命令</span><br><span class="line">git push origin master</span><br></pre></td></tr></table></figure>
<p>git fetch不会进行合并执行后需要手动执行git merge合并分支,而git pull拉取远程分之后直接与本地分支进行合并。更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。</p>
<p>例如执行下面语句:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git pull origin master:brantest</span><br></pre></td></tr></table></figure>
<p>将远程主机origin的master分支拉取过来,与本地的brantest分支合并。</p>
<p>后面的冒号可以省略:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git pull origin master</span><br></pre></td></tr></table></figure>
<p>表示将远程origin主机的master分支拉取过来和本地的当前分支进行合并。</p>
<p>上面的pull操作用fetch表示为:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git fetch origin master:brantest</span><br><span class="line">git merge brantest</span><br></pre></td></tr></table></figure>
<p>git 的本地版本管理有三个部分</p>
<table>
<thead>
<tr>
<th>名称</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>工作区(Working Directory)</td>
<td>我们直接编辑的文件部分</td>
</tr>
<tr>
<td>暂存区(Staged Snapshot)</td>
<td>文件执行 <code>git add .</code>后存的地方</td>
</tr>
<tr>
<td>版本库区 (Commit History)</td>
<td>文件执行 <code>git commit .</code>后存的地方</td>
</tr>
</tbody>
</table>
<p><img src="https://img-blog.csdn.net/20170721152247413?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzI0NTI2MjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="img"></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://benyzheng.github.io/2020/08/19/企业级电商项目/第二章/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Beny">
<meta itemprop="description" content>
<meta itemprop="image" content="/uploads/avatar.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Beny's blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2020/08/19/企业级电商项目/第二章/" class="post-title-link" itemprop="url">未命名</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2020-08-19 22:18:25" itemprop="dateCreated datePublished" datetime="2020-08-19T22:18:25+08:00">2020-08-19 22:18:25</time>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/2020/08/19/企业级电商项目/第二章/#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/2020/08/19/企业级电商项目/第二章/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://benyzheng.github.io/2020/08/19/企业级电商项目/第一章/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Beny">
<meta itemprop="description" content>
<meta itemprop="image" content="/uploads/avatar.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Beny's blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2020/08/19/企业级电商项目/第一章/" class="post-title-link" itemprop="url">未命名</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2020-08-19 21:07:01 / 修改时间:22:06:04" itemprop="dateCreated datePublished" datetime="2020-08-19T21:07:01+08:00">2020-08-19 21:07:01</time>
<!-- old version
-->
<!-- new version -->
<span class="post-updated">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time itemprop="dateUpdated" datetime="2020-08-19T22:06:04+08:00" content="2020-08-19">
2020-08-19 22:06:04
</time>
</span>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/2020/08/19/企业级电商项目/第一章/#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/2020/08/19/企业级电商项目/第一章/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p><img src="/2020/08/19/企业级电商项目/第一章/image-20200819213541505.png" alt="image-20200819213541505"></p>
<p><img src="/2020/08/19/企业级电商项目/第一章/image-20200819215755378.png" alt="image-20200819215755378"></p>
<p><img src="/2020/08/19/企业级电商项目/第一章/image-20200819220345106.png" alt="image-20200819220345106"></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://benyzheng.github.io/2020/08/08/docker/docker基础/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Beny">
<meta itemprop="description" content>
<meta itemprop="image" content="/uploads/avatar.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Beny's blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2020/08/08/docker/docker基础/" class="post-title-link" itemprop="url">docker基础</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2020-08-08 12:12:57 / 修改时间:17:47:54" itemprop="dateCreated datePublished" datetime="2020-08-08T12:12:57+08:00">2020-08-08 12:12:57</time>
<!-- old version
-->
<!-- new version -->
<span class="post-updated">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time itemprop="dateUpdated" datetime="2020-08-08T17:47:54+08:00" content="2020-08-08">
2020-08-08 17:47:54
</time>
</span>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/docker/" itemprop="url" rel="index"><span itemprop="name">docker</span></a></span>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/2020/08/08/docker/docker基础/#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/2020/08/08/docker/docker基础/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h3 id="docker学习概述"><a href="#docker学习概述" class="headerlink" title="docker学习概述"></a>docker学习概述</h3><ul>
<li>docker安装</li>
<li>docker命令<ul>
<li>镜像命令</li>
<li>容器命令</li>
<li>操作命令</li>
</ul>
</li>
<li>docker镜像</li>
<li>容器数据卷</li>
<li>docker file</li>
<li>docker 网络原理</li>
<li>IDEA整合docker</li>
<li>docker compose</li>
<li>docker swarm</li>
<li>CI/CD Jenkins</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://benyzheng.github.io/2020/08/03/面试题/Java基础/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Beny">
<meta itemprop="description" content>
<meta itemprop="image" content="/uploads/avatar.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Beny's blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2020/08/03/面试题/Java基础/" class="post-title-link" itemprop="url">Java基础面试题</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2020-08-03 00:00:00" itemprop="dateCreated datePublished" datetime="2020-08-03T00:00:00+08:00">2020-08-03 00:00:00</time>
<!-- old version
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2020-08-08 00:02:49" itemprop="dateModified" datetime="2020-08-08T00:02:49+08:00">2020-08-08</time>
-->
<!-- new version -->
<span class="post-updated">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time itemprop="dateUpdated" datetime="2020-08-08T00:02:49+08:00" content="2020-08-08">
2020-08-08 00:02:49
</time>
</span>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/面试题/" itemprop="url" rel="index"><span itemprop="name">面试题</span></a></span>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/2020/08/03/面试题/Java基础/#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/2020/08/03/面试题/Java基础/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h4 id="1、重写和重载的区别:"><a href="#1、重写和重载的区别:" class="headerlink" title="1、重写和重载的区别:"></a>1、重写和重载的区别:</h4><p>重载:在一个类中,方法名必须相同,参数列表(参数类型,参数个数、参数顺序)可以不同、返回类型和访问修饰符可以不同,发生在编译时。</p>
<p>重写:在父子类两类中,方法名必须相同,参数列表必须相同,返回类型必须相同;返回值范围、异常抛出范围子类要比父类小或等,访问修饰符访问子类比父类大或等;如果父类访问修饰符是private,则子类不能重写父类该方法</p>
<h4 id="2、String、StringBuilder、StringBuffer的区别"><a href="#2、String、StringBuilder、StringBuffer的区别" class="headerlink" title="2、String、StringBuilder、StringBuffer的区别"></a>2、String、StringBuilder、StringBuffer的区别</h4><p><strong>可变性:</strong></p>
<p>String类使用final关键字字符数组保存字符串,private final char value[],String对象是不可变的</p>
<p>StringBuilder和StringBuffer继承于AbstractStringBuilder类,AbstractStringBuilder类是使用char value[],没有使用到final关键字修饰,所以对象可变</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">AbstractStringBuilder.java</span><br><span class="line"><span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">AbstractStringBuilder</span> <span class="keyword">implements</span> <span class="title">Appendable</span>, <span class="title">CharSequence</span> </span>&#123; </span><br><span class="line"> <span class="keyword">char</span>[] value; </span><br><span class="line"> <span class="keyword">int</span> count; </span><br><span class="line"> AbstractStringBuilder() &#123; </span><br><span class="line"> &#125;</span><br><span class="line"> AbstractStringBuilder(<span class="keyword">int</span> capacity) &#123; </span><br><span class="line"> value = <span class="keyword">new</span> <span class="keyword">char</span>[capacity]; </span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p><strong>线程安全性:</strong></p>
<p>String对象是不可变,即常量,线程安全</p>
<p>StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,线程安全</p>
<p>StringBuilder没有对方法加锁,线程不安全</p>
<p><strong>性能:</strong></p>
<p>String:每次对String对象进行改变,都会生成一个新的String对象,然后指针指向新的String对象</p>
<p>StringBuffer:每次对StringBuffer对象进行改变,不会生成新的对象,而是改变对象引用</p>
<p>相同情况下,StringBuilder比StringBuffer提高15%的性能</p>
<ul>
<li>操作少量的数据 = String</li>
<li>单线程操作字符串缓冲区下操作大量数据 = StringBuilder</li>
<li>多线程操作字符串缓冲区下操作大量数据 = StringBuffffer</li>
</ul>
<h4 id="3、自动装箱和自动拆箱"><a href="#3、自动装箱和自动拆箱" class="headerlink" title="3、自动装箱和自动拆箱"></a>3、自动装箱和自动拆箱</h4><p>装箱:将基本类型用所对应的引用类型包装起来</p>
<p>拆箱:将包装类型转换为基本数据类型</p>
<h4 id="4、-和equals的区别"><a href="#4、-和equals的区别" class="headerlink" title="4、==和equals的区别"></a>4、==和equals的区别</h4><p>==:判断两个对象的地址是否相等,即判断两个对象是否同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)</p>
<p>equals():判断两个对象是否相等,分两种情况使用:</p>
<ul>
<li>类没有重写equals()方法,则通过equals()方法比较该类的两个对象时,等价于通过==比较两个对象</li>
<li>类重写了equals()方法,重写之后则比较两个对象的内容是否相等</li>
</ul>
<p>String、Integer、Double等引用数据类型被重写,Object的equals方法是比较两个对象的地址,而String则是比较对象内容</p>
<p>当创建String类型的对象时,虚拟机在常量池中查找有没有已经存在的值和要创建的值相同的对象,有则赋给当前引用,无则创建对象。</p>
<p>Integer、Double等则是有IntegerCache会缓存-128~127之间的对象。</p>
<p>如:Integer x = 100,会调用Integer的valueOf()方法,这个方法就是返回一个Integer对象,但是在返回前,做一个判断,判断要赋给对象的值是否在[-128,127]区间中,且IntegerCache(是Integer类的内部类,里面有一个Integer对象数组,用于存放已经存在的且范围在[-128,127]中的对象)中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新对象返回。</p>
<h4 id="5、final关键字的一些总结"><a href="#5、final关键字的一些总结" class="headerlink" title="5、final关键字的一些总结"></a>5、final关键字的一些总结</h4><p>final关键字用在三个地方:变量、方法和类</p>
<ul>
<li>final修饰变量:基本数据类型的变量,一旦初始化则不可以改变;引用类型的变量,则在对其初始化之后便不能让其指向另一个对象</li>
<li>final修饰类:当final修饰一个类时,该类不能被继承;对于 final 类中的成员,可以定义其为 final,也可以不是 final。而对于方法,由于所属类为 final 的关系,自然也就成了 final 型。</li>
<li>使用fifinal方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将fifinal方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用fifinal方法进行这些优化了)。类中所有的private方法都隐式地指定为fianl。</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://benyzheng.github.io/2020/05/22/JS/ES6/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Beny">
<meta itemprop="description" content>
<meta itemprop="image" content="/uploads/avatar.jpg">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Beny's blog">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a href="/2020/05/22/JS/ES6/" class="post-title-link" itemprop="url">ES6</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2020-05-22 00:00:00" itemprop="dateCreated datePublished" datetime="2020-05-22T00:00:00+08:00">2020-05-22 00:00:00</time>
<!-- old version
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2020-06-03 03:30:04" itemprop="dateModified" datetime="2020-06-03T03:30:04+08:00">2020-06-03</time>
-->
<!-- new version -->
<span class="post-updated">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time itemprop="dateUpdated" datetime="2020-06-03T03:30:04+08:00" content="2020-06-03">
2020-06-03 03:30:04
</time>
</span>
</span>
<span class="post-category">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/ES6/" itemprop="url" rel="index"><span itemprop="name">ES6</span></a></span>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">评论数:</span>
<a href="/2020/05/22/JS/ES6/#comments" itemprop="discussionUrl">
<span class="post-comments-count valine-comment-count" data-xid="/2020/05/22/JS/ES6/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>构造函数原型:prototype</p>
<p>构造函数通过原型分配的函数是所有对象所共享</p>
<p>每一个构造函数都有一个prototype属性,指向另一个对象,这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有,可以把那些不变的方法,直接定义在prototype对象上,这样所有的对象实例就可以共享这些方法了</p>
<p>对象原型_ proto <em>:对象都会有一个属性</em> _ proto _指向构造函数的prototype原型对象,我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有原型proto的存在,proto对象原型和原型对象prototype是等价的</p>
<p><img src="/2020/05/22/JS/ES6/image-20200525174134965.png" alt="image-20200525174134965"></p>
<p><img src="/2020/05/22/JS/ES6/image-20200525174749811.png" alt="image-20200525174749811"></p>
<p>原型链:</p>
<p><img src="/2020/05/22/JS/ES6/image-20200526161946567.png" alt="image-20200526161946567"></p>
<p><img src="/2020/05/22/JS/ES6/image-20200526162826935.png" alt="image-20200526162826935"></p>
<p> 原型对象this指向的是实例对象。</p>
<p>es6之前没有提供继承extends,可以通过构造函数和原型对象模拟继承,称为组合继承</p>
<p>call():调用这个函数,并且修改函数运行时的this指向。</p>
<p>call方法的两个参数:thisArg(),当前调用这个函数的this指向对象|arg:传递其他参数</p>
<figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span>(<span class="params">x, y</span>)</span>&#123;</span><br><span class="line"> <span class="built_in">console</span>.log(<span class="string">"ssdfsd"</span>);</span><br><span class="line"> <span class="built_in">console</span>.log(<span class="keyword">this</span>);<span class="comment">//此时this指向o对象</span></span><br><span class="line"> <span class="built_in">console</span>.log(x,y);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> o= &#123;</span><br><span class="line"> </span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//1.调用函数</span></span><br><span class="line">fn.call();</span><br><span class="line"><span class="comment">//2.改变函数的this指向</span></span><br><span class="line">fn.call(o);</span><br><span class="line"><span class="comment">//3.其他参数传递</span></span><br><span class="line">fn.call(o,<span class="number">1</span>,<span class="number">2</span>);<span class="comment">//输出结果3</span></span><br></pre></td></tr></table></figure>
<p>函数this指向总结</p>
<p><img src="/2020/05/22/JS/ES6/image-20200527163906421.png" alt="image-20200527163906421"></p>
<p>改变函数内部this指向:</p>
<p>常用方法有:bind()、call()、apply()</p>
<p>apply()方法:fun.apply(thisArg, [argsArray])</p>
<ul>
<li>thisArg:在fun函数运行时指定的this值</li>
<li>argsArray:传递的值,必须包含在数组里面</li>
<li>返回值就是函数的返回值,因为它就是调用函数</li>
</ul>
<figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//利用apply用数组进行筛选最大值</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getMaxOfArray</span>(<span class="params">numArray</span>) </span>&#123;</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">Math</span>.max.apply(<span class="literal">null</span>, numArray);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>bind()方法:fun.bind(thisArg,arg1,arg2,…)</p>
<p>bind不会调用函数,但是能改变this的指向</p>
<ul>
<li>thisArg:在fun函数运行时指定的this值</li>
<li>args1,args2:传递的其他参数</li>
<li>返回由指定的this值和初始化参数改造的原函数拷贝</li>
</ul>
<p>闭包:</p>
<p>闭包指有权访问另一个函数作用域中变量的函数,即一个作用域可以访问另一个函数内部的局部变量。</p>
<p>浅拷贝和深拷贝:</p>
<p>浅拷贝:浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用,Object.assign(target,…source)</p>
<p>深拷贝:拷贝多层,每一级别的数据都会拷贝</p>
<p>正则表达式:是用于匹配字符串中字符组合的模式,正则表达式也是一个对象</p>
<p>边界符:</p>
<p><img src="/2020/05/22/JS/ES6/image-20200603025614078.png" alt="image-20200603025614078"></p>
<p>字符类:</p>
<p>[],[^]方括号内部 取反的意思</p>
<p>量词符:</p>
<p><img src="/2020/05/22/JS/ES6/image-20200603031531876.png" alt="image-20200603031531876"></p>
<p>预定义类:</p>
<p><img src="/2020/05/22/JS/ES6/image-20200603033002649.png" alt="image-20200603033002649"></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</div>
</article>
</section>
<nav class="pagination">
<span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><span class="space">&hellip;</span><a class="page-number" href="/page/9/">9</a><a class="extend next" rel="next" href="/page/2/"><i class="fa fa-angle-right" aria-label="下一页"></i></a>
</nav>
</div>
</div>
<div class="sidebar-toggle">
<div class="sidebar-toggle-line-wrap">
<span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
</div>
</div>
<aside id="sidebar" class="sidebar">
<div class="sidebar-inner">
<div class="site-overview-wrap sidebar-panel sidebar-panel-active">
<div class="site-overview">
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
<img class="site-author-image" itemprop="image" src="/uploads/avatar.jpg" alt="Beny">
<p class="site-author-name" itemprop="name">Beny</p>
<div class="site-description motion-element" itemprop="description"></div>
</div>
<nav class="site-state motion-element">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">89</span>
<span class="site-state-item-name">日志</span>
</a>
</div>
<div class="site-state-item site-state-categories">
<a href="/categories/">
<span class="site-state-item-count">22</span>
<span class="site-state-item-name">分类</span>
</a>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags/">
<span class="site-state-item-count">21</span>
<span class="site-state-item-name">标签</span>
</a>
</div>
</nav>
<div class="links-of-author motion-element">
<span class="links-of-author-item">
<a href="/1105397915" title="1105397915 &rarr; 1105397915"><i class="fa fa-fw fa-qq"></i>1105397915</a>
</span>
<span class="links-of-author-item">
<a href="https://github.com/benyzheng" title="GitHub &rarr; https://github.com/benyzheng" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i>GitHub</a>
</span>
<span class="links-of-author-item">
<a href="/zhengbeny@qq.com" title="zhengbeny@qq.com &rarr; zhengbeny@qq.com"><i class="fa fa-fw fa-envelope"></i>zhengbeny@qq.com</a>
</span>
</div>
</div>
</div>
</div>
</aside>
</div>
</main>
<footer id="footer" class="footer">
<div class="footer-inner">
<script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<div class="copyright">&copy; 2018 – <span itemprop="copyrightYear">2020</span>
<span class="with-love" id="animate">
<i class="fa fa-user"></i>
</span>
<span class="author" itemprop="copyrightHolder">Beny</span>
</div>
<div class="theme-info">
<div class="powered-by"></div>
<span class="post-count">博客全站共235k字</span>
</div>
<div class="busuanzi-count">
<script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<span class="post-meta-item-icon">
<i class="fa fa-user"></i>
</span>
<span class="site-uv" title="总访客量">
<span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
</span>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="site-pv" title="总访问量">
<span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
</span>
</div>
</div>
</footer>
<div class="back-to-top">
<i class="fa fa-arrow-up"></i>
<span id="scrollpercent"><span>0</span>%</span>
</div>
</div>
<script>
if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
window.Promise = null;
}
</script>
<script src="/libs/jquery/index.js?v=2.1.3"></script>
<script src="/libs/velocity/velocity.min.js?v=1.2.1"></script>
<script src="/libs/velocity/velocity.ui.min.js?v=1.2.1"></script>
<script src="/js/utils.js?v=7.1.0"></script>
<script src="/js/motion.js?v=7.1.0"></script>
<script src="/js/schemes/muse.js?v=7.1.0"></script>
<script src="/js/next-boot.js?v=7.1.0"></script>
<script src="//cdn1.lncld.net/static/js/3.11.1/av-min.js"></script>
<script src="/js/src/Valine.min.js"></script>
<script>
var GUEST = ['nick', 'mail', 'link'];
var guest = 'nick,mail,link';
guest = guest.split(',').filter(function(item) {
return GUEST.indexOf(item) > -1;
});
new Valine({
el: '#comments',
verify: false,
notify: true,
appId: 'oaY0uDqkCsuX94AxTtnV6scO-gzGzoHsz',
appKey: 'HKU5SJPAd8KyYqk6Q8fdArL5',
placeholder: '写了评论, offer还会远吗? ----记得填写邮箱哦~如果可以填写你的网站互相参考就更好啦',
avatar: 'retro',
meta: guest,
pageSize: '10' || 10,
visitor: false,
lang: '' || 'zh-cn'
});
//增加以下六行代码去除 power by valine
var infoEle = document.querySelector('#comments .info');
if (infoEle && infoEle.childNodes && infoEle.childNodes.length > 0){
infoEle.childNodes.forEach(function(item) {
item.parentNode.removeChild(item);
});
}
</script>
<script>
// Popup Window;
var isfetched = false;
var isXml = true;
// Search DB path;
var search_path = "search.xml";
if (search_path.length === 0) {
search_path = "search.xml";
} else if (/json$/i.test(search_path)) {
isXml = false;
}
var path = "/" + search_path;
// monitor main search box;
var onPopupClose = function (e) {
$('.popup').hide();
$('#local-search-input').val('');
$('.search-result-list').remove();
$('#no-result').remove();
$(".local-search-pop-overlay").remove();
$('body').css('overflow', '');
}
function proceedsearch() {
$("body")
.append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
.css('overflow', 'hidden');
$('.search-popup-overlay').click(onPopupClose);
$('.popup').toggle();
var $localSearchInput = $('#local-search-input');
$localSearchInput.attr("autocapitalize", "none");
$localSearchInput.attr("autocorrect", "off");
$localSearchInput.focus();
}
// search function;
var searchFunc = function(path, search_id, content_id) {
'use strict';
// start loading animation
$("body")
.append('<div class="search-popup-overlay local-search-pop-overlay">' +
'<div id="search-loading-icon">' +
'<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
'</div>' +
'</div>')
.css('overflow', 'hidden');
$("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');
$.ajax({
url: path,
dataType: isXml ? "xml" : "json",
async: true,
success: function(res) {
// get the contents from search data
isfetched = true;
$('.popup').detach().appendTo('.header-inner');
var datas = isXml ? $("entry", res).map(function() {
return {
title: $("title", this).text(),
content: $("content",this).text(),
url: $("url" , this).text()
};
}).get() : res;
var input = document.getElementById(search_id);
var resultContent = document.getElementById(content_id);
var inputEventFunction = function() {
var searchText = input.value.trim().toLowerCase();
var keywords = searchText.split(/[\s\-]+/);
if (keywords.length > 1) {
keywords.push(searchText);
}
var resultItems = [];
if (searchText.length > 0) {
// perform local searching
datas.forEach(function(data) {
var isMatch = false;
var hitCount = 0;
var searchTextCount = 0;
var title = data.title.trim();
var titleInLowerCase = title.toLowerCase();
var content = data.content.trim().replace(/<[^>]+>/g,"");
var contentInLowerCase = content.toLowerCase();
var articleUrl = decodeURIComponent(data.url).replace(/\/{2,}/g, '/');
var indexOfTitle = [];
var indexOfContent = [];
// only match articles with not empty titles
if(title != '') {
keywords.forEach(function(keyword) {
function getIndexByWord(word, text, caseSensitive) {
var wordLen = word.length;
if (wordLen === 0) {
return [];
}
var startPosition = 0, position = [], index = [];
if (!caseSensitive) {
text = text.toLowerCase();
word = word.toLowerCase();
}
while ((position = text.indexOf(word, startPosition)) > -1) {
index.push({position: position, word: word});
startPosition = position + wordLen;
}
return index;
}
indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
});
if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
isMatch = true;
hitCount = indexOfTitle.length + indexOfContent.length;
}
}
// show search results
if (isMatch) {
// sort index by position of keyword
[indexOfTitle, indexOfContent].forEach(function (index) {
index.sort(function (itemLeft, itemRight) {
if (itemRight.position !== itemLeft.position) {
return itemRight.position - itemLeft.position;
} else {
return itemLeft.word.length - itemRight.word.length;
}
});
});
// merge hits into slices
function mergeIntoSlice(text, start, end, index) {
var item = index[index.length - 1];
var position = item.position;
var word = item.word;
var hits = [];
var searchTextCountInSlice = 0;
while (position + word.length <= end && index.length != 0) {
if (word === searchText) {
searchTextCountInSlice++;
}
hits.push({position: position, length: word.length});
var wordEnd = position + word.length;
// move to next position of hit
index.pop();
while (index.length != 0) {
item = index[index.length - 1];
position = item.position;
word = item.word;
if (wordEnd > position) {
index.pop();
} else {
break;
}
}
}
searchTextCount += searchTextCountInSlice;
return {
hits: hits,
start: start,
end: end,
searchTextCount: searchTextCountInSlice
};
}
var slicesOfTitle = [];
if (indexOfTitle.length != 0) {
slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
}
var slicesOfContent = [];
while (indexOfContent.length != 0) {
var item = indexOfContent[indexOfContent.length - 1];
var position = item.position;
var word = item.word;
// cut out 100 characters
var start = position - 20;
var end = position + 80;
if(start < 0){
start = 0;
}
if (end < position + word.length) {
end = position + word.length;
}
if(end > content.length){
end = content.length;
}
slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
}
// sort slices in content by search text's count and hits' count
slicesOfContent.sort(function (sliceLeft, sliceRight) {
if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
return sliceRight.searchTextCount - sliceLeft.searchTextCount;
} else if (sliceLeft.hits.length !== sliceRight.hits.length) {
return sliceRight.hits.length - sliceLeft.hits.length;
} else {
return sliceLeft.start - sliceRight.start;
}
});
// select top N slices in content
var upperBound = parseInt('1');
if (upperBound >= 0) {
slicesOfContent = slicesOfContent.slice(0, upperBound);
}
// highlight title and content
function highlightKeyword(text, slice) {
var result = '';
var prevEnd = slice.start;
slice.hits.forEach(function (hit) {
result += text.substring(prevEnd, hit.position);
var end = hit.position + hit.length;
result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
prevEnd = end;
});
result += text.substring(prevEnd, slice.end);
return result;
}
var resultItem = '';
if (slicesOfTitle.length != 0) {
resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
} else {
resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
}
slicesOfContent.forEach(function (slice) {
resultItem += "<a href='" + articleUrl + "'>" +
"<p class=\"search-result\">" + highlightKeyword(content, slice) +
"...</p>" + "</a>";
});
resultItem += "</li>";
resultItems.push({
item: resultItem,
searchTextCount: searchTextCount,
hitCount: hitCount,
id: resultItems.length
});
}
})
};
if (keywords.length === 1 && keywords[0] === "") {
resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x"></i></div>'
} else if (resultItems.length === 0) {
resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x"></i></div>'
} else {
resultItems.sort(function (resultLeft, resultRight) {
if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
return resultRight.searchTextCount - resultLeft.searchTextCount;
} else if (resultLeft.hitCount !== resultRight.hitCount) {
return resultRight.hitCount - resultLeft.hitCount;
} else {
return resultRight.id - resultLeft.id;
}
});
var searchResultList = '<ul class=\"search-result-list\">';
resultItems.forEach(function (result) {
searchResultList += result.item;
})
searchResultList += "</ul>";
resultContent.innerHTML = searchResultList;
}
}
if ('auto' === 'auto') {
input.addEventListener('input', inputEventFunction);
} else {
$('.search-icon').click(inputEventFunction);
input.addEventListener('keypress', function (event) {
if (event.keyCode === 13) {
inputEventFunction();
}
});
}
// remove loading animation
$(".local-search-pop-overlay").remove();
$('body').css('overflow', '');
proceedsearch();
}
});
}
// handle and trigger popup window;
$('.popup-trigger').click(function(e) {
e.stopPropagation();
if (isfetched === false) {
searchFunc(path, 'local-search-input', 'local-search-result');
} else {
proceedsearch();
};
});
$('.popup-btn-close').click(onPopupClose);
$('.popup').click(function(e){
e.stopPropagation();
});
$(document).on('keyup', function (event) {
var shouldDismissSearchPopup = event.which === 27 &&
$('.search-popup').is(':visible');
if (shouldDismissSearchPopup) {
onPopupClose();
}
});
</script>
<script>
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
bp.src = (curProtocol === 'https') ? 'https://zz.bdstatic.com/linksubmit/push.js' : 'http://push.zhanzhang.baidu.com/push.js';
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
</script>
<!-- 页面点击小红心 -->
<!-- <script type="text/javascript" src="/js/src/click.js"></script>-->
</body>
</html>
1
https://gitee.com/BenyZheng/BenyZheng.git
git@gitee.com:BenyZheng/BenyZheng.git
BenyZheng
BenyZheng
BenyZheng
master

搜索帮助