1. 程式人生 > >JAVA Collections.sort方法在SSH三大框架中使用中的問題

JAVA Collections.sort方法在SSH三大框架中使用中的問題

     最近,一同學在開發中遇到了SSH三大框架中使用到了Collections.sort方法。然而,他開發環境中的JDK

是1.7.0_64,網站部署的JDK版本是1.7.0_80,他通過開發環境中產生的.class直接去更新網站部署環境中的.class

檔案後,程式相關功能模組執行到Collections.sort不繼續執行也不報錯,而前臺ajax因此取不到資料。

類似的遠端如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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

public

 String analysisBillByIllName(){

if(!"".equals(queryItem)){         

List<IllnessPrescriptionFrequency> ipflist = ipfs.findByIllName(queryItem);

List<BillView> bvlist = new ArrayList<BillView>();

if(ipflist.size()!=0){             

int sumfreq = 0;

for(IllnessPrescriptionFrequency inst:ipflist){

if(!"".equals(inst.getId().getBillIds())){                     

String[] bids = inst.getId().getBillIds().split("\\$");

for(int i=0;i<bids.length;i++){

BillView bv = new BillView();

bv.setBillId(Integer.parseInt(bids[i]));

bv.setFrequency(inst.getId().getPrescriptionFreequency());

sumfreq +=inst.getId().getPrescriptionFreequency();

bvlist.add(bv);

}

}

}

for(int j=0;j<bvlist.size();j++){

for(int k=j+1;k<bvlist.size() -1;k++){

if(bvlist.get(j).getBillId().equals(bvlist.get(k).getBillId())){

bvlist.get(j).setFrequency(bvlist.get(j).getFrequency()+bvlist.get(k).getFrequency());

bvlist.remove(k);

}

}

}

System.out.println(">>>>>>>>>>bvlist for2 ipflist:"+bvlist.size());

final int sumRatio = sumfreq; 

Collections.sort(bvlist,new Comparator<BillView>(){//list sort

public int compare(BillView bv1,BillView bv2){

if(bv1.getFrequency()<bv2.getFrequency()){

return 1;

}

if(bv1.getFrequency()==bv2.getFrequency()){

return 0;

}

return -1;

}

});

System.out.println(">>>>>>>>>>bvlist Collections:"+bvlist.size());

for(BillView bv:bvlist){

Bill qb = bills.findById(bv.getBillId());

bv.setBillName(qb.getBillName());

float divd = bv.getFrequency()/sumRatio;

bv.setUseageRatio(divd);

bv.setIllName(queryItem);

}

flag="data";

jsonArray = JSONArray.fromObject(bvlist);

System.out.println(jsonArray.toString());

return SUCCESS;

}else{

flag="none";

return SUCCESS;

}

}else{

return ERROR;

}

}

如上程式通過AJAX非同步訪問,在開發環境中能正常執行;但是使用低版本的JDK編譯後的.class檔案直接去替換高版本下

的同名.class檔案類,程式執行到:

1

System.out.println(">>>>>>>>>>bvlist for2 ipflist:"+bvlist.size());

而下邊的方法不執行也不報錯:

1

2

3

4

5

6

7

8

9

10

11

Collections.sort(bvlist,new Comparator<BillView>(){//list sort

public int compare(BillView bv1,BillView bv2){

if(bv1.getFrequency()<bv2.getFrequency()){

return 1;

}

if(bv1.getFrequency()==bv2.getFrequency()){

return 0;

}

return -1;

}

});

程式無法執行Collections.sort,不能執行到函式返回語句,AJAX非同步訪問獲取不到資料,導致前臺報錯獲取資料失敗。

    在問題排查過程中,經歷瞭如下過程: 

    1、開發環境是windows,網站部署環境是centos6.8,前後重新編譯了網站程式碼,並且重新部署了centos上的網站, 

問題還是不執行Collections.sort;

    2、懷疑是阿里雲環境安全的限制,關閉了主機防火牆,但是Collections.sort方法還是不執行也不報錯;

    3、單獨編輯測試Collections.sort的java類分別在windows和centos環境下編譯執行,發現Collections.sort在windows和centos上均可以執行,測試程式如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

class BillView{

private Integer billId;

private String billName;

private String illName;

private int frequency;

private float useageRatio;

public Integer getBillId() {

return billId;

}

public void setBillId(Integer billId) {

this.billId = billId;

}

public String getBillName() {

return billName;

}

public void setBillName(String billName) {

this.billName = billName;

}

public String getIllName() {

return illName;

}

public void setIllName(String illName) {

this.illName = illName;

}

public int getFrequency() {

return frequency;

}

public void setFrequency(int frequency) {

this.frequency = frequency;

}

public float getUseageRatio() {

return useageRatio;

}

public void setUseageRatio(float useageRatio) {

this.useageRatio = useageRatio;

}

public BillView() {

}

public BillView(Integer billId, String billName, String illName,

int frequency, float useageRatio) {

super();

this.billId = billId;

this.billName = billName;

this.illName = illName;

this.frequency = frequency;

this.useageRatio = useageRatio;

}

}

public class Test {

public static void main(String[] args){

List<BillView> bvlist = new ArrayList<BillView>();

BillView bv1 = new BillView(1"蘋果"null10); 

BillView bv2 = new BillView(2"香蕉"null40);

BillView bv3 = new BillView(3"橘子"null20);

BillView bv4 = new BillView(4"梨"null90);

bvlist.add(bv1);

bvlist.add(bv2);

bvlist.add(bv3);

bvlist.add(bv4);

Collections.sort(bvlist,new Comparator<BillView>(){//list sort

public int compare(BillView bv1,BillView bv2){

if(bv1.getFrequency()<bv2.getFrequency()){

return 1;

}

if(bv1.getFrequency()==bv2.getFrequency()){

return 0;

}

return -1;

}

});

System.out.println("collections --->"+bvlist.size());

for(BillView bv:bvlist){

System.out.println("  "+bv.getBillName()+"  "+bv.getFrequency());

}

}

}

  4、檢視windows和centos環境下的JDK版本,發現兩邊環境JDK版本不一致,windows環境下jdk版本是:1.7.0_64,而

centos環境下JDK版本是1.7.0_80;將windows環境下JDK版本更新到1.7.0_80,並指定開發工具myeclipse的Java編譯使用

JDK1.7.0_80版本,重新編譯網站原始碼,在centos上釋出網站,發現如下程式順利執行:

1

2

3

4

5

6

7

8

9

10

11

Collections.sort(bvlist,new Comparator<BillView>(){//list sort

public int compare(BillView bv1,BillView bv2){

if(bv1.getFrequency()<bv2.getFrequency()){

return 1;

}

if(bv1.getFrequency()==bv2.getFrequency()){

return 0;

}

return -1;

}

});

  到此問題得到了解決!