68.==和equals()

本文详细解析了Java中==运算符与equals()方法的区别,通过实例对比了基本类型与引用类型之间的比较,并介绍了equals()方法的正确覆盖方式。

==和equals()恐怕是刚刚开始学习Java中,最让人混淆的东西了。下面就可以

 

在Java程序设计中,我们经常需要比较两个变量值是否相等,比如:
 a = 10;
 b = 12;
 if(a == b) {
  //statements
 }

 


再如:
 ClassA a = new ClassA(“abc”);
 ClassA b = new ClassA(“abc”);
 if (a == b){
  //statements
 }


对于第一个例子,比较的是简单类型数据,它们是明显相同的,所以a==b这个值为true。

 

但是,对于第二个例子中的比较表达式,因为它们比较的是这两个变量a和b是否指向同一个对象引用,在这里,因为a指向一个对象,而b指向另一个对象,所以,它们并不指向同一个对象,因此,a==b返回的值是false。


为了方便说明简单类型和引用类型比较,此处用int类型和它的封装类Integer来说明简单类型和封装类型的进行比较时的区别。


我们来看下面的例子。

 

 

public class TestEqual {
 public static void main(String[] args) {
  // 简单类型比较
  int a = 100;
  int b = 100;

 

 

  System.out.println("a==b? " + (a == b));

  // 引用类型比较
  Integer c = new Integer(100);
  Integer d = new Integer(100);

  System.out.println("c==d? " + (c == d));
 }

运行这个程序,在控制台上打印出如下信息:
a==b? true
c==d? false

 // 其他属性略
 public Citizen(String theId) {
  id = theId;
 }
}


可以看出,比较两个引用类型的时候,虽然用了同一个参数构造两个变量,但是它们并不相同。这是为什么呢?


我们知道,对于引用类型,它们指向的是两个不同的对象:这两个对象的值都为100。因为它们指向的对象是两个对象,因此,比较这两个变量会得到false的值。也就是说,对于引用类型变量,运算符“==”比较的是两个对象是否引用同一个对象。

 

那么,如何比较对象的值是否相等?


在Java中,提供了一个equals()方法,用于比较对象的值。我们将上面的程序稍作修改:
 Integer c = new Integer(100);
 Integer d = new Integer(100);  
 System.out.println("c equals d? "+(c.equals(d)));


这个时候表达式c.equals(d)会得到一个true,这是因为,方法equals()进行的是“深层比较”,它会去比较两个对象的值是否相等。


那这个equals()方法是由谁来实现的呢?在所有类的父类Object中,已经定义了一个equals()方法,但是这个方法实际上也只是测试两个对象引用是否指向同一个对象。

 

所以,你可以使用这个方法来进行比较操作,但是,它并不一定能得到你所期望的效果。经常的,还需要自己将定义的类中的equals()进行覆盖。象Integer封装类,就覆盖了Object中的equals()方法。


关于==和equals()两种比较方式,在使用的时候要小心的选择:如果测试两个简单类型的数值是否相等,则一定要使用“==”来进行比较;

 

如果要比较两个引用变量对象的值是否相等,则用对象的equals()方法来进行比较;如果需要比较两个引用变量是否指向同一个对象,则使用“==”来进行比较。对于自定义的类,应该视情况覆盖Object或其父类中的equals()方法。equals()方法只有在比较的两者是同一个对象的时候,才返回true。

 

覆盖equals()方法

 

Object类的equals()方法的用处是用于测试两个对象引用是否是指向同一个对象。这种比较方式在实际应用中并没有多大的用处:我们常常需要的是判断两个对象的值是否相等而并不关心它们是否指向同一个对象。因此,需要在自己定义的类中对它进行覆盖。


我们来考虑如下的这种场景:假设在一个Java应用程序中,创建了两个“公民”对象。现在,我们需要比较两个“公民”对象是否相等,此时,关心的是这两个“公民”对象代表的是否为同一个人,而并不关心它们是否是同一个内存区域里的对象。

 

假设有一个类“Citizen”用于表示公民,它有一个属性id用来表示这个公民的身份证号,我们假设身份证号不会重复,也就是说,一个身份证号对应一个公民。它的类定义如下(为简单起见,省略了其他的属性而只留下用于表示身份证号的id属性):
public class Citizen {
 // 身份证号
 String id; 

 // 其他属性略
 public Citizen(String theId) {
  id = theId;
 }


我们假设在一个Java应用程序中,建立了两个“Citizen”对象,然后,在某个点上需要判断这两个对象是否代表了同一个公民:
Person p1 = new Person("id00001");
Person p2 = new Person("id00001");
... ...
if (p1.equals(p2)){
 ... ...
}


在这个程序中,因为这两个“Citizen”对象的身份证号一样,所以,它们代表的应该是同一个人,但如果用Object的默认方式,它只会去比较两个对象引用变量是否指向同一个对象,因此,它返回false。

 

显然,这个结果不是我们所期待的。此时,就需要在“Citizen”中覆盖Object类中的equals()方法,以满足我们自己的需求。

 

public class Citizen {
 // 身份证号
 private String id; 

 // 覆盖equals方法
 public boolean equals(Object obj) {
  // 首先需要判断需要比较的obj是否为null,
  // 如果为null,返回false
  if (obj == null) {
   return false;
  }
  // 判断测试的是否为同一个对象,
  // 如果是同一个对象,无庸置疑,它应该返回true
  if (this == obj) {
   return true;
  }
  // 判断它们的类型是否相等,
  // 如果不相等,则肯定返回false
  if (this.getClass() != obj.getClass()) {
   return false;
  }
  // 将参数中传入的对象造型为Citizen类型
  Citizen c = (Citizen) obj;
  // 只需比较两个对象的id属性是否一样,
  // 就可以得出这两个对象是否相等
  return id.equals(c.id);
 }
}

 

在这个类“Citizen”中,覆盖了父类(Object)中的equals(),使得它能够根据对象的id属性是否相等来判断这两个对象是否相等。

 

然后,我们来编写一个类来测试它,如下: 

 

public class TestCitizen {
 public static void main(String[] args) {
  Citizen p1 = new Citizen("id00001");
  Citizen p2 = new Citizen("id00001");
  System.out.println(p1.equals(p2));
 }
}



这个类中,定义了一个main()方法,它是一个应用程序。在main()方法中,使用身份证号“id00001”创建了两个Citizen对象,然后,用覆盖的equals()方法比较这两个对象的相等性,此时,因为它们的身份证号相同,equals()方法因此将返回true。编译并运行这个程序,将向控制台输出如下信息:
true


我们可以试着将覆盖的equals()方法删除或注释掉,然后重新编译运行TestCitizen.java,看看运行的结构。

 

在这个覆盖的equals()方法中,还使用到了另一个方法getClass(),它将返回对应的对象的运行期类(runtime class)。


另外,如果一个类的父类不是Object,那么,你首先需要检查它的父类是否定义了equals()方法,如果是的话,在覆盖父类的equals()方法的时候,需要记得在子类的equals()方法中使用下面的方法来调用父类的equals()方法,以确保父类中的相关比较能够得到执行:
super.equals(obj)


例如,假设有一个类“Armyman”用来表示军人,它是一个“Citizen”的子类,此时,如果在Armyman中覆盖Citizen的equals()方法,则需要在覆盖的equals()方法中调用被覆盖的Citizen类中的equals()方法:
public boolean equals(Object obj){
return super.equals(obj)&&(其他比较语句);
}

/media/fangqing/95b0e9e6-31e0-48d0-96fa-46599f44a68c/codessi/QSSI12/frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java private final boolean computeOomAdjLocked(ProcessRecord app, int cachedAdj, ProcessRecord topApp, boolean doingAll, long now, boolean cycleReEval, boolean computeClients) { if (mAdjSeq == app.adjSeq) { if (app.adjSeq == app.completedAdjSeq) { // This adjustment has already been computed successfully. return false; } else { // The process is being computed, so there is a cycle. We cannot // rely on this process's state. app.containsCycle = true; return false; } } if (app.thread == null) { app.adjSeq = mAdjSeq; app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_BACKGROUND); app.setCurProcState(PROCESS_STATE_CACHED_EMPTY); app.curAdj = ProcessList.CACHED_APP_MAX_ADJ; app.setCurRawAdj(ProcessList.CACHED_APP_MAX_ADJ); app.completedAdjSeq = app.adjSeq; app.curCapability = PROCESS_CAPABILITY_NONE; return false; } app.adjTypeCode = ActivityManager.RunningAppProcessInfo.REASON_UNKNOWN; app.adjSource = null; app.adjTarget = null; app.empty = false; app.setCached(false); app.shouldNotFreeze = false; final int appUid = app.info.uid; final int logUid = mService.mCurOomAdjUid; int prevAppAdj = app.curAdj; int prevProcState = app.getCurProcState(); int prevCapability = app.curCapability; if (app.maxAdj <= ProcessList.FOREGROUND_APP_ADJ) { // The max adjustment doesn't allow this app to be anything // below foreground, so it is not worth doing work for it. if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { mService.reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making fixed: " + app); } app.adjType = "fixed"; app.adjSeq = mAdjSeq; app.setCurRawAdj(app.maxAdj); app.setHasForegroundActivities(false); app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_DEFAULT); app.curCapability = PROCESS_CAPABILITY_ALL; app.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT); // System processes can do UI, and when they do we want to have // them trim their memory after the user leaves the UI. To // facilitate this, here we need to determine whether or not it // is currently showing UI. app.systemNoUi = true; if (app == topApp) { app.systemNoUi = false; app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP); app.adjType = "pers-top-activity"; } else if (app.hasTopUi()) { // sched group/proc state adjustment is below app.systemNoUi = false; app.adjType = "pers-top-ui"; } else if (app.getCachedHasVisibleActivities()) { app.systemNoUi = false; } if (!app.systemNoUi) { if (mService.mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE) { // screen on, promote UI app.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT_UI); app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP); } else { // screen off, restrict UI scheduling app.setCurProcState(PROCESS_STATE_BOUND_FOREGROUND_SERVICE); app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_RESTRICTED); } } app.setCurRawProcState(app.getCurProcState()); app.curAdj = app.maxAdj; app.completedAdjSeq = app.adjSeq; // if curAdj is less than prevAppAdj, then this process was promoted return app.curAdj < prevAppAdj || app.getCurProcState() < prevProcState; } app.systemNoUi = false; final int PROCESS_STATE_CUR_TOP = mService.mAtmInternal.getTopProcessState(); // Determine the importance of the process, starting with most // important to least, and assign an appropriate OOM adjustment. int adj; int schedGroup; int procState; int cachedAdjSeq; int capability = 0; boolean foregroundActivities = false; if (PROCESS_STATE_CUR_TOP == PROCESS_STATE_TOP && app == topApp) { // The last app on the list is the foreground app. adj = ProcessList.FOREGROUND_APP_ADJ; schedGroup = ProcessList.SCHED_GROUP_TOP_APP; app.adjType = "top-activity"; foregroundActivities = true; procState = PROCESS_STATE_CUR_TOP; if(mIsTopAppRenderThreadBoostEnabled) { if(mCurRenderThreadTid != app.renderThreadTid && app.renderThreadTid > 0) { mCurRenderThreadTid = app.renderThreadTid; if (mPerfBoost != null) { Slog.d(TAG, "TOP-APP: pid:" + app.pid + ", processName: " + app.processName + ", renderThreadTid: " + app.renderThreadTid); if (mPerfHandle >= 0) { mPerfBoost.perfLockRelease(); mPerfHandle = -1; } mPerfHandle = mPerfBoost.perfHint(BoostFramework.VENDOR_HINT_BOOST_RENDERTHREAD, app.processName, app.renderThreadTid, 1); Slog.d(TAG, "VENDOR_HINT_BOOST_RENDERTHREAD perfHint was called. mPerfHandle: " + mPerfHandle); } } } if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making top: " + app); } } else if (app.runningRemoteAnimation) { adj = ProcessList.VISIBLE_APP_ADJ; schedGroup = ProcessList.SCHED_GROUP_TOP_APP; app.adjType = "running-remote-anim"; procState = PROCESS_STATE_CUR_TOP; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making running remote anim: " + app); } } else if (app.getActiveInstrumentation() != null) { // Don't want to kill running instrumentation. adj = ProcessList.FOREGROUND_APP_ADJ; schedGroup = ProcessList.SCHED_GROUP_DEFAULT; app.adjType = "instrumentation"; procState = PROCESS_STATE_FOREGROUND_SERVICE; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making instrumentation: " + app); } } else if (app.getCachedIsReceivingBroadcast(mTmpBroadcastQueue)) { // An app that is currently receiving a broadcast also // counts as being in the foreground for OOM killer purposes. // It's placed in a sched group based on the nature of the // broadcast as reflected by which queue it's active in. adj = ProcessList.FOREGROUND_APP_ADJ; schedGroup = (mTmpBroadcastQueue.contains(mService.mFgBroadcastQueue)) ? ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND; app.adjType = "broadcast"; procState = ActivityManager.PROCESS_STATE_RECEIVER; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making broadcast: " + app); } } else if (app.executingServices.size() > 0) { // An app that is currently executing a service callback also // counts as being in the foreground. adj = ProcessList.FOREGROUND_APP_ADJ; schedGroup = app.execServicesFg ? ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND; app.adjType = "exec-service"; procState = PROCESS_STATE_SERVICE; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making exec-service: " + app); } //Slog.i(TAG, "EXEC " + (app.execServicesFg ? "FG" : "BG") + ": " + app); } else if (app == topApp) { adj = ProcessList.FOREGROUND_APP_ADJ; schedGroup = ProcessList.SCHED_GROUP_BACKGROUND; app.adjType = "top-sleeping"; foregroundActivities = true; procState = PROCESS_STATE_CUR_TOP; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making top (sleeping): " + app); } } else { // As far as we know the process is empty. We may change our mind later. schedGroup = ProcessList.SCHED_GROUP_BACKGROUND; // At this point we don't actually know the adjustment. Use the cached adj // value that the caller wants us to. adj = cachedAdj; procState = PROCESS_STATE_CACHED_EMPTY; if (!app.containsCycle) { app.setCached(true); app.empty = true; app.adjType = "cch-empty"; } if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Making empty: " + app); } } // Examine all activities if not already foreground. if (!foregroundActivities && app.getCachedHasActivities()) { app.computeOomAdjFromActivitiesIfNecessary(mTmpComputeOomAdjWindowCallback, adj, foregroundActivities, procState, schedGroup, appUid, logUid, PROCESS_STATE_CUR_TOP); adj = app.mCachedAdj; foregroundActivities = app.mCachedForegroundActivities; procState = app.mCachedProcState; schedGroup = app.mCachedSchedGroup; } if (procState > PROCESS_STATE_CACHED_RECENT && app.getCachedHasRecentTasks()) { procState = PROCESS_STATE_CACHED_RECENT; app.adjType = "cch-rec"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to cached recent: " + app); } } if (adj > ProcessList.PERCEPTIBLE_APP_ADJ || procState > PROCESS_STATE_FOREGROUND_SERVICE) { if (app.hasForegroundServices()) { // The user is aware of this app, so make it visible. adj = ProcessList.PERCEPTIBLE_APP_ADJ; procState = PROCESS_STATE_FOREGROUND_SERVICE; app.adjType = "fg-service"; app.setCached(false); schedGroup = ProcessList.SCHED_GROUP_DEFAULT; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to " + app.adjType + ": " + app + " "); } } else if (app.hasOverlayUi()) { // The process is display an overlay UI. adj = ProcessList.PERCEPTIBLE_APP_ADJ; procState = PROCESS_STATE_IMPORTANT_FOREGROUND; app.setCached(false); app.adjType = "has-overlay-ui"; schedGroup = ProcessList.SCHED_GROUP_DEFAULT; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to overlay ui: " + app); } } } // If the app was recently in the foreground and moved to a foreground service status, // allow it to get a higher rank in memory for some time, compared to other foreground // services so that it can finish performing any persistence/processing of in-memory state. if (app.hasForegroundServices() && adj > ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ && (app.lastTopTime + mConstants.TOP_TO_FGS_GRACE_DURATION > now || app.setProcState <= PROCESS_STATE_TOP)) { adj = ProcessList.PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ; app.adjType = "fg-service-act"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to recent fg: " + app); } } if (adj > ProcessList.PERCEPTIBLE_APP_ADJ || procState > PROCESS_STATE_TRANSIENT_BACKGROUND) { if (app.forcingToImportant != null) { // This is currently used for toasts... they are not interactive, and // we don't want them to cause the app to become fully foreground (and // thus out of background check), so we yes the best background level we can. adj = ProcessList.PERCEPTIBLE_APP_ADJ; procState = PROCESS_STATE_TRANSIENT_BACKGROUND; app.setCached(false); app.adjType = "force-imp"; app.adjSource = app.forcingToImportant; schedGroup = ProcessList.SCHED_GROUP_DEFAULT; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to force imp: " + app); } } } if (app.getCachedIsHeavyWeight()) { if (adj > ProcessList.HEAVY_WEIGHT_APP_ADJ) { // We don't want to kill the current heavy-weight process. adj = ProcessList.HEAVY_WEIGHT_APP_ADJ; schedGroup = ProcessList.SCHED_GROUP_BACKGROUND; app.setCached(false); app.adjType = "heavy"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to heavy: " + app); } } if (procState > ActivityManager.PROCESS_STATE_HEAVY_WEIGHT) { procState = ActivityManager.PROCESS_STATE_HEAVY_WEIGHT; app.adjType = "heavy"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to heavy: " + app); } } } if (app.getCachedIsHomeProcess()) { if (adj > ProcessList.HOME_APP_ADJ) { // This process is hosting what we currently consider to be the // home app, so we don't want to let it go into the background. adj = ProcessList.HOME_APP_ADJ; schedGroup = ProcessList.SCHED_GROUP_BACKGROUND; app.setCached(false); app.adjType = "home"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to home: " + app); } } if (procState > ActivityManager.PROCESS_STATE_HOME) { procState = ActivityManager.PROCESS_STATE_HOME; app.adjType = "home"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to home: " + app); } } } if (app.getCachedIsPreviousProcess() && app.getCachedHasActivities()) { if (adj > ProcessList.PREVIOUS_APP_ADJ) { // This was the previous process that showed UI to the user. // We want to try to keep it around more aggressively, to give // a good experience around switching between two apps. adj = ProcessList.PREVIOUS_APP_ADJ; schedGroup = ProcessList.SCHED_GROUP_BACKGROUND; app.setCached(false); app.adjType = "previous"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to prev: " + app); } } if (procState > PROCESS_STATE_LAST_ACTIVITY) { procState = PROCESS_STATE_LAST_ACTIVITY; app.adjType = "previous"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to prev: " + app); } } } if (false) Slog.i(TAG, "OOM " + app + ": initial adj=" + adj + " reason=" + app.adjType); // By default, we use the computed adjustment. It may be changed if // there are applications dependent on our services or providers, but // this gives us a baseline and makes sure we don't get into an // infinite recursion. If we're re-evaluating due to cycles, use the previously computed // values. if (cycleReEval) { procState = Math.min(procState, app.getCurRawProcState()); adj = Math.min(adj, app.getCurRawAdj()); schedGroup = Math.max(schedGroup, app.getCurrentSchedulingGroup()); } app.setCurRawAdj(adj); app.setCurRawProcState(procState); app.hasStartedServices = false; app.adjSeq = mAdjSeq; final BackupRecord backupTarget = mService.mBackupTargets.get(app.userId); if (backupTarget != null && app == backupTarget.app) { // If possible we want to avoid killing apps while they're being backed up if (adj > ProcessList.BACKUP_APP_ADJ) { if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "oom BACKUP_APP_ADJ for " + app); adj = ProcessList.BACKUP_APP_ADJ; if (procState > PROCESS_STATE_TRANSIENT_BACKGROUND) { procState = PROCESS_STATE_TRANSIENT_BACKGROUND; } app.adjType = "backup"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to backup: " + app); } app.setCached(false); } if (procState > ActivityManager.PROCESS_STATE_BACKUP) { procState = ActivityManager.PROCESS_STATE_BACKUP; app.adjType = "backup"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to backup: " + app); } } } int capabilityFromFGS = 0; // capability from foreground service. for (int is = app.numberOfRunningServices() - 1; is >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND || procState > PROCESS_STATE_TOP); is--) { ServiceRecord s = app.getRunningServiceAt(is); if (s.startRequested) { app.hasStartedServices = true; if (procState > PROCESS_STATE_SERVICE) { procState = PROCESS_STATE_SERVICE; app.adjType = "started-services"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to started service: " + app); } } if (!s.mKeepWarming && app.hasShownUi && !app.getCachedIsHomeProcess()) { // If this process has shown some UI, let it immediately // go to the LRU list because it may be pretty heavy with // UI stuff. We'll tag it with a label just to help // debug and understand what is going on. if (adj > ProcessList.SERVICE_ADJ) { app.adjType = "cch-started-ui-services"; } } else { if (s.mKeepWarming || now < (s.lastActivity + mConstants.MAX_SERVICE_INACTIVITY)) { // This service has seen some activity within // recent memory, so we will keep its process ahead // of the background processes. if (adj > ProcessList.SERVICE_ADJ) { adj = ProcessList.SERVICE_ADJ; app.adjType = "started-services"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to started service: " + app); } app.setCached(false); } } // If we have let the service slide into the background // state, still have some text describing what it is doing // even though the service no longer has an impact. if (adj > ProcessList.SERVICE_ADJ) { app.adjType = "cch-started-services"; } } } if (s.isForeground) { final int fgsType = s.foregroundServiceType; if (s.mAllowWhileInUsePermissionInFgs) { capabilityFromFGS |= (fgsType & FOREGROUND_SERVICE_TYPE_LOCATION) != 0 ? PROCESS_CAPABILITY_FOREGROUND_LOCATION : 0; boolean enabled = false; try { enabled = mPlatformCompat.isChangeEnabled( CAMERA_MICROPHONE_CAPABILITY_CHANGE_ID, s.appInfo); } catch (RemoteException e) { } if (enabled) { capabilityFromFGS |= (fgsType & FOREGROUND_SERVICE_TYPE_CAMERA) != 0 ? PROCESS_CAPABILITY_FOREGROUND_CAMERA : 0; capabilityFromFGS |= (fgsType & FOREGROUND_SERVICE_TYPE_MICROPHONE) != 0 ? PROCESS_CAPABILITY_FOREGROUND_MICROPHONE : 0; } else { capabilityFromFGS |= PROCESS_CAPABILITY_FOREGROUND_CAMERA | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; } } } ArrayMap<IBinder, ArrayList<ConnectionRecord>> serviceConnections = s.getConnections(); for (int conni = serviceConnections.size() - 1; conni >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND || procState > PROCESS_STATE_TOP); conni--) { ArrayList<ConnectionRecord> clist = serviceConnections.valueAt(conni); for (int i = 0; i < clist.size() && (adj > ProcessList.FOREGROUND_APP_ADJ || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND || procState > PROCESS_STATE_TOP); i++) { // XXX should compute this based on the max of // all connected clients. ConnectionRecord cr = clist.get(i); if (cr.binding.client == app) { // Binding to oneself is not interesting. continue; } boolean trackedProcState = false; ProcessRecord client = cr.binding.client; if (computeClients) { computeOomAdjLocked(client, cachedAdj, topApp, doingAll, now, cycleReEval, true); } else { client.setCurRawAdj(client.setAdj); client.setCurRawProcState(client.setProcState); } int clientAdj = client.getCurRawAdj(); int clientProcState = client.getCurRawProcState(); if ((cr.flags & Context.BIND_WAIVE_PRIORITY) == 0) { if (shouldSkipDueToCycle(app, client, procState, adj, cycleReEval)) { continue; } if (cr.hasFlag(Context.BIND_INCLUDE_CAPABILITIES)) { capability |= client.curCapability; } if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) { // If the other app is cached for any reason, for purposes here // we are going to consider it empty. The specific cached state // doesn't propagate except under certain conditions. clientProcState = PROCESS_STATE_CACHED_EMPTY; } String adjType = null; if ((cr.flags&Context.BIND_ALLOW_OOM_MANAGEMENT) != 0) { // Not doing bind OOM management, so treat // this guy more like a started service. if (app.hasShownUi && !app.getCachedIsHomeProcess()) { // If this process has shown some UI, let it immediately // go to the LRU list because it may be pretty heavy with // UI stuff. We'll tag it with a label just to help // debug and understand what is going on. if (adj > clientAdj) { adjType = "cch-bound-ui-services"; } app.setCached(false); clientAdj = adj; clientProcState = procState; } else { if (now >= (s.lastActivity + mConstants.MAX_SERVICE_INACTIVITY)) { // This service has not seen activity within // recent memory, so allow it to drop to the // LRU list if there is no other reason to keep // it around. We'll also tag it with a label just // to help debug and undertand what is going on. if (adj > clientAdj) { adjType = "cch-bound-services"; } clientAdj = adj; } } } if (adj > clientAdj) { // If this process has recently shown UI, and // the process that is binding to it is less // important than being visible, then we don't // care about the binding as much as we care // about letting this process get into the LRU // list to be killed and restarted if needed for // memory. if (app.hasShownUi && !app.getCachedIsHomeProcess() && clientAdj > ProcessList.PERCEPTIBLE_APP_ADJ) { if (adj >= ProcessList.CACHED_APP_MIN_ADJ) { adjType = "cch-bound-ui-services"; } } else { int newAdj; if ((cr.flags&(Context.BIND_ABOVE_CLIENT |Context.BIND_IMPORTANT)) != 0) { if (clientAdj >= ProcessList.PERSISTENT_SERVICE_ADJ) { newAdj = clientAdj; } else { // make this service persistent newAdj = ProcessList.PERSISTENT_SERVICE_ADJ; schedGroup = ProcessList.SCHED_GROUP_DEFAULT; procState = ActivityManager.PROCESS_STATE_PERSISTENT; cr.trackProcState(procState, mAdjSeq, now); trackedProcState = true; } } else if ((cr.flags & Context.BIND_NOT_PERCEPTIBLE) != 0 && clientAdj <= ProcessList.PERCEPTIBLE_APP_ADJ && adj >= ProcessList.PERCEPTIBLE_LOW_APP_ADJ) { newAdj = ProcessList.PERCEPTIBLE_LOW_APP_ADJ; } else if ((cr.flags&Context.BIND_NOT_VISIBLE) != 0 && clientAdj < ProcessList.PERCEPTIBLE_APP_ADJ && adj >= ProcessList.PERCEPTIBLE_APP_ADJ) { newAdj = ProcessList.PERCEPTIBLE_APP_ADJ; } else if (clientAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) { newAdj = clientAdj; } else { if (adj > ProcessList.VISIBLE_APP_ADJ) { // TODO: Is this too limiting for apps bound from TOP? newAdj = Math.max(clientAdj, ProcessList.VISIBLE_APP_ADJ); } else { newAdj = adj; } } if (!client.isCached()) { app.setCached(false); } if (adj > newAdj) { adj = newAdj; app.setCurRawAdj(adj); adjType = "service"; } } } if ((cr.flags & (Context.BIND_NOT_FOREGROUND | Context.BIND_IMPORTANT_BACKGROUND)) == 0) { // This will treat important bound services identically to // the top app, which may behave differently than generic // foreground work. final int curSchedGroup = client.getCurrentSchedulingGroup(); if (curSchedGroup > schedGroup) { if ((cr.flags&Context.BIND_IMPORTANT) != 0) { schedGroup = curSchedGroup; } else { schedGroup = ProcessList.SCHED_GROUP_DEFAULT; } } if (clientProcState < PROCESS_STATE_TOP) { // Special handling for above-top states (persistent // processes). These should not bring the current process // into the top state, since they are not on top. Instead // give them the best bound state after that. if (cr.hasFlag(Context.BIND_FOREGROUND_SERVICE)) { clientProcState = PROCESS_STATE_BOUND_FOREGROUND_SERVICE; ; } else if (mService.mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE && (cr.flags & Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE) != 0) { clientProcState = PROCESS_STATE_BOUND_FOREGROUND_SERVICE; } else { clientProcState = PROCESS_STATE_IMPORTANT_FOREGROUND; } } else if (clientProcState == PROCESS_STATE_TOP) { // Go at most to BOUND_TOP, unless requested to elevate // to client's state. clientProcState = PROCESS_STATE_BOUND_TOP; boolean enabled = false; try { enabled = mPlatformCompat.isChangeEnabled( PROCESS_CAPABILITY_CHANGE_ID, client.info); } catch (RemoteException e) { } if (enabled) { if (cr.hasFlag(Context.BIND_INCLUDE_CAPABILITIES)) { // TOP process passes all capabilities to the service. capability |= PROCESS_CAPABILITY_ALL; } else { // TOP process passes no capability to the service. } } else { // TOP process passes all capabilities to the service. capability |= PROCESS_CAPABILITY_ALL; } } } else if ((cr.flags & Context.BIND_IMPORTANT_BACKGROUND) == 0) { if (clientProcState < PROCESS_STATE_TRANSIENT_BACKGROUND) { clientProcState = PROCESS_STATE_TRANSIENT_BACKGROUND; } } else { if (clientProcState < PROCESS_STATE_IMPORTANT_BACKGROUND) { clientProcState = PROCESS_STATE_IMPORTANT_BACKGROUND; } } if (schedGroup < ProcessList.SCHED_GROUP_TOP_APP && (cr.flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0) { schedGroup = ProcessList.SCHED_GROUP_TOP_APP; } if (!trackedProcState) { cr.trackProcState(clientProcState, mAdjSeq, now); } if (procState > clientProcState) { procState = clientProcState; app.setCurRawProcState(procState); if (adjType == null) { adjType = "service"; } } if (procState < PROCESS_STATE_IMPORTANT_BACKGROUND && (cr.flags & Context.BIND_SHOWING_UI) != 0) { app.setPendingUiClean(true); } if (adjType != null) { app.adjType = adjType; app.adjTypeCode = ActivityManager.RunningAppProcessInfo .REASON_SERVICE_IN_USE; app.adjSource = cr.binding.client; app.adjSourceProcState = clientProcState; app.adjTarget = s.instanceName; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to " + adjType + ": " + app + ", due to " + cr.binding.client + " adj=" + adj + " procState=" + ProcessList.makeProcStateString(procState)); } } } else { // BIND_WAIVE_PRIORITY == true // BIND_WAIVE_PRIORITY bindings are special when it comes to the // freezer. Processes bound via WPRI are expected to be running, // but they are not promoted in the LRU list to keep them out of // cached. As a result, they can freeze based on oom_adj alone. // Normally, bindToDeath would fire when a cached app would die // in the background, but nothing will fire when a running process // pings a frozen process. Accordingly, any cached app that is // bound by an unfrozen app via a WPRI binding has to remain // unfrozen. if (clientAdj < ProcessList.CACHED_APP_MIN_ADJ) { app.shouldNotFreeze = true; } } if ((cr.flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) { app.treatLikeActivity = true; } final ActivityServiceConnectionsHolder a = cr.activity; if ((cr.flags&Context.BIND_ADJUST_WITH_ACTIVITY) != 0) { if (a != null && adj > ProcessList.FOREGROUND_APP_ADJ && a.isActivityVisible()) { adj = ProcessList.FOREGROUND_APP_ADJ; app.setCurRawAdj(adj); if ((cr.flags&Context.BIND_NOT_FOREGROUND) == 0) { if ((cr.flags&Context.BIND_IMPORTANT) != 0) { schedGroup = ProcessList.SCHED_GROUP_TOP_APP_BOUND; } else { schedGroup = ProcessList.SCHED_GROUP_DEFAULT; } } app.setCached(false); app.adjType = "service"; app.adjTypeCode = ActivityManager.RunningAppProcessInfo .REASON_SERVICE_IN_USE; app.adjSource = a; app.adjSourceProcState = procState; app.adjTarget = s.instanceName; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to service w/activity: " + app); } } } } } } for (int provi = app.pubProviders.size() - 1; provi >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND || procState > PROCESS_STATE_TOP); provi--) { ContentProviderRecord cpr = app.pubProviders.valueAt(provi); for (int i = cpr.connections.size() - 1; i >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ || schedGroup == ProcessList.SCHED_GROUP_BACKGROUND || procState > PROCESS_STATE_TOP); i--) { ContentProviderConnection conn = cpr.connections.get(i); ProcessRecord client = conn.client; if (client == app) { // Being our own client is not interesting. continue; } if (computeClients) { computeOomAdjLocked(client, cachedAdj, topApp, doingAll, now, cycleReEval, true); } else { client.setCurRawAdj(client.setAdj); client.setCurRawProcState(client.setProcState); } if (shouldSkipDueToCycle(app, client, procState, adj, cycleReEval)) { continue; } int clientAdj = client.getCurRawAdj(); int clientProcState = client.getCurRawProcState(); if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) { // If the other app is cached for any reason, for purposes here // we are going to consider it empty. clientProcState = PROCESS_STATE_CACHED_EMPTY; } String adjType = null; if (adj > clientAdj) { if (app.hasShownUi && !app.getCachedIsHomeProcess() && clientAdj > ProcessList.PERCEPTIBLE_APP_ADJ) { adjType = "cch-ui-provider"; } else { adj = clientAdj > ProcessList.FOREGROUND_APP_ADJ ? clientAdj : ProcessList.FOREGROUND_APP_ADJ; app.setCurRawAdj(adj); adjType = "provider"; } app.setCached(app.isCached() & client.isCached()); } if (clientProcState <= PROCESS_STATE_FOREGROUND_SERVICE) { if (adjType == null) { adjType = "provider"; } if (clientProcState == PROCESS_STATE_TOP) { clientProcState = PROCESS_STATE_BOUND_TOP; } else { clientProcState = PROCESS_STATE_BOUND_FOREGROUND_SERVICE; } } conn.trackProcState(clientProcState, mAdjSeq, now); if (procState > clientProcState) { procState = clientProcState; app.setCurRawProcState(procState); } if (client.getCurrentSchedulingGroup() > schedGroup) { schedGroup = ProcessList.SCHED_GROUP_DEFAULT; } if (adjType != null) { app.adjType = adjType; app.adjTypeCode = ActivityManager.RunningAppProcessInfo .REASON_PROVIDER_IN_USE; app.adjSource = client; app.adjSourceProcState = clientProcState; app.adjTarget = cpr.name; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to " + adjType + ": " + app + ", due to " + client + " adj=" + adj + " procState=" + ProcessList.makeProcStateString(procState)); } } } // If the provider has external (non-framework) process // dependencies, ensure that its adjustment is at least // FOREGROUND_APP_ADJ. if (cpr.hasExternalProcessHandles()) { if (adj > ProcessList.FOREGROUND_APP_ADJ) { adj = ProcessList.FOREGROUND_APP_ADJ; app.setCurRawAdj(adj); schedGroup = ProcessList.SCHED_GROUP_DEFAULT; app.setCached(false); app.adjType = "ext-provider"; app.adjTarget = cpr.name; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to external provider: " + app); } } if (procState > PROCESS_STATE_IMPORTANT_FOREGROUND) { procState = PROCESS_STATE_IMPORTANT_FOREGROUND; app.setCurRawProcState(procState); if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to external provider: " + app); } } } } if (app.lastProviderTime > 0 && (app.lastProviderTime + mConstants.CONTENT_PROVIDER_RETAIN_TIME) > now) { if (adj > ProcessList.PREVIOUS_APP_ADJ) { adj = ProcessList.PREVIOUS_APP_ADJ; schedGroup = ProcessList.SCHED_GROUP_BACKGROUND; app.setCached(false); app.adjType = "recent-provider"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to recent provider: " + app); } } if (procState > PROCESS_STATE_LAST_ACTIVITY) { procState = PROCESS_STATE_LAST_ACTIVITY; app.adjType = "recent-provider"; if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to recent provider: " + app); } } } if (procState >= PROCESS_STATE_CACHED_EMPTY) { if (app.hasClientActivities()) { // This is a cached process, but with client activities. Mark it so. procState = PROCESS_STATE_CACHED_ACTIVITY_CLIENT; app.adjType = "cch-client-act"; } else if (app.treatLikeActivity) { // This is a cached process, but somebody wants us to treat it like it has // an activity, okay! procState = PROCESS_STATE_CACHED_ACTIVITY; app.adjType = "cch-as-act"; } } if (adj == ProcessList.SERVICE_ADJ) { if (doingAll && !cycleReEval) { app.serviceb = mNewNumAServiceProcs > (mNumServiceProcs/3); mNewNumServiceProcs++; //Slog.i(TAG, "ADJ " + app + " serviceb=" + app.serviceb); if (!app.serviceb) { // This service isn't far enough down on the LRU list to // normally be a B service, but if we are low on RAM and it // is large we want to force it down since we would prefer to // keep launcher over it. if (mService.mLastMemoryLevel > ProcessStats.ADJ_MEM_FACTOR_NORMAL && app.lastPss >= mProcessList.getCachedRestoreThresholdKb()) { app.serviceHighRam = true; app.serviceb = true; //Slog.i(TAG, "ADJ " + app + " high ram!"); } else { mNewNumAServiceProcs++; //Slog.i(TAG, "ADJ " + app + " not high ram!"); } } else { app.serviceHighRam = false; } } if (app.serviceb) { adj = ProcessList.SERVICE_B_ADJ; } } app.setCurRawAdj(adj); //Slog.i(TAG, "OOM ADJ " + app + ": pid=" + app.pid + // " adj=" + adj + " curAdj=" + app.curAdj + " maxAdj=" + app.maxAdj); if (adj > app.maxAdj) { adj = app.maxAdj; if (app.maxAdj <= ProcessList.PERCEPTIBLE_LOW_APP_ADJ) { schedGroup = ProcessList.SCHED_GROUP_DEFAULT; } } // Put bound foreground services in a special sched group for additional // restrictions on screen off if (procState >= PROCESS_STATE_BOUND_FOREGROUND_SERVICE && mService.mWakefulness != PowerManagerInternal.WAKEFULNESS_AWAKE) { if (schedGroup > ProcessList.SCHED_GROUP_RESTRICTED) { schedGroup = ProcessList.SCHED_GROUP_RESTRICTED; } } // apply capability from FGS. if (app.hasForegroundServices()) { capability |= capabilityFromFGS; } capability |= getDefaultCapability(app, procState); // Do final modification to adj. Everything we do between here and applying // the final setAdj must be done in this function, because we will also use // it when computing the final cached adj later. Note that we don't need to // worry about this for max adj above, since max adj will always be used to // keep it out of the cached vaues. app.curAdj = app.modifyRawOomAdj(adj); if (app.processName.equals("cn.weipass.service") || app.processName.equals("com.wiseasy.nfcservice") || app.processName.startsWith("cn.wiseasy.leopardclaw") || app.processName.startsWith("com.wangpos.updatespdemo") || app.processName.equals("wangpos.sdk4.base") || app.processName.equals("com.nlscan.scantool") || app.processName.equals("wangpos.sdk4.emv") || app.processName.equals("wangpos.sdk4.keymanager") || app.processName.equals("com.android.externalstorage") || app.processName.equals("com.android.settings.intelligence") || app.processName.equals("android.process.media") || app.processName.equals("com.android.aging") || app.processName.equals("com.wpos.sdkdemo") || app.processName.equals("com.android.settings") || app.processName.equals("com.android.managedprovisioning") || app.processName.equals("com.google.android.apps.work.clouddpc") || app.processName.equals("com.qualcomm.qti.qms.service.connectionsecurity") || app.processName.equals("com.google.android.configupdater") || app.processName.equals("com.google.process.gapps") || app.processName.equals("com.android.vending") || app.processName.equals("com.google.process.gservices") || app.processName.equals("com.google.android.gms.ui")) { app.curAdj = 0; } app.curCapability = capability; app.setCurrentSchedulingGroup(schedGroup); app.setCurProcState(procState); app.setCurRawProcState(procState); app.setHasForegroundActivities(foregroundActivities); app.completedAdjSeq = mAdjSeq; if ("com.idtech.watchdog".equals(app.processName)) { adj = 200; // Target OOM adj value schedGroup = ProcessList.SCHED_GROUP_DEFAULT; procState = ActivityManager.PROCESS_STATE_SERVICE; // Example state, choose appropriately // Skip further adj computations for this process app.curRawAdj = adj; app.curAdj = adj; app.setSchedGroup = schedGroup; //app.setCurProcState(procState); return true; // Or break out of the adjustment logic if possible } // if curAdj or curProcState improved, then this process was promoted return app.curAdj < prevAppAdj || app.getCurProcState() < prevProcState || app.curCapability != prevCapability ; } 普通应用com.idtech.watchdog 如何再frameworklmkd 调整 不被容易杀掉
08-23
public DrugBasic getYpBasic(String key,String valueStr,DrugBasic basic,TSysPerson per){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); if(key.equals("b_value_1")){ //抽样计划名称 basic.setLccb_chouyrwly(valueStr); }else if(key.equals("b_value_2")){ //抽样类别 basic.setLccb_jymdxl(valueStr); }else if(key.equals("b_value_3")){ //抽样细类 //basic.setLccb_bsflb(valueStr); }else if(key.equals("b_value_4")){ //统计所属抽样单位 basic.setLccb_cydw(valueStr); Date date = null; try { date = sdf.parse(valueStr); } catch (ParseException e) { e.printStackTrace(); } basic.setLccb_sjrq(date); }else if(key.equals("b_value_5")){ //抽样单位省 basic.setLccb_cydwsheng(valueStr); }else if(key.equals("b_value_6")){ //抽样单位市 basic.setLccb_cydwshi(valueStr); }else if(key.equals("b_value_7")){ //抽样单位县 basic.setLccb_cydwxian(valueStr); }else if(key.equals("b_value_8")){ //抽样单编号 basic.setLccb_chouyjpzbh(valueStr); }else if(key.equals("b_value_9")){ //抽样时间 Date date = null; try { date = sdf.parse(valueStr); } catch (ParseException e) { e.printStackTrace(); } basic.setLccb_cysj(date); }else if(key.equals("b_value_10")){ //抽样单位联系人 basic.setLccb_cydwlxr(valueStr); }else if(key.equals("b_value_11")){ //抽样单位电话 basic.setLccb_cydwdh(valueStr); }else if(key.equals("b_value_12")){ //检验单位 }else if(key.equals("b_value_13")){ //检验单位省 }else if(key.equals("b_value_14")){ //检验单位市 }else if(key.equals("b_value_15")){ //检验单位县 }else if(key.equals("b_value_16")){ //受托抽样单位 basic.setLccb_stdw(valueStr); }else if(key.equals("b_value_17")){ //受托单位省 basic.setLccb_stdwdsheng(valueStr); }else if(key.equals("b_value_18")){ //受托单位市 basic.setLccb_stdwdshi(valueStr); }else if(key.equals("b_value_19")){ //受托单位县 basic.setLccb_stdwdxian(valueStr); }else if(key.equals("b_value_20")){ //检品名称 basic.setLccb_jpmc(valueStr); }else if(key.equals("b_value_21")){ //批号 basic.setLccb_ph(valueStr); }else if(key.equals("b_value_22")){ //剂型 basic.setLccb_yangplx(valueStr); }else if(key.equals("b_value_23")){ //规格型号 basic.setLccb_gg(valueStr); }else if(key.equals("b_value_24")){ //包装规格 basic.setLccb_baozfl(valueStr); }else if(key.equals("b_value_25")){ //生产日期 basic.setLccb_scrq(valueStr); }else if(key.equals("b_value_26")){ //效期月 basic.setLccb_yxqys(valueStr); }else if(key.equals("b_value_27")){ //保质期 basic.setLccb_yxq(valueStr); }else if(key.equals("b_value_28")){ //商品名 basic.setLccb_ypspm(valueStr); }else if(key.equals("b_value_29")){ //是否基药 basic.setLccb_sfjy(valueStr); }else if(key.equals("b_value_30")){ //生产单位 basic.setLccb_scdwname(valueStr); }else if(key.equals("b_value_31")){ //是否基药 basic.setLccb_sfjy(valueStr); }else if(key.equals("b_value_32")){ //生产单位地址 basic.setLccb_scdwdz(valueStr); }else if(key.equals("b_value_33")){ //是否委托加工 basic.setLccb_sfwtjg(valueStr); }else if(key.equals("b_value_34")){ //生产单位省 basic.setLccb_scdwsheng(valueStr); }else if(key.equals("b_value_35")){ //生产单位市 basic.setLccb_scdwshi(valueStr); }else if(key.equals("b_value_36")){ //生产单位县 basic.setLccb_scdwxian(valueStr); }else if(key.equals("b_value_37")){ //被抽样单位 basic.setLccb_bcydw(valueStr); }else if(key.equals("b_value_38")){ //被抽样单位经办人 //basic.setLccb_bcydwjbr(valueStr); }else if(key.equals("b_value_39")){ //被抽样单位联系人 basic.setLccb_bcydwlxr(valueStr); }else if(key.equals("b_value_40")){ //被抽样单位电话 basic.setLccb_bcydwdh(valueStr); }else if(key.equals("b_value_41")){ //被抽样单位邮编 basic.setLccb_bcydwyb(valueStr); }else if(key.equals("b_value_42")){ //被抽样单位省 basic.setLccb_beisydwdz(valueStr); }else if(key.equals("b_value_43")){ //被抽样单位市 basic.setLccb_beisydwdz1(valueStr); /* String[] str = valueStr.split(""); String lysl = ""; for(int i=0;i<str.length;i++){ if(StringUtils.isNotEmpty(str[i])&&(str[i].matches("\\d")||str[i].matches("\\."))){ lysl+=str[i]; }else if(StringUtils.isNotEmpty(str[i])&&!(str[i].matches("\\d")||str[i].matches("\\."))){ break; } } basic.setLccb_lysl(lysl); String lysldw = valueStr.replace(lysl, ""); if(!Util.isEmpty(lysldw)){ basic.setLccb_lysldw(lysldw); }*/ }else if(key.equals("b_value_44")){ //被抽样单位县 basic.setLccb_beisydwdz2(valueStr); }else if(key.equals("b_value_45")){ //被抽样单位地址 basic.setLccb_bcydwdz(valueStr); }else if(key.equals("b_value_46")){ //检品分类大类 basic.setLccb_jymddl(valueStr); }else if(key.equals("b_value_47")){ //检品分类细类 basic.setLccb_jymdxl(valueStr); }else if(key.equals("b_value_48")){ //包装材料 basic.setLccb_chouyypbz(valueStr); }else if(key.equals("b_value_49")){ //抽样环节 basic.setLccb_chouyhuanj(valueStr); }else if(key.equals("b_value_50")){ //被抽样单位类别 basic.setLccb_bcydwxz(valueStr); }else if(key.equals("b_value_51")){ //抽样地点 if(!StringUtils.isEmpty(valueStr)) { String[] a = valueStr.split("-"); basic.setLccb_bcydwxz(a[0]); if(a.length>1) { basic.setLccb_cydd(a[1]); } } }else if(key.equals("b_value_52")){ //包装状态 basic.setLccb_chouybzzt(valueStr); }else if(key.equals("b_value_53")){ //包装状态其他 //basic.setLccb_bzztqt(valueStr); }else if(key.equals("b_value_54")){ //样品贮存温度 basic.setLccb_wd(valueStr); }else if(key.equals("b_value_55")){ //样品贮存相对湿度 basic.setLccb_sd(valueStr); }else if(key.equals("b_value_56")){ //抽样数量 basic.setLccb_cysl(valueStr); basic.setLccb_jpsl(valueStr); }else if(key.equals("b_value_57")){ //抽样数量单位 basic.setLccb_cysldw(valueStr); basic.setLccb_jpsldw(valueStr); }else if(key.equals("b_value_58")){ //单价 basic.setLccb_danjia(valueStr); }else if(key.equals("b_value_59")){ //生产配制购进数量 basic.setLccb_jhnum(valueStr); }else if(key.equals("b_value_60")){ //抽样说明 //basic.setLccb_cysm(valueStr); }else if(key.equals("b_value_61")){ //抽样级别 //basic.setLccb_cyjb(valueStr); }else if(key.equals("b_value_62")){ //生产日期 //basic.setLccb_scrq("b_value_62"); }else if(key.equals("b_value_63")){ //抽样单位地址 basic.setLccb_cydwdz(valueStr); }else if(key.equals("b_value_64")){ //批准文号 basic.setLccb_pzwh(valueStr); }else if(key.equals("b_value_65")){ //受托单位地址 basic.setLccb_stdwdz(valueStr); }else if(key.equals("b_value_67")){ try { String fj=""; valueStr = valueStr.replaceFirst(";", ""); for (String val : valueStr.split(";")) { byte[] bytes = stringToBytes(val); System.out.println("^V^"+bytes); String sid = new GUID().toString(); buff2Image(bytes,"D:\\apache-tomcat-7.0.42\\webapps\\glxt_qh\\upload\\"+sid+".jpg"); fj+=",upload/"+sid+".jpg"; } basic.setLccb_fileattach(fj.replaceFirst(",", "")); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }else if(key.equals("b_value_68")){ //药品属性 basic.setLccb_ypsx(valueStr); }else if(key.equals("b_value_69")){ //企业属性 basic.setLccb_qysx(valueStr); }else if(key.equals("b_value_71")){ //贮存条件 basic.setLccb_ypztbz(valueStr); }else if(key.equals("b_value_72")){ //包装规格 basic.setLccb_baozfl(valueStr); } basic.setLccb_jymddl("抽查检验"); basic.setLccb_jymdxl("省抽"); basic.setLccb_djr(per.getFrymc()); return basic; }
07-03
7-1 设计几何类并计算面积 分数 60 作者 王磊 单位 合肥师范学院 设计一个代表几何形状的抽象类Geometry及其圆形子类Circle矩形子类Rectangle。具体属性方法如下: (1)Geometry类包含namecolor两个属性以及相应的getset方法,包括一个有参的构造方法以及用于计算几何面积的抽象方法getArea。 (2)Circle子类包含radius以及相应的getset方法,包括一个有参的构造方法以及重写的getArea方法。圆周率应使用Math类的相关常量。 (3)Rectangle子类包含widthheight以及相应的getset方法,包括一个有参的构造方法以及重写的getArea方法。 设计测试类Main,在main方法中读取输入并创建几何形状,然后调用Main类的showInfo(Geometry g)方法输出该形状的信息。 输入格式: 每一行的多个参数用空格分隔,依次为名字、颜色、尺寸参数。 如果名字为“end”,则表示输入终止。 输出格式: 输出该形状的名字、颜色、面积。 输入样例: 在这里给出一组输入。例如: 圆形 红色 1.5 矩形 蓝色 4.5 6.0 end 输出样例: 在这里给出相应的输出。例如: 该圆形的颜色为红色,面积为7.07 该矩形的颜色为蓝色,面积为27.00 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB Java (javac) Selection deleted 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 } public Circle(String name,String color,double radius) { super(name,color); this.radius=radius; } public void setterR(double radius) { this.radius=radius; } public double getterR() { return radius; } public double getArea() { //实现计算圆形面积的抽象方法 return Math.PI*radius*radius; } } class Rectangle extends Geometry { //定义矩形子类 public double width; public double height; public Rectangle() { } public Rectangle(String name,String color,double width,double height) { super(name,color); this.width=width; this.height=height; } public void setterW(double width) { this.width=width; } public void setterH(double height) { this.height=height; } public double getterW() { return width; } public double getterH() { return height; } public double getArea() { //实现计算矩形面积的抽象方法 return width*height; } } public class Main { public static void main(String [] args) { Scanner scanner = new Scanner(System.in); Geometry C= new Circle(); C.name=scanner.nextLine(); C.color=scanner.nextLine(); C.radius=scanner.nextDouble(); showInfo(C); Geometry R=new Rectangle() ; R.name=scanner.nextLine(); R.color=scanner.nextLine(); R.widths=scanner.nextDouble(); R.height=scanner.nextDouble();//根据题目提示:向上继承 showInfo(R); //调用公有静态show方法 } public static void showInfo(Geometry g) { if(g.getterN().equals("长方形")) //若符合条件则根据格式输出 System.out.println("该圆形的颜色是:"+g.getterC()+",圆形的面积是:"+g.findArea()); else System.out.println("该矩形的颜色是:"+g.getterC()+",面积是:"+g.findArea());} }
最新发布
11-06
float workTime = 0f; for (EngDeptWorkTimeInfoReq infoReq : reqs) { float coefficient = EngUtil.getCoefficient(category, infoReq); Integer condition = infoReq.getCondition(); if (Objects.isNull(condition) || condition == 0 || condition >3){ throw new EJBException("成型类编程请求参数有异常,请检查后重试"); } String conditionType = infoReq.getConditionType(); if (condition == 1){ //规则 String conditionName = infoReq.getConditionName(); if (StringUtils.equals(conditionType, "fine_pl")){ if (StringUtils.equals(conditionName, "规则平面") ||StringUtils.equals(conditionName, "斜面") ||StringUtils.equals(conditionName, "弧面")){ workTime = coefficient * 90; } else if (conditionName.startsWith("多层框")) { workTime = coefficient * 120; } } else if (StringUtils.equals(conditionType, "rough_complex")) { if (conditionName.startsWith("多层框")) { workTime = coefficient * 480; } } else if (StringUtils.equals(conditionType, "finishing")) { if (StringUtils.equals(conditionName,"圆形及规则四边斜")) { workTime = coefficient * 90; } else if (StringUtils.equals(conditionName, "汽车门") ||StringUtils.equals(conditionName, "汽车保险杆")) { workTime = coefficient * 600; } } } else if (condition == 2) { //框深 float frameDark = infoReq.getFrameDark(); if (frameDark == 0f){ throw new EJBException("存在框深为0,无工时返回"); } if (frameDark <= 200f){ if (StringUtils.equals(conditionType, "rough_frame")){ workTime = coefficient * 210; }else if (StringUtils.equals(conditionType, "finishing")){ workTime = coefficient * 300; } }else { if (StringUtils.equals(conditionType, "rough_frame")){ workTime = coefficient * 330; }else if (StringUtils.equals(conditionType, "finishing")){ workTime = coefficient * 450; } } } else { //框数 //最大框数 Integer frameNum = infoReq.getFrameNum(); if (frameNum == 0f){ throw new EJBException("存在最大框数为0,无工时返回"); } if (StringUtils.equals(conditionType, "fine_frame")){ if (frameNum <= 6){ workTime = coefficient * 60; } else if (frameNum <= 10) { workTime = coefficient * 120; } else if (frameNum <= 16) { workTime = coefficient * 195; } else if (frameNum <= 25) { workTime = coefficient * 330; } else if (frameNum <= 35) { workTime = coefficient * 430; } else { workTime = coefficient * 450; } } } } return workTime; 优化
09-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值