熟悉RecyclerView
的同学应该都知道,Adapter
作为RecyclerView
四大组成部分(Adapter
,LayoutManager
,ItemAnimator
,ItemDecoration
)之一,其重要性自然是不言而喻。今天,我们来分析一下Adapter
的源码。我打算将Adapter
的源码分析分为两个部分,一是,从普通的角度上来看Adapter
,从源码的角度上来分析我们日常使用的一些操作;二是,分析DiffUtil
,可能会涉及到Adapter
的部分源码。所以Adapter
源码分析分为两篇,本文是第一篇。
1. 概述
在分析Adapter
源码之前,我们先来回顾一下,我们经常使用的几个方法。
方法名
作用
onCreateViewHolder
创建一个ViewHolder对象,主要作用是将数据保存在ViewHolder,以供后面bind操作使用
onBindViewHolder
数据绑定方法
getItemCount
当前Adapter拥有数据的数量,该方法必须被重写,否则RecyclerView
展示不了任何数据
getItemViewType
该方法带一个Position,主要是返回当前位置的ViewType。这个方法通常用于一个RecyclerView
需要加载不同的布局。
getItemId
该方法表示的意思是返回当前位置Item的id,此方法只在setHasStableIds
设置为true才会生效
setHasStableIds
设置当前RecyclerView
的ItemView
是否拥有固定id,跟getItemId
方法一起使用。如果设置为true,会提高RecyclerView
的缓存效率。
上表中所列的方法应该就是我们使用Adapter
经常使用的方法,接下来,我将正式分析Adapter
的相关代码。我打算从如下角度来分析:
重新从RecyclerView
缓存角度来分析onCreateViewHolder
和onBindViewHolder
。
onBindViewHolder
的一个重载方法--主要是用于局部刷新。
结合Adapter
,分析ViewHolder
的position。
1. onCreateViewHolder和onBindViewHolder
onCreateViewHolder
方法和onBindViewHolder
方法算是我们使用次数最多的方法,很多自定义Adapter
的框架也都是从这两个方法入手的。我们来看看这两个方法到底有什么作用。
(1).onCreateViewHolder
首先,我们来看一下onCreateViewHolder
方法,从它的调用时机入手。 在本文之前,我分析过RecyclerView
的缓存机制,当时我将RecyclerView
的缓存分为4级缓存,其中分别是:
一级缓存:scrap
数组
二级缓存:CachedView
三级缓存:ViewCacheExtension
四级缓存:RecyclerViewPool
LayoutManager
会获取ViewHolder
时,如果4级缓存都没有命中,就会调用Adapter
的onCreateViewHolder
方法来创建一个新的ViewHolder
。我们来看看相关的代码:
if (holder == null) {
long start = getNanoTime();
if (deadlineNs != FOREVER_NS
&& !mRecyclerPool.willCreateInTime(type, start, deadlineNs)) {
// abort - we have a deadline we can't meet
return null;
}
holder = mAdapter.createViewHolder(RecyclerView.this, type);
if (ALLOW_THREAD_GAP_WORK) {
// only bother finding nested RV if prefetching
RecyclerView innerView = findNestedRecyclerView(holder.itemView);
if (innerView != null) {
holder.mNestedRecyclerView = new WeakReference<>(innerView);
}
}
long end = getNanoTime();
mRecyclerPool.factorInCreateTime(type, end - start);
if (DEBUG) {
Log.d(TAG, "tryGetViewHolderForPositionByDeadline created new ViewHolder");
}
}
上面的代码是RecyclerView
的tryGetViewHolderForPositionByDeadline
方法代码片段。之前,我们在分析缓存机制时,就已经仔细分析这个方法,这里我就不再赘述,有兴趣的同学可以我之前的文章:RecyclerView 源码分析(三) - RecyclerView的缓存机制。 我们回到上面的代码片段中来,从上面的代码上,我们看到这里是调用的是Adapter
的createViewHolder
方法来创建ViewHolder
。我们来看看Adapter
的createViewHolder
方法:
public final VH createViewHolder(@NonNull ViewGroup parent, int viewType) {
try {
TraceCompat.beginSection(TRACE_CREATE_VIEW_TAG);
final VH holder = onCreateViewHolder(parent, viewType);
if (holder.itemView.getParent() != null) {
throw new IllegalStateException("ViewHolder views must not be attached when"
+ " created. Ensure that you are not passing 'true' to the attachToRoot"
+ " parameter of LayoutInflater.inflate(..., boolean attachToRoot)");
}
holder.mItemViewType = viewType;
return holder;
} finally {
TraceCompat.endSection();
}
}
其实createViewHolder
方法里面也没有做什么的操作,差不多就是调用onCreateViewHolder
方法。简而言之,onCreateViewHolder
有点带兜底的韵味,缓存都没有命中,只能乖乖的创建ViewHolder
。 我们来看看第二方法,也就是onBindViewHolder
方法。
(2). onBindViewHolder
我们都知道,onBindViewHolder
方法的作用是进行数据绑定,所以执行这个方法的条件相对于onCreateViewHolder
有点苛刻。为什么呢?我们这么想一下吧,假设我们change了其中一个ItemView的数据,然后通过notifyItemChanged
来通知数据源已经改变。在这种情况下,正常来说,都是只刷新对应位置的ItemView就行了,没必要刷新其他数据没有改变的ItemView(这里的刷新就是指执行onBindViewHolder
方法)。现在,我们来看看对应的执行代码:
boolean bound = false;
if (mState.isPreLayout() && holder.isBound()) {
// do not update unless we absolutely have to.
holder.mPreLayoutPosition = position;
} else if (!holder.isBound() || holder.needsUpdate() || holder.isInvalid()) {
if (DEBUG && holder.isRemoved()) {
throw new IllegalStateException("Removed holder should be bound and it should"
+ " come here only in pre-layout. Holder: " + holder
+ exceptionLabel());
}
final int offsetPosition = mAdapterHelper.findPositionOffset(position);
bound = tryBindViewHolderByDeadline(holder, offsetPosition, position, deadlineNs);
}
从上面的代码,我们可以看出来,最后调用了tryBindViewHolderByDeadline
方法。而调用tryBindViewHolderByDeadline
方法条件比较苛刻,不过不管怎么苛刻,只要记住一点,如果对应位置的数据被更新了,该位置会执行一次onBindViewHolder
方法。我们继续看一下tryBindViewHolderByDeadline
方法的代码:
private boolean tryBindViewHolderByDeadline(ViewHolder holder, int offsetPosition,
int position, long deadlineNs) {
// ······
mAdapter.bindViewHolder(holder, offsetPosition);
// ······
}
执行过程跟onCreateViewHolder
方法差不多,都是在依靠Adapter
内部一个对应的final方法来回调。这样所做的好处,可以在onBindViewHolder
方法执行前后做一些其他的操作,比如初始化操作和清理操作,这种模式有点类似于Java中静态代理模式中的继承代理。然后,我们来看看Adapter
的bindViewHolder
方法:
public final void bindViewHolder(@NonNull VH holder, int position) {
holder.mPosition = position;
if (hasStableIds()) {
holder.mItemId = getItemId(position);
}
holder.setFlags(ViewHolder.FLAG_BOUND,
ViewHolder.FLAG_BOUND | ViewHolder.FLAG_UPDATE | ViewHolder.FLAG_INVALID
| ViewHolder.FLAG_ADAPTER_POSITION_UNKNOWN);
TraceCompat.beginSection(TRACE_BIND_VIEW_TAG);
onBindViewHolder(holder, position, holder.getUnmodifiedPayloads());
holder.clearPayload();
final ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
if (layoutParams instanceof RecyclerView.LayoutParams) {
((LayoutParams) layoutParams).mInsetsDirty = true;
}
TraceCompat.endSection();
}
从这里,我们可以简单发现,在执行onBindViewHolder
方法前后,各自做了一些不同的操作。比如,在执行onBindViewHolder
方法之前,更新了ViewHolder
的mPosition
属性和给ViewHolder
设置了一些flag;在执行onBindViewHolder
方法之后,清理了ViewHolder
的payload
,并且还是给ItemView
的LayoutParams
的mInsetsDirty
属性设置为true。 这里额外的提出两个点:
payload
主要是用于局部刷新的,待会我会详细解释怎么进行局部刷新。
关于LayoutParams
的mInsetsDirty
属性,这个属性尤为重要的,主要用于ItemView的绘制,后续我在分析ItemDecoration
时会详细的解释这个属性。
3. 局部刷新的基本使用和实现原理
(1). 局部刷新的基本使用
在分析局部刷新之前,我们先来讨论一下怎么进行布局刷新,也就是说怎么通过RecyclerView
实现ItemView
的局部刷新。 假设下面的一个Demo:
点击一下下面灰色的Button
,position
为0的ItemView
会改变显示的文字。如果我们不做局部刷新,出现什么问题呢?我们先来试试:
mDataList.get(0).setString("change data");
mAdapter.notifyItemChanged(0);
正常的实现应该就是上面的代码,非常的简单,也是我们经常书写的代码。这样书写有什么问题吗?有很大的问题!就是整个ItemView会闪烁一下,效果如下:
网上给了一堆的原因分析,我个人觉得,原因非常的简单,就是第一个ItemView执行的change动画。所以介于这两个原因,我们可以找到两种解决方案:
设置RecyclerView
的change动画时间为0,也就是调用ItemAnimator
的setChangeDuration
方法。
直接将RecyclerView
的ItemAnimator
设置为null。
对于第二种方案,我不置可否。这样来想,我们直接将动画设置为null,那么RecyclerView
就没有任何动画,是不是感觉有点得不偿失? 第一种方案比起第二种方案稍微要好一些,我们将change动画时间设置为0,只影响了change动画(相当于取消了change动画),不会影响其他其他操作的动画。不过,还是感觉美中不足,相当于后面所有的change操作都没有了动画,如果我想有些change操作有动画呢? 此时就需要局部刷新出手了。我们先来看看怎么实现局部刷新: 首先,调用带两个参数的notifyItemChanged
方法,如下:
mAdapter.notifyItemChanged(0, "");
第二参数是一个payload,Object类型,所以我们可以传递任意对象,这里就传递一个空字符串。 然后我们得重写Adapter
的onBindViewHolder
方法(这里重写的是带三个参数的onBindViewHolder
方法,带两个参数的onBindViewHolder
该怎么写就怎么写)。
@Override
public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position, @NonNull List payloads) {
if (payloads.contains("")) {
holder.mTextView.setText(mDataList.get(position).getString());
} else {
super.onBindViewHolder(holder, position, payloads);
}
}
这里我们判断了一下payloads
里面是否含有之前我们传递的空字符串,如果含有的话,直接更新显示文字即可,如果不含有则走默认逻辑。现在来我们看看效果:
是不是感觉perfect?
(2). 局部刷新的实现原理
局部刷新的使用是非常的简单的,就是重写了Adapter
带三个参数的onBindViewHolder
方法,然后调用的也是带两个参数的notifyItemChanged
方法。 但是,我们不禁好奇,为什么这样做ItemView就不会闪烁呢?我在这里就可以告诉大家答案,是因为没有执行change动画。为了保持求知若饥,虚心若愚的良好传统,大家肯定会进一步的问,为什么在这种情况下不会执行动画呢?其实为了回答这个问题,我早就已经为大家打好铺垫,在理解局部刷新的原理之前,大家最好已经理解了RecyclerView
的动画机制,有兴趣的同学可以看看我之前的文章:RecyclerView 源码分析(四) - RecyclerView的动画机制。 前面频繁的源码追踪我们这里就不进行了,可以参考我的文章:RecyclerView 源码分析(四) - RecyclerView的动画机制,这里直接从根源入手。我们都知道,当我们调用Adapter
的notifyItemChanged
方法,会执行到AdapterHelper$Callback
的markViewHoldersUpdated
方法。 而我们这里不看markViewHoldersUpdated
方法,而是看哪里调用了这个方法。 根据我们辛苦的追踪代码,我们发现主要是有两个地方在调用markViewHoldersUpdated
方法:1. postponeAndUpdateViewHolders
方法;2. consumeUpdatesInOnePass
方法。 这其中,consumeUpdatesInOnePass
方法是我们的老朋友,该方法主要是在dispatchLayoutStep2
方法,其作用也是不言而喻,主要是给消费之前添加的operation
。而postponeAndUpdateViewHolders
方法我们就感觉非常的陌生,这个方法是在哪里被调用呢? 根据我们的追踪,发现它的调用源头是AdapterHelper
的preProcess
方法。而preProcess
方法又是在哪里被调用的呢?是在processAdapterUpdatesAndSetAnimationFlags
方法:
private void processAdapterUpdatesAndSetAnimationFlags() {
// ······
if (predictiveItemAnimationsEnabled()) {
mAdapterHelper.preProcess();
} else {
mAdapterHelper.consumeUpdatesInOnePass();
}
// ······
}
而processAdapterUpdatesAndSetAnimationFlags
方法只在dispatchLayoutStep1
方法调用(这里不考虑非自动测量的情况)。这里,我们就彻底明了。dispatchLayoutStep1
方法阶段被预布局阶段,也就是说,change操作在预布局阶段就已经回调markViewHoldersUpdated
方法。 而markViewHoldersUpdated
方法的作用是啥呢?其实在RecyclerView 源码分析(四) - RecyclerView的动画机制,我就已经解释过了,主要作用有两个:
给每个ViewHolder
打了对应的flag
更新每个ViewHolder
的position。
关于这两个作用的分析,flag我们可以直接跳过,position在后面我会详细的分析。 从而,我们知道,在预布局阶段,每个ViewHolder
的position和flag就已经确定了,这个有什么作用呢?还记得我们之前分析RecyclerView
的动画机制说过,在预布局阶段如果条件允许的话,会进行一次布局,也就是会调用LayoutManager
的onLayouyChildren
方法。 而onLayouyChildren
方法会做啥呢?我主要介绍两点(这里以LinearLayoutManager
为例):
1.调用LayoutManager
的detachAndScrapAttachedViews
方法,回收所有的ViewHolder,将他们放入四级缓存中。
调用fill方法进行布局。在fill方法调用流程会调用RecyclerView
的tryGetViewHolderForPositionByDeadline
方法从缓存中获取ViewHolder
。
这里我们先来看回收部分,我们知道detachAndScrapAttachedViews
方法最终会调用到Recycler
的scrapView
方法里面去。我们来看看scrapView
方法(请大家睁大眼睛,这是寻找答案的第一条线索):
void scrapView(View view) {
final ViewHolder holder = getChildViewHolderInt(view);
if (holder.hasAnyOfTheFlags(ViewHolder.FLAG_REMOVED | ViewHolder.FLAG_INVALID)
|| !holder.isUpdated() || canReuseUpdatedViewHolder(holder)) {
if (holder.isInvalid() && !holder.isRemoved() && !mAdapter.hasStableIds()) {
throw new IllegalArgumentException("Called scrap view with an invalid view."
+ " Invalid views cannot be reused from scrap, they should rebound from"
+ " recycler pool." + exceptionLabel());
}
holder.setScrapContainer(this, false);
mAttachedScrap.add(holder);
} else {
if (mChangedScrap == null) {
mChangedScrap = new ArrayList();
}
holder.setScrapContainer(this, true);
mChangedScrap.add(holder);
}
}
从这里我们知道,scrapView
方法的作用就是ViewHolder
分别放到mAttachedScrap
和mChanedScrap
数组。这里我们重点关注canReuseUpdatedViewHolder(holder)
这个判断条件,我们来追踪这个方案的代码,最终我们找到了DefaultItemAnimator
的canReuseUpdatedViewHolder
方法:
@Override
public boolean canReuseUpdatedViewHolder(@NonNull ViewHolder viewHolder,
@NonNull List payloads) {
return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads);
}
看到没?这里判断了一下payloads
是否为空。这个有什么作用呢?我们回到scrapView
方法来,如果payloads
不为空的话,当前的ViewHolder
会被回收到mAttachedScrap
。这里,我们一定要记得,当ViewHolder
的payloads
不为空,那么在回收时,ViewHolder
会被回收到mAttachedScrap
。这个有什么作用呢?这就需要我们去寻找第二条线索。 第二条线索就藏在tryGetViewHolderForPositionByDeadline
方法里面。我们来瞅瞅:
ViewHolder getScrapOrHiddenOrCachedHolderForPosition(int position, boolean dryRun) {
final int scrapCount = mAttachedScrap.size();
// Try first for an exact, non-invalid match from scrap.
for (int i = 0; i < scrapCount; i++) {
final ViewHolder holder = mAttachedScrap.get(i);
if (!holder.wasReturnedFromScrap() && holder.getLayoutPosition() == position
&& !holder.isInvalid() && (mState.mInPreLayout || !holder.isRemoved())) {
holder.addFlags(ViewHolder.FLAG_RETURNED_FROM_SCRAP);
return holder;
}
}
// ······
}
结合上面的分析,当在预布局阶段,也就是dispatchLayoutStep1
阶段进行布局,通过带两个参数的notifyItemChanged
方法进行通知,肯定会在上面的代码返回一个ViewHolder
。也就是说,在这种情况下,变化前后该ItemView
的ViewHolder
肯定是同一个ViewHolder
。 如上就是第二条线索,那第二条线索有什么作用呢?就得看第三条线索了。那第三条线索在哪里呢?就在dispatchLayoutStep3
方法里面。 我们都知道,dispatchLayoutStep3
阶段被称为后布局,主要进行动画的执行,我们来看看我们的change操作会执行哪些代码:
private void dispatchLayoutStep3() {
// ······
if (mState.mRunSimpleAnimations) {
for (int i = mChildHelper.getChildCount() - 1; i >= 0; i--) {
// ······
animateChange(oldChangeViewHolder, holder, preInfo, postInfo,
oldDisappearing, newDisappearing);
// ······
}
// ······
}
change操作肯定会执行到如上的代码,我们在分析动画机制时就已经分析过了。我们来看看animateChange
方法:
private void animateChange(@NonNull ViewHolder oldHolder, @NonNull ViewHolder newHolder,
@NonNull ItemHolderInfo preInfo, @NonNull ItemHolderInfo postInfo,
boolean oldHolderDisappearing, boolean newHolderDisappearing) {
// ······
if (oldHolder != newHolder) {
// ······
addAnimatingView(oldHolder);
// ······
}
// ······
}
看到没,这就是最终的答案,只有两个ViewHolder
不是同一个对象才会添加一个AnimatingView
。 由于局部刷新的前后,ItemView
的是同一个ViewHolder
对象,才会导致局部刷新不会执行change动画,才会解决ItemView
的闪烁。 有可能有人又有疑问了,为什么会全局刷新不是同一个ViewHolder
呢?我们通过scrapView
方法可以知道,如果全局刷新,那么change的ViewHolder
会被回收到mChangedScrap
数组里面去,而在tryGetViewHolderForPositionByDeadline
方法里面,我们可以知道,只有预布局阶段才会从mChangedScrap
数组里面获取ViewHolder
对象:
if (mState.isPreLayout()) {
holder = getChangedScrapViewForPosition(position);
fromScrapOrHiddenOrCache = holder != null;
}
所以预布局阶段和正式布局阶段同一个ItemView
肯定是不同的ViewHolder
,从而会执行change动画。 由于这个问题的答案寻找起来比较麻烦,这里我就针对这个问题做一个简单的总结:
布局刷新之所以能解决ItemView
的闪烁问题,是因为在局部刷新的情况下,不会执行change动画。而不执行的chang动画的原因是因为在刷新前后都是同一个ViewHolder
,并且都是从mAttachedScrap
数组里面获得,所以在动画执行阶段,不会执行局部刷新导致的change动画,进而解决闪烁问题;而全局刷新由于刷新前后不是同一个ViewHolder
,所以会执行change动画。
4. ViewHolder的position
在ViewHolder的内部有几个让人难以理解的问题,一个是flag,众多的flag让人非常的懵逼,这个我在缓存机制那一篇文章,我已经做了详细的总结,有兴趣的同学可以看看我的文章:RecyclerView 源码分析(三) - RecyclerView的缓存机制;另一个是position,本文来重点分析一下。 这里主要分析两个方法,分别是getAdapterPosition
和getLayoutPosition
,对应着ViewHolder
内部两个成员变量mPosition
和mPreLayoutPosition
两个属性。 大家在使用这两个方法时,应该都对这两个方法有一定的疑问,这里我简单的解释一下这两个方法的区别(其实我们从这两个方法的注释就能看出区别)。 我们先来看看这两个方法的代码,首先来看一下getAdapterPosition
方法:
public final int getAdapterPosition() {
if (mOwnerRecyclerView == null) {
return NO_POSITION;
}
return mOwnerRecyclerView.getAdapterPositionFor(this);
}
别看getAdapterPosition
方法比较麻烦,还调用了RecyclerView
的getAdapterPositionFor
方法进行位置的计算。但是它表达的意思是非常简单的,就是获取当前ViewHolder所绑定ItemView的真实位置。这里的真实位置说的比较笼统,这样来解释吧,当我们remove掉为position为0的item,正常来说,后面ViewHolder
的position应该都减1。但是RecyclerView
处理Adapter
的更新采用的延迟处理策略,所以在正式处理之前获取ViewHolder
的位置可能会出现误差,介于这个原因,getAdapterPosition
方法就出现了。 getAdapterPosition
方法是怎样保证每次计算都是正确的呢?包括在正式处理之前呢?我们知道,在RecyclerView
中,延迟处理的实现是在notify阶段往一个叫mPendingUpdates
数组里面添加Operation
,分别在dispatchLayoutStep1
阶段或者dispatchLayoutStep2
阶段进行处理。通过追踪getAdapterPositionFor
方法,我们知道getAdapterPosition
方法在计算位置时,考虑到mPendingUpdates
数组的存在,所以在notify阶段和dispatchLayoutStep1
阶段之间(这里假设dispatchLayoutStep1
就会处理),getAdapterPosition
方法返回正确的位置。 而getLayoutPosition
方法呢?getLayoutPosition
方法就不能保证在notify阶段和dispatchLayoutStep1
阶段之间获取的位置是正确的。为什么这么说呢?我们来看看getLayoutPosition
方法的代码:
public final int getLayoutPosition() {
return mPreLayoutPosition == NO_POSITION ? mPosition : mPreLayoutPosition;
}
getLayoutPosition
方法返回的是mPosition
或者mPreLayoutPosition
,但是在dispatchLayoutStep1
阶段之前,还未更新每个ViewHolder
的position,所以获得不一定的是正确(只有在处理mPendingUpdates
的操作时,position才会被更新,对应着的代码就是执行AdapterHelper$Callback
接口的方法)。 但是getLayoutPosition
方法为什么还有存在的必要呢?我们发现getLayoutPosition
方法不会每次都计算,也就是说,getLayoutPosition
方法的效率比getAdapterPosition
方法高。当我们在Adapter这种调用方法来获取ViewHolder
的位置时,可以优先考虑getLayoutPosition
方法,因为Adapter
的方法回调阶段不在mPendingUpdates
处理之前,所以此时getLayoutPosition
方法跟getAdapterPosition
方法没有任何区别了。 但是需要注意,如果我们在其他地方获取ViewHolder
的position
,要特别注意这种情况,因为其他地方不能保证与RecyclerView
状态同步,这种情况为了保证结果的正确性,我们应该优先考虑getAdapterPosition
方法。
5. 总结
本文到这里差不多就结束了,在这里我们做一个简单的总结
之所以局部刷新能解决ItemView
闪烁的问题,是因为局部刷新进行change操作时没有执行change动画。而没有执行change动画的原因是因为在预布局阶段和后布局阶段,ItemView
的ViewHolder
是同一个对象。
getAdapterPosition
方法在任何时候获取的都是ViewHolder
真实的位置,而getLayoutPosition
方法只在mPendingUpdates
数组处理之后才能获取真实的位置。这是两个方法区别。
下一篇文章是分析DiffUtil
的实现,来看看DiffUtil
来怎么实现差量计算的。
你可能感兴趣的:(RecyclerView 源码分析(五) - Adapter的源码分析)
Openssl与网络安全
Sallyyym
知识 openssl 网络安全
openssl一openssl简史二openssl组成三openssl优缺点四openssl功能一openssl简史openssl是一个开放源代码的SSL协议的产品实现,采用C语言作为开发语言,具备了跨系统的性能。Openssl最早版本在1995年发布的,1998年后开始由openssl项目组维护和开发。openssl的源代码库可以从官网链接:https://www.openssl.org/.支持
KindEditor 实现ctrl+v粘贴图片并上传、word粘贴带图片
Mr_Zang666
word图片一键粘贴 word servlet java
这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下)配置web.xmlindex.jsp前端(页面)测试代码:WordPaster-jsp-ueditor-1.2.6.0这里写你的初始化内容varpasterMgr=newWordPasterManager
【工具分享】FOFA——网络空间测绘搜索引擎
Long._.L
工具分享 渗透测试
文章目录FOFA介绍FOFA语法其他引擎FOFA介绍FOFA官网:https://fofa.info/FOFA(FingerprintingOrganizationswithAdvancedTools)是一款网络空间测绘的搜索引擎,它专注于帮助用户收集和分析互联网上的设备和服务信息。FOFA的主要特点包括:设备指纹识别:FOFA能够通过识别设备的指纹信息,帮助用户发现和查找特定类型的设备。漏洞扫描
Pytorch实现之GIEGAN(生成器信息增强GAN)训练自己的数据集
这张生成的图像能检测吗
GAN系列 pytorch 生成对抗网络 人工智能 深度学习 计算机视觉 机器学习 python
简介简介:在训练数据样本之前首先利用VAE来推断潜在空间中不同类的分布,用于后续的训练,并使用它来初始化GAN。与ACGAN和BAGAN不同的是,提出的GIEGAN有一个分类器结构,这个分类器主要判断生成的图像或者样本图像属于哪个类,而鉴别器仅判断图像是来自于生成器还是真实样本。论文题目:GeneratorInformationEnhancementGenerativeAdversarialNet
安装libcurl4-openssl-dev以支持HTTPS网络通信
Leon_Jinhai_Sun
python
`libcurl4-openssl-dev`是一个在基于Debian的Linux发行版(如Ubuntu)中使用的软件包名称,它用于安装libcurl库的开发文件和OpenSSL支持。下面是对它的详细解释:1.**libcurl**:libcurl是一个免费的、易于使用的客户端URL传输库,支持多种协议,包括HTTP、HTTPS、FTP、FTPS、SFTP、SCP、DICT、TELNET、TFTP、
网络端口号大全
Long._.L
网络安全 Windows 网络安全 系统安全
文章目录端口分类端口大全0-117118-374376-595597-19121981-55995600-76757676-2737430100-65301端口分类公认端口(Well-KnownPorts)范围从0到1023动态端口(DynamicPorts)范围从1024到65535公认端口:它们紧密绑定于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如21端口分配给FTP服务,25端
力扣刷题打卡第一天——基础——知识积累
Helen_star_L
leetcode 前端 javascript
第一题交替合并字符串题目描述:给你两个字符串word1和word2。请你从word1开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。返回合并后的字符串。代码如下:/***@param{string}word1*@param{string}word2*@return{string}*///先将字符串变成小写的——>判断字符串长度(需符合条
边缘安全加速平台 EO(Edge Optimization)
HaoHao_010
腾讯云 云计算 加速 功能 大厂云
腾讯云边缘安全加速平台EO(EdgeOptimization)是腾讯云推出的一项基于边缘计算的安全加速解决方案,旨在提升企业网站、应用、服务等的访问速度、安全性和稳定性。该平台结合了CDN(内容分发网络)、WAF(Web应用防火墙)、DDoS防护、流量优化等多项技术,帮助用户在全球范围内优化访问体验、增强安全防护。主要特点与功能:边缘加速:利用腾讯云遍布全球的数据中心和节点,通过将内容缓存到离用户
【C语言】typedef 关键字详解
LuckiBit
C语言 c语言 typedef 关键字 语法 类型
目录C语言`typedef`关键字详解1.`typedef`关键字的基本概念1.1基本语法1.2示例2.使用`typedef`关键字的实际应用2.1简化复杂的数据类型2.1.1结构体类型别名2.1.2指针类型别名2.2定义函数指针类型2.2.1示例2.3简化联合体(Union)和枚举(Enum)的使用2.3.1联合体示例2.3.2枚举示例3.`typedef`的注意事项4.综合示例5.总结6.结束
【C语言】inline 关键字详解
LuckiBit
C语言 c语言 inline 关键字 语法 类型
目录C语言`inline`关键字详解1.概述1.1主要目的1.2历史背景2.用法2.1基本示例2.2内联函数的声明和定义3.编译器行为3.1编译器的决定3.2内联的局限性4.适用场景4.1数学运算函数4.2访问器函数5.注意事项5.1代码膨胀5.2递归函数5.3复杂函数6.示例6.1代码输出7.GCC特性7.1GCC编译器选项8.总结8.1使用建议9.结束语相关文章:C语言inline关键字详解1
使用Xcode打包和导出IPA文件
DhGrad_Bias
xcode 蓝桥杯 macos
在移动端开发中,使用Xcode进行应用程序的打包和导出是非常常见的任务。本文将介绍如何使用Xcode进行打包和导出IPA文件的步骤,以及相关的代码示例。步骤1:配置项目设置在Xcode中,打开你的项目,并选择你要打包的目标。然后,点击Xcode菜单栏上的"File"(文件)选项,选择"WorkspaceSettings"(工作区设置)。在弹出的窗口中,选择"BuildSystem"(构建系统)为"
车载测试工程师职业发展全解析:从入门到进阶
几度°
车载测试 测试工具 职场和发展 汽车 车载系统
车载测试工程师职业发展全解析:从入门到进阶一、岗位介绍:智能汽车时代的质量守护者1.1行业背景与发展前景随着新能源汽车渗透率突破40%,车载测试工程师已成为智能汽车产业链的核心岗位。根据2025年最新行业报告显示,我国车载测试人才缺口已达28万人,岗位平均薪资较传统测试岗位高出35%。岗位需求主要来自三大领域:主机厂(如比亚迪、特斯拉)的研发测试部门Tier1供应商(如博世、大陆)的系统验证团队第
《Python 股票交易分析:开启智能投资新时代》(一)
2501_90693467
python 开发语言 fastapi java c#
一、Python在股票交易分析中的重要性Python以其强大的数据分析库和简洁的语法,成为股票交易分析的热门工具。它能够处理大量数据、进行复杂的计算和可视化,为投资者提供更准确的决策依据。股票分析是金融领域中至关重要的任务,而Python作为一种强大的编程语言,在股票分析中发挥着重要作用。首先,Python具有丰富的第三方库和工具,使得股票数据的获取和处理变得更加便捷。通过使用Python的pan
深入浅出:API接口原理与实现
专注API从业者
API接口 经验分享 电商平台 开发语言 数据库 算法 大数据
API(ApplicationProgrammingInterface,应用程序编程接口),如同软件世界中的信使,为不同的应用程序搭建起沟通的桥梁,使它们能够共享数据与功能,无需了解彼此的内部运作机制。一、API接口的原理想象一下,你去餐厅用餐,无需进入厨房,只需通过菜单点餐,服务员便会将你的需求传达给厨师,并将制作好的美食端到你面前。API接口就如同餐厅的服务员,它定义了应用程序之间交互的规则:
【ATU 随笔记】整车网路系统架构之探讨 ( 一 )
WPG大大通
NXP产线 大大通 笔记 经验分享 CAN 汽车 车载系统
一、前言在现今的车辆设计中,通讯架构扮演着至关重要的角色,以确保车内各个电子控制单元(ElectronicControlUnit,ECU)能够快速且可靠地交换资讯。车用通讯协议的选择多样且具备不同的应用特性,其中包括CAN(ControllerAreaNetwork)、LIN(LocalInterconnectNetwork)、Ethernet和FlexRay等。每一种通讯协议皆有其特定的应用范畴
API接口技术开发某音douyinAPI商品详情信息采集接口接入演示案例
专注API从业者
电商平台 经验分享 API接口 开发语言 大数据 数据仓库 前端
要开发一个用于采集某音商品详情信息的API接口,你需要遵循以下步骤:获取开放平台的应用权限:你需要在开放平台(OpenPlatform)注册一个开发者账号,并创建一个应用。通过审核后,你将获得必要的API密钥,如APIKey和APISecret。了解抖音API文档:研究抖音开放平台的API文档,特别是与商品详情信息相关的API端点。这将帮助你理解如何构建请求以获取所需数据。设计API接口:根据业务
k8s ssl 漏洞修复
魏 无羡
kubernetes ssl 容器
针对Kubernetes集群中SSL/TLS协议信息泄露漏洞(CVE-2016-2183)的修复,需重点修改涉及弱加密算法的组件配置。以下是具体修复步骤及验证方法:一、漏洞修复步骤1.修复etcd服务修改配置文件:编辑/etc/kubernetes/manifests/etcd.yaml,在command段添加以下参数禁用弱加密算法:---cipher-suites=TLS_ECDHE_RSA_W
PFAS(全氟烷基和多氟烷基物质)测试多少项目?费用是多少。
nx13144450251
模块测试 安全 数据库 功能测试 大数据
我们需要了解PFAS是什么。PFAS是全称为全氟和多氟烷基物质,是一类具有独特化学结构的化学物质,具有防水、防油、防污等特性,因此在纺织品、包装材料等领域被广泛使用。然而,长期接触PFAS会对人体健康和环境造成潜在危害,因此对含有PFAS的面料进行测试就显得尤为重要。让我们来了解一下PFAS面料测试的流程。首先是样品的准备。样品可以是纺织品、皮革、包装材料等,需要根据测试标准进行取样。其次是提取和
高效错误管理:Python 中 try、except、else 和 finally 的实用指南
刘同学Python学习日记
学习记录 python 开发语言 excel
异常处理基本概念在编写程序时,总会有各种各样的错误发生,例如文件未找到、除以零、类型错误等。Python提供了一种机制,可以捕获这些错误并进行处理,而不是让程序崩溃。这种机制就是异常处理。try语句块的结构一个完整的try语句块可以包含以下部分:try块:包含可能引发异常的代码。except块:捕获并处理特定异常。else块:如果try块没有引发异常,则执行此块。finally块:无论是否引发异常
分布式电商系统中的API网关架构设计
专注API从业者
经验分享 API接口 电商平台 分布式 大数据 数据仓库 架构
在分布式电商系统中,API网关扮演着至关重要的角色,它是系统对外的统一入口,负责请求路由、协议转换、安全认证、流量控制等功能。以下是关于分布式电商系统中API网关架构设计的详细内容:设计目标统一入口:为所有外部请求提供一个统一的访问点,简化客户端与后端服务的交互。请求路由:根据请求的特征(如URL、请求方法等)将请求转发到对应的后端微服务。安全防护:实现身份验证、授权、防攻击等安全机制,保护后端服
MySQL 默认事务隔离级别及原因
少林码僧
mysql 数据库
MySQL默认事务隔离级别及原因一、引言在MySQL数据库中,事务隔离级别决定了一个事务与其他事务之间的隔离程度。不同的隔离级别会对数据库的并发性能和数据一致性产生不同的影响。了解MySQL默认的事务隔离级别以及选择这个级别的原因,对于正确使用数据库事务和优化数据库性能至关重要。二、MySQL的事务隔离级别MySQL支持四种事务隔离级别,分别是:读未提交(Readuncommitted):一个事务
【MYSQL面试题】MySQL的事务隔离级别有哪些?
丢了尾巴的猴子
Mysql mysql 数据库 java
MYSQL有四大隔离级别,分别是:读未提交,读已提交,可重复读,串行化。读未提交,就是在并发情况下,A事务读到了B事务未提交的数据,如果B事务最终回滚操作,事务A读取的数据就是错乱的,而且很难追踪,则会产生脏读的现象。读未提交是限制性最弱的隔离级别,带来的问题也最多,也有可能产生不可重复读和幻读的问题,所以很少实际应用。读已提交,就是一个事务读取到的数据是其他事务已经提交的数据,此隔离级别虽然解决
Netty学习 - 编译Netty4.2
wisfy_21
Netty学习
编译Netty4.2版本遇到一些问题:首先是缺失io.netty.util.collection.IntObjectHashMap这类collection包。这个问题的原因是,在netty-common下,这些是需要根据模板生成类,所以需要先编译打包netty-common。在netty-common下执行package的时候,会遇到另一个错误io.netty:netty-dev-tools:ja
测试用例编写规范
车载测试职场人
车载测试 软件测试 测试用例
在车载项目开发过程中,离不开测试工作,现在越来越多的人涌入测试工作岗位,测试也是一个项目关键的一环,一个重要的角色,包括供应商释放每版软件时的全量测试,也包括主机厂的验收测试。如何做好测试工作,避免产生重复工作呢?离不开一份规范的测试用例做支撑,测试用例设计的规范一般是怎么样呢?今天一起来探讨一下。规范测试用例的背景是什么呢?主要有两个维度,首先是为保证测试用例对需求的覆盖率,第二个就是对单个功能
Unity之IK(反向动力学)
winds_tide
Unity unity 游戏引擎
IKInverseKinematic即反向动力学,在骨骼动画中构建骨骼的方法被称为正向动力学。通常来说是父骨骼带动子骨骼旋转或移动,而反向动力学则是子骨骼带动父骨骼旋转或移动。举个例子来说,正向动力学下,我们用手控制鼠标移动,反向动力学下则是鼠标控制我们的手移动。二如何使用首先需要在状态机中开启IK设置。Unity已经定义了一个Ik回调函数——OnAnimatorIK,我们可以通过调用相关API来
本地运行stable-diffusion3.5
wisfy_21
stable diffusion
本地运行stable-diffusion3.5本地运行stable-diffusion3.5准备工作下载ComfyUI和需要的模型文件需要下载以下几类SD3.5文件启动ComfyUI启动在工作流中分别选中三个Clip模型sd3.5_large_turbo准备本地运行stable-diffusion3.5AI时代不可阻挡,给老机器加了个406016G显卡,尝试本地运行stable-diffusion
I/O 多路复用
我荔枝呢!
I/O多路复用 java
I/O多路复用是一种高效的I/O操作技术,允许单个线程同时监控多个文件描述符(如套接字),并在其中任何一个文件描述符就绪时进行读写操作。这种技术广泛应用于高并发网络服务器中,如Redis、Nginx等。I/O多路复用的工作原理1.监控多个文件描述符:使用系统调用(如select、poll、epoll)监控多个文件描述符的状态(可读、可写、异常等)。2.事件驱动:当某个文件描述符就绪时,系统调用返回
Redis为什么速度快、性能高?
我荔枝呢!
redis java 数据库 Redis速度快高性能
1.内存存储数据存储在内存中:Redis将所有数据保存在内存中,内存的访问速度远快于磁盘,因此读写操作非常迅速。持久化可选:虽然Redis主要依赖内存,但它也支持将数据持久化到磁盘,确保数据不会因重启而丢失。2.单线程模型避免上下文切换:Redis采用单线程处理命令,避免了多线程的上下文切换和竞争条件,简化了设计并提升了性能。高效的事件驱动:Redis使用I/O多路复用技术(如epoll、kque
hash冲突及hash冲突的4种解决方案
我荔枝呢!
哈希算法 散列表 算法
哈希出现冲突的情况:输入域与输出域不匹配:哈希函数的输入可以是任意长度的数据,组合无限,而哈希值的长度固定,输出域有限,根据鸽巢原理,必然会有不同输入映射到同一个输出值。(鸽巢原理:这是哈希冲突的根本原因。根据鸽巢原理(也称为抽屉原理),如果将n+1n+1个元素放入nn个容器中,则至少有一个容器包含多于一个元素。在哈希表中,这意味着当输入数据的数量超过哈希表的容量时,必然会发生冲突。)哈希函数设计
Java-自动拆箱/装箱/缓存/效率/String和包装类相互转换
我荔枝呢!
java 开发语言
为什么基本类型需要包装类?泛型与集合支持问题:基本数据类型在使用上虽然方便、简单且高效,但像泛型以及集合元素的存储等场景并不支持基本数据类型,而包装类可以解决这个问题,使其能更好地融入到一些需要对象类型的机制中。面向对象思维:基本数据类型不符合面向对象编程的思维方式,包装类把基本数据类型“包装”成了对象形式,更契合面向对象的编程模式。提供实用方法:包装类提供了很多实用的方法,例如Integer类中
java的(PO,VO,TO,BO,DAO,POJO)
Cb123456
VO TO BO POJO DAO
转:
http://www.cnblogs.com/yxnchinahlj/archive/2012/02/24/2366110.html
-------------------------------------------------------------------
O/R Mapping 是 Object Relational Mapping(对象关系映
spring ioc原理(看完后大家可以自己写一个spring)
aijuans
spring
最近,买了本Spring入门书:spring In Action 。大致浏览了下感觉还不错。就是入门了点。Manning的书还是不错的,我虽然不像哪些只看Manning书的人那样专注于Manning,但怀着崇敬 的心情和激情通览了一遍。又一次接受了IOC 、DI、AOP等Spring核心概念。 先就IOC和DI谈一点我的看法。IO
MyEclipse 2014中Customize Persperctive设置无效的解决方法
Kai_Ge
MyEclipse2014
高高兴兴下载个MyEclipse2014,发现工具条上多了个手机开发的按钮,心生不爽就想弄掉他!
结果发现Customize Persperctive失效!!
有说更新下就好了,可是国内Myeclipse访问不了,何谈更新...
so~这里提供了更新后的一下jar包,给大家使用!
1、将9个jar复制到myeclipse安装目录\plugins中
2、删除和这9个jar同包名但是版本号较
SpringMvc上传
120153216
springMVC
@RequestMapping(value = WebUrlConstant.UPLOADFILE)
@ResponseBody
public Map<String, Object> uploadFile(HttpServletRequest request,HttpServletResponse httpresponse) {
try {
//
Javascript----HTML DOM 事件
何必如此
JavaScript html Web
HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序。
事件通常与函数结合使用,函数不会在事件发生前被执行!
注:DOM: 指明使用的 DOM 属性级别。
1.鼠标事件
属性
动态绑定和删除onclick事件
357029540
JavaScript jquery
因为对JQUERY和JS的动态绑定事件的不熟悉,今天花了好久的时间才把动态绑定和删除onclick事件搞定!现在分享下我的过程。
在我的查询页面,我将我的onclick事件绑定到了tr标签上同时传入当前行(this值)参数,这样可以在点击行上的任意地方时可以选中checkbox,但是在我的某一列上也有一个onclick事件是用于下载附件的,当
HttpClient|HttpClient请求详解
7454103
apache 应用服务器 网络协议 网络应用 Security
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需
递归 逐层统计树形结构数据
darkranger
数据结构
将集合递归获取树形结构:
/**
*
* 递归获取数据
* @param alist:所有分类
* @param subjname:对应统计的项目名称
* @param pk:对应项目主键
* @param reportList: 最后统计的结果集
* @param count:项目级别
*/
public void getReportVO(Arr
访问WEB-INF下使用frameset标签页面出错的原因
aijuans
struts2
<frameset rows="61,*,24" cols="*" framespacing="0" frameborder="no" border="0">
MAVEN常用命令
avords
Maven库:
http://repo2.maven.org/maven2/
Maven依赖查询:
http://mvnrepository.com/
Maven常用命令: 1. 创建Maven的普通java项目: mvn archetype:create -DgroupId=packageName
PHP如果自带一个小型的web服务器就好了
houxinyou
apache 应用服务器 Web PHP 脚本
最近单位用PHP做网站,感觉PHP挺好的,不过有一些地方不太习惯,比如,环境搭建。PHP本身就是一个网站后台脚本,但用PHP做程序时还要下载apache,配置起来也不太很方便,虽然有好多配置好的apache+php+mysq的环境,但用起来总是心里不太舒服,因为我要的只是一个开发环境,如果是真实的运行环境,下个apahe也无所谓,但只是一个开发环境,总有一种杀鸡用牛刀的感觉。如果php自己的程序中
NoSQL数据库之Redis数据库管理(list类型)
bijian1013
redis 数据库 NoSQL
3.list类型及操作
List是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,又可以作为队列。
&nbs
谁在用Hadoop?
bingyingao
hadoop 数据挖掘 公司 应用场景
Hadoop技术的应用已经十分广泛了,而我是最近才开始对它有所了解,它在大数据领域的出色表现也让我产生了兴趣。浏览了他的官网,其中有一个页面专门介绍目前世界上有哪些公司在用Hadoop,这些公司涵盖各行各业,不乏一些大公司如alibaba,ebay,amazon,google,facebook,adobe等,主要用于日志分析、数据挖掘、机器学习、构建索引、业务报表等场景,这更加激发了学习它的热情。
【Spark七十六】Spark计算结果存到MySQL
bit1129
mysql
package spark.examples.db
import java.sql.{PreparedStatement, Connection, DriverManager}
import com.mysql.jdbc.Driver
import org.apache.spark.{SparkContext, SparkConf}
object SparkMySQLInteg
Scala: JVM上的函数编程
bookjovi
scala erlang haskell
说Scala是JVM上的函数编程一点也不为过,Scala把面向对象和函数型编程这两种主流编程范式结合了起来,对于熟悉各种编程范式的人而言Scala并没有带来太多革新的编程思想,scala主要的有点在于Java庞大的package优势,这样也就弥补了JVM平台上函数型编程的缺失,MS家.net上已经有了F#,JVM怎么能不跟上呢?
对本人而言
jar打成exe
bro_feng
java jar exe
今天要把jar包打成exe,jsmooth和exe4j都用了。
遇见几个问题。记录一下。
两个软件都很好使,网上都有图片教程,都挺不错。
首先肯定是要用自己的jre的,不然不能通用,其次别忘了把需要的lib放到classPath中。
困扰我很久的一个问题是,我自己打包成功后,在一个同事的没有装jdk的电脑上运行,就是不行,报错jvm.dll为无效的windows映像,如截图
最后发现
读《研磨设计模式》-代码笔记-策略模式-Strategy
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化
简单理解:
1、将不同的策略提炼出一个共同接口。这是容易的,因为不同的策略,只是算法不同,需要传递的参数
cmd命令值cvfM命令
chenyu19891124
cmd
cmd命令还真是强大啊。今天发现jar -cvfM aa.rar @aaalist 就这行命令可以根据aaalist取出相应的文件
例如:
在d:\workspace\prpall\test.java 有这样一个文件,现在想要将这个文件打成一个包。运行如下命令即可比如在d:\wor
OpenJWeb(1.8) Java Web应用快速开发平台
comsci
java 框架 Web 项目管理 企业应用
OpenJWeb(1.8) Java Web应用快速开发平台的作者是我们技术联盟的成员,他最近推出了新版本的快速应用开发平台 OpenJWeb(1.8),我帮他做做宣传
OpenJWeb快速开发平台以快速开发为核心,整合先进的java 开源框架,本着自主开发+应用集成相结合的原则,旨在为政府、企事业单位、软件公司等平台用户提供一个架构透
Python 报错:IndentationError: unexpected indent
daizj
python tab 空格 缩进
IndentationError: unexpected indent 是缩进的问题,也有可能是tab和空格混用啦
Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且在Python语言里,缩进而非花括号或者某种关键字,被用于表示语句块的开始和退出。增加缩进表示语句块的开
HttpClient 超时设置
dongwei_6688
httpclient
HttpClient中的超时设置包含两个部分:
1. 建立连接超时,是指在httpclient客户端和服务器端建立连接过程中允许的最大等待时间
2. 读取数据超时,是指在建立连接后,等待读取服务器端的响应数据时允许的最大等待时间
在HttpClient 4.x中如下设置:
HttpClient httpclient = new DefaultHttpC
小鱼与波浪
dcj3sjt126com
一条小鱼游出水面看蓝天,偶然间遇到了波浪。 小鱼便与波浪在海面上游戏,随着波浪上下起伏、汹涌前进。 小鱼在波浪里兴奋得大叫:“你每天都过着这么刺激的生活吗?简直太棒了。” 波浪说:“岂只每天过这样的生活,几乎每一刻都这么刺激!还有更刺激的,要有潮汐变化,或者狂风暴雨,那才是兴奋得心脏都会跳出来。” 小鱼说:“真希望我也能变成一个波浪,每天随着风雨、潮汐流动,不知道有多么好!” 很快,小鱼
Error Code: 1175 You are using safe update mode and you tried to update a table
dcj3sjt126com
mysql
快速高效用:SET SQL_SAFE_UPDATES = 0;下面的就不要看了!
今日用MySQL Workbench进行数据库的管理更新时,执行一个更新的语句碰到以下错误提示:
Error Code: 1175
You are using safe update mode and you tried to update a table without a WHERE that
枚举类型详细介绍及方法定义
gaomysion
enum javaee
转发
http://developer.51cto.com/art/201107/275031.htm
枚举其实就是一种类型,跟int, char 这种差不多,就是定义变量时限制输入的,你只能够赋enum里面规定的值。建议大家可以看看,这两篇文章,《java枚举类型入门》和《C++的中的结构体和枚举》,供大家参考。
枚举类型是JDK5.0的新特征。Sun引进了一个全新的关键字enum
Merge Sorted Array
hcx2013
array
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:You may assume that nums1 has enough space (size that is
Expression Language 3.0新特性
jinnianshilongnian
el 3.0
Expression Language 3.0表达式语言规范最终版从2013-4-29发布到现在已经非常久的时间了;目前如Tomcat 8、Jetty 9、GlasshFish 4已经支持EL 3.0。新特性包括:如字符串拼接操作符、赋值、分号操作符、对象方法调用、Lambda表达式、静态字段/方法调用、构造器调用、Java8集合操作。目前Glassfish 4/Jetty实现最好,对大多数新特性
超越算法来看待个性化推荐
liyonghui160com
超越算法来看待个性化推荐
一提到个性化推荐,大家一般会想到协同过滤、文本相似等推荐算法,或是更高阶的模型推荐算法,百度的张栋说过,推荐40%取决于UI、30%取决于数据、20%取决于背景知识,虽然本人不是很认同这种比例,但推荐系统中,推荐算法起的作用起的作用是非常有限的。
就像任何
写给Javascript初学者的小小建议
pda158
JavaScript
一般初学JavaScript的时候最头痛的就是浏览器兼容问题。在Firefox下面好好的代码放到IE就不能显示了,又或者是在IE能正常显示的代码在firefox又报错了。 如果你正初学JavaScript并有着一样的处境的话建议你:初学JavaScript的时候无视DOM和BOM的兼容性,将更多的时间花在 了解语言本身(ECMAScript)。只在特定浏览器编写代码(Chrome/Fi
Java 枚举
ShihLei
java enum 枚举
注:文章内容大量借鉴使用网上的资料,可惜没有记录参考地址,只能再传对作者说声抱歉并表示感谢!
一 基础 1)语法
枚举类型只能有私有构造器(这样做可以保证客户代码没有办法新建一个enum的实例)
枚举实例必须最先定义
2)特性
&nb
Java SE 6 HotSpot虚拟机的垃圾回收机制
uuhorse
java HotSpot GC 垃圾回收 VM
官方资料,关于Java SE 6 HotSpot虚拟机的garbage Collection,非常全,英文。
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
&