俗话说,好记性不如烂笔头。今天终于体会其中的道理了。昨天写好的代码不知道为何找不到了。所以今天我一定得抽出一点时间把我的代码保存起来,以防我的代码再没有了。

还是先上图片。

这个界面是用ListView实现的,数据是数据库里面的数据,服务器为thinkPHP。我就不废话那么多,直接把我的代码拷贝上了、

总的思想就是,利用账号查询数据库中的信息,然后对返回的信息进行解析。这里我把账号保存到了本地。

Data.java

  1. package cn.edu.aynu.rjxy.entity;
  2.  
  3. public class Data {
  4. private int id;
  5. private String exp_name;
  6. private String exp_tech;
  7. private String exp_type;
  8. private String exp_source;
  9. private String exp_tno;
  10. private String istate;
  11. private String sno;
  12. private String sname;
  13. private String passwd;
  14. private String grade;
  15. private String school;
  16. private String qq;
  17. private String clas;
  18. private String cellphone;
  19. private String email;
  20. private String spec;
  21. public String getSpec() {
  22. return spec;
  23. }
  24. public void setSpec(String spec) {
  25. this.spec = spec;
  26. }
  27. public String getSno() {
  28. return sno;
  29. }
  30. public void setSno(String sno) {
  31. this.sno = sno;
  32. }
  33. public String getSname() {
  34. return sname;
  35. }
  36. public void setSname(String sname) {
  37. this.sname = sname;
  38. }
  39. public String getPasswd() {
  40. return passwd;
  41. }
  42. public void setPasswd(String passwd) {
  43. this.passwd = passwd;
  44. }
  45. public String getGrade() {
  46. return grade;
  47. }
  48. public void setGrade(String grade) {
  49. this.grade = grade;
  50. }
  51. public String getSchool() {
  52. return school;
  53. }
  54. public void setSchool(String school) {
  55. this.school = school;
  56. }
  57. public String getQq() {
  58. return qq;
  59. }
  60. public void setQq(String qq) {
  61. this.qq = qq;
  62. }
  63. public String getClas() {
  64. return clas;
  65. }
  66. public void setClas(String clas) {
  67. this.clas = clas;
  68. }
  69. public String getCellphone() {
  70. return cellphone;
  71. }
  72. public void setCellphone(String cellphone) {
  73. this.cellphone = cellphone;
  74. }
  75. public String getEmail() {
  76. return email;
  77. }
  78. public void setEmail(String email) {
  79. this.email = email;
  80. }
  81.  
  82. public String getExp_type() {
  83. return exp_type;
  84. }
  85. public void setExp_type(String exp_type) {
  86. this.exp_type = exp_type;
  87. }
  88. public String getExp_source() {
  89. return exp_source;
  90. }
  91. public void setExp_source(String exp_source) {
  92. this.exp_source = exp_source;
  93. }
  94. public String getExp_tno() {
  95. return exp_tno;
  96. }
  97. public void setExp_tno(String exp_tno) {
  98. this.exp_tno = exp_tno;
  99. }
  100. public String getIstate() {
  101. return istate;
  102. }
  103. public void setIstate(String istate) {
  104. this.istate = istate;
  105. }
  106.  
  107. public int getId() {
  108. return id;
  109. }
  110. public void setId(int id) {
  111. this.id = id;
  112. }
  113. public String getExp_name() {
  114. return exp_name;
  115. }
  116. public void setExp_name(String exp_name) {
  117. this.exp_name = exp_name;
  118. }
  119. public String getExp_tech() {
  120. return exp_tech;
  121. }
  122. public void setExp_tech(String exp_tech) {
  123. this.exp_tech = exp_tech;
  124. }
  125. @Override
  126. public String toString() {
  127. return "Data [id=" + id + ", exp_name=" + exp_name + ", exp_tech="
  128. + exp_tech + "]";
  129. }
  130.  
  131. }
  1. SharedPreferencesUtils.java
  1. package cn.edu.aynu.rjxy.utils;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. import android.content.Context;
  7. import android.content.SharedPreferences;
  8. import android.content.SharedPreferences.Editor;
  9.  
  10. public class SharedPreferencesUtils {
  11. //保存账号和密码到minemessage.xml
  12. public static boolean saveUserInfo(Context context,String cellphone,String qq,String email){
  13. SharedPreferences sp = context.getSharedPreferences("minemessage", Context.MODE_PRIVATE);
  14. Editor edit = sp.edit();
  15. edit.putString("cellphone", cellphone);
  16. edit.putString("qq", qq);
  17. edit.putString("email", email);
  18. edit.commit();
  19. return true;
  20. }
  21. //保存账号和密码到data.xml
  22. public static boolean saveUserInfo02(Context context,String sno,String password,String spinnerId){
  23. SharedPreferences sp = context.getSharedPreferences("data", Context.MODE_PRIVATE);
  24. Editor edit = sp.edit();
  25. edit.putString("sno", sno);
  26. edit.putString("password", password);
  27. edit.putString("spinnerId", spinnerId);
  28. edit.commit();
  29. return true;
  30. }
  31. //保存账号和密码到select.xml
  32. public static boolean saveUserInfo03(Context context,String sno,String id){
  33. SharedPreferences sp = context.getSharedPreferences("select", Context.MODE_PRIVATE);
  34. Editor edit = sp.edit();
  35. edit.putString("sno", sno);
  36. edit.putString("id", id);
  37. edit.commit();
  38. return true;
  39. }
  40.  
  41. //从data.xml文件中获取存贮的账号和密码
  42. public static Map<String,String> getUserInfo(Context context){
  43. SharedPreferences sp = context.getSharedPreferences("data", Context.MODE_PRIVATE);
  44. String sno = sp.getString("sno", null);
  45. String password = sp.getString("password", null);
  46. String spinnerId = sp.getString("spinnerId", null);
  47. Map<String,String> userMap = new HashMap<String, String>();
  48. userMap.put("sno", sno);
  49. userMap.put("password", password);
  50. userMap.put("spinnerId", spinnerId);
  51. return userMap;
  52. }
  53. //从minemessage.xml文件中获取存贮的账号和密码
  54. public static Map<String,String> getUserInfo02(Context context){
  55. SharedPreferences sp = context.getSharedPreferences("minemessage", Context.MODE_PRIVATE);
  56. String cellphone = sp.getString("cellphone", null);
  57. String qq = sp.getString("qq", null);
  58. String email = sp.getString("email", null);
  59. Map<String,String> userMap = new HashMap<String, String>();
  60. userMap.put("cellphone", cellphone);
  61. userMap.put("qq", qq);
  62. userMap.put("email", email);
  63. return userMap;
  64. }
  65. //从select.xml文件中获取存贮的账号和密码
  66. public static Map<String,String> getUserInfo03(Context context){
  67. SharedPreferences sp = context.getSharedPreferences("select", Context.MODE_PRIVATE);
  68. String sno = sp.getString("sno", null);
  69. String id = sp.getString("id", null);
  70. Map<String,String> userMap = new HashMap<String, String>();
  71. userMap.put("sno", sno);
  72. return userMap;
  73. }
  74. }
  1. StreamTools.java
  1. package cn.edu.aynu.rjxy.utils;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6.  
  7. public class StreamTools {
  8.  
  9. public static String readStream(InputStream is){
  10. try {
  11. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  12. byte[] buffer = new byte[1024];
  13. int len = -1;
  14. while ((len = is.read(buffer))!=-1) {
  15. baos.write(buffer,0,len);
  16. }
  17. baos.close();
  18. return new String(baos.toByteArray());
  19. } catch (IOException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. return "";
  23. }
  24. }
  25. }
  1.  
  2. MineActivity.java
  1. package cn.edu.aynu.rjxy.activity;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.net.HttpURLConnection;
  8. import java.net.URL;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. import java.util.Map;
  12.  
  13. import org.apache.http.HttpResponse;
  14. import org.apache.http.StatusLine;
  15. import org.apache.http.client.ClientProtocolException;
  16. import org.apache.http.client.HttpClient;
  17. import org.apache.http.client.methods.HttpGet;
  18. import org.apache.http.impl.client.DefaultHttpClient;
  19. import org.json.JSONArray;
  20. import org.json.JSONException;
  21. import org.json.JSONObject;
  22.  
  23. import cn.edu.aynu.rjxy.entity.Data;
  24. import cn.edu.aynu.rjxy.utils.SharedPreferencesUtils;
  25.  
  26. import android.app.Activity;
  27. import android.os.Bundle;
  28. import android.os.Handler;
  29. import android.os.Message;
  30. import android.util.Log;
  31. import android.view.View;
  32. import android.view.ViewGroup;
  33. import android.widget.BaseAdapter;
  34. import android.widget.ListView;
  35. import android.widget.TextView;
  36.  
  37. public class MineActivity extends Activity {
  38. private static final int CHANGE_UI = 1;
  39. private static final int ERROR = 2;
  40. private ListView lv;
  41. private List<Data> datas = new ArrayList<Data>();
  42. //主线程创建消息处理器
  43. private Handler handler = new Handler(){
  44. public void handleMessage(android.os.Message msg) {
  45. if (msg.what == CHANGE_UI) {
  46. try {
  47. JSONArray arr = new JSONArray((String)msg.obj);
  48. for (int i = 0; i < arr.length(); i++) {
  49. JSONObject temp = (JSONObject) arr.get(i);
  50. // Log.d("json", temp.getInt("id")+temp.getString("exp_name")+temp.getString("exp_tech"));
  51. Data data = new Data();
  52. data.setId(temp.getInt("id"));
  53. data.setExp_name(temp.getString("exp_name"));
  54. data.setExp_tech(temp.getString("exp_tech"));
  55. data.setExp_source(temp.getString("exp_source"));
  56. data.setExp_type(temp.getString("exp_type"));
  57. data.setExp_tno(temp.getString("tname"));
  58. data.setIstate(temp.getString("istate"));
  59. //这个地方可以获取到值但是适配器那位0
  60. datas.add(data);
  61.  
  62. }
  63. lv.setAdapter(new MyAdapter());
  64. } catch (JSONException e) {
  65. // TODO Auto-generated catch block
  66. e.printStackTrace();
  67. }
  68. }
  69. };
  70. };
  71. protected String sno;
  72.  
  73. @Override
  74. protected void onCreate(Bundle savedInstanceState) {
  75. super.onCreate(savedInstanceState);
  76. setContentView(R.layout.activity_mine);
  77. lv = (ListView) findViewById(R.id.lv);
  78. select();
  79. //取出账号和密码
  80. Map<String,String> userInfo = SharedPreferencesUtils.getUserInfo(this);
  81.  
  82. if (userInfo != null) {
  83. sno = userInfo.get("sno");
  84. }
  85.  
  86. }
  87.  
  88. private void select(){
  89. //子线程更新UI
  90. new Thread(){
  91. public void run(){
  92. try {
  93. StringBuilder builder = new StringBuilder();
  94. String path = "http://10.6.78.254:2016/xampp/graduate/index.php/home/Student/test_check";
  95. URL url = new URL(path);
  96. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  97. //区别2、请求方式post
  98. conn.setRequestMethod("POST");
  99. conn.setRequestProperty("User-Agent", "Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)");
  100. //区别3、必须指定两个请求的参数
  101. conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//请求的类型 表单数据
  102. //System.out.println(sno);
  103. String data = "sno="+sno;
  104. conn.setRequestProperty("Content-Length", data.length()+"");//数据的长度
  105. //区别4、记得设置把数据写给服务器
  106. conn.setDoOutput(true);//设置向服务器写数据
  107. byte[] bytes = data.getBytes();
  108. conn.getOutputStream().write(bytes);//把数据以流的方式写给服务器
  109. int code = conn.getResponseCode();
  110. if (code == 200) {
  111. InputStream is = conn.getInputStream();
  112. BufferedReader reader = new BufferedReader
  113. (new InputStreamReader(is,"UTF-8"));
  114. for(String s=reader.readLine();s!=null;s=reader.readLine())
  115. {
  116. builder.append(s);
  117. }
  118. String content = builder.toString();
  119. //通知主线程更新UI
  120. Message message = new Message();
  121. message.what = CHANGE_UI;
  122. message.obj = content;
  123. handler.sendMessage(message);
  124. }else{
  125. Log.e(HomeActivity.class.toString(), "Failed");
  126. }
  127. } catch (ClientProtocolException e) {
  128.  
  129. e.printStackTrace();
  130. } catch (IOException e) {
  131.  
  132. e.printStackTrace();
  133. }
  134.  
  135. };
  136. }.start();
  137. }
  138. class MyAdapter extends BaseAdapter{
  139.  
  140. @Override
  141. public int getCount() {
  142. Log.d("AAA", ""+datas.size());
  143. return datas.size();
  144.  
  145. }
  146.  
  147. @Override
  148. public Object getItem(int position) {
  149.  
  150. return datas.get(position);
  151. }
  152.  
  153. @Override
  154. public long getItemId(int position) {
  155.  
  156. return position;
  157. }
  158.  
  159. @Override
  160. public View getView(int position, View convertView, ViewGroup parent) {
  161. View view = View.inflate(MineActivity.this, R.layout.ui_setting_select, null);
  162.  
  163. TextView exp_name = (TextView) view.findViewById(R.id.tv_name);
  164. TextView exp_tech = (TextView) view.findViewById(R.id.tv_tech);
  165. TextView exp_type = (TextView) view.findViewById(R.id.tv_type);
  166. TextView exp_source = (TextView) view.findViewById(R.id.tv_source);
  167. TextView exp_tno = (TextView) view.findViewById(R.id.tv_tno);
  168.  
  169. Data data = datas.get(position);
  170. Log.d("aaaaa",datas.get(position).getExp_name() );
  171.  
  172. exp_name.setText(datas.get(position).getExp_name());
  173. //Log.i("exp_name", datas.get(position).getExp_name());
  174. exp_tech.setText(datas.get(position).getExp_tech());
  175. exp_type.setText(datas.get(position).getExp_type());
  176. exp_source.setText(datas.get(position).getExp_source());
  177. exp_tno.setText(datas.get(position).getExp_tno());
  178.  
  179. return view;
  180. }
  181.  
  182. }
  183. }
  1. activity_mine.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="#FFFFFF"
  6. android:padding="5dp"
  7. android:orientation="vertical" >
  8. <ListView
  9. android:id="@+id/lv"
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content"
  12. android:layout_marginLeft="5dp">
  13. </ListView>
  14.  
  15. </RelativeLayout>

item_mine.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent"
  3. android:layout_height="fill_parent"
  4. android:padding="5dp"
  5. android:background="#FFFFFF"
  6. android:orientation="vertical">
  7. <View
  8. android:layout_width="fill_parent"
  9. android:layout_height="2dip"
  10. android:layout_marginTop="5dip"/>
  11.  
  12. <RelativeLayout
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content" >
  15. <TextView
  16. style="@style/LTexTviewStyle"
  17. android:text="毕业设计名称" />
  18.  
  19. <TextView
  20. android:id="@+id/tv_name"
  21. style="@style/TextViewStyle"
  22. android:text="25" />
  23. </RelativeLayout>
  24. <View
  25. android:layout_width="fill_parent"
  26. android:layout_height="0.2dip"
  27. android:layout_marginTop="5dip"
  28. android:background="#bb000000"/>
  29. <RelativeLayout
  30. android:layout_width="fill_parent"
  31. android:layout_height="wrap_content" >
  32. <TextView
  33. style="@style/LTexTviewStyle"
  34. android:text="题目类型" />
  35.  
  36. <TextView
  37. android:id="@+id/tv_type"
  38. style="@style/TextViewStyle"
  39. android:text="25" />
  40. </RelativeLayout>
  41. <View
  42. android:layout_width="fill_parent"
  43. android:layout_height="0.2dip"
  44. android:layout_marginTop="5dip"
  45. android:background="#bb000000"/>
  46. <RelativeLayout
  47. android:layout_width="fill_parent"
  48. android:layout_height="wrap_content" >
  49. <TextView
  50. style="@style/LTexTviewStyle"
  51. android:text="题目来源" />
  52.  
  53. <TextView
  54. android:id="@+id/tv_source"
  55. style="@style/TextViewStyle"
  56. android:text="25" />
  57. </RelativeLayout>
  58. <View
  59. android:layout_width="fill_parent"
  60. android:layout_height="0.2dip"
  61. android:layout_marginTop="5dip"
  62. android:background="#bb000000"/>
  63. <RelativeLayout
  64. android:layout_width="fill_parent"
  65. android:layout_height="wrap_content" >
  66. <TextView
  67. style="@style/LTexTviewStyle"
  68. android:text="指导老师" />
  69.  
  70. <TextView
  71. android:id="@+id/tv_tno"
  72. style="@style/TextViewStyle"
  73. android:text="25" />
  74. </RelativeLayout>
  75. <View
  76. android:layout_width="fill_parent"
  77. android:layout_height="0.2dip"
  78. android:layout_marginTop="5dip"
  79. android:background="#bb000000"/>
  80. <RelativeLayout
  81. android:layout_width="fill_parent"
  82. android:layout_height="wrap_content" >
  83. <TextView
  84. style="@style/LTexTviewStyle"
  85. android:text="技术要求" />
  86.  
  87. <TextView
  88. android:id="@+id/tv_tech"
  89. style="@style/TextViewStyle"
  90. android:text="25" />
  91. </RelativeLayout>
  92. <View
  93.  
  94. android:layout_width="fill_parent"
  95. android:layout_height="0.2dip"
  96. android:layout_marginTop="5dip"
  97. android:background="#bb000000"/>
  98. <RelativeLayout
  99. android:layout_width="fill_parent"
  100. android:layout_height="wrap_content" >
  101. <Button
  102. android:id="@+id/btn_reselect"
  103. android:onClick="reselect"
  104. android:layout_width="wrap_content"
  105. android:layout_height="wrap_content"
  106. android:text="退选"
  107. android:layout_alignParentRight="true"
  108. android:textColor="#000000"
  109. android:background="#FFFFFF"/>
  110.  
  111. </RelativeLayout>
  112. </LinearLayout>

PHP端的代码:

  1. //Android端查看我的选题
  2. public function test_check(){
  3. $sno = I('sno');
  4. $Experiment = M("Experiment");
  5. //$sno = '130906008';
  6. $exp_tno = $Experiment -> where("sno = '".$sno."'") -> getField('exp_tno');
  7. //echo $exp_tno;
  8. $RowCount = $Experiment -> where("sno = '".$sno."'") -> Count();
  9. if($RowCount == 1){
  10. $myModel = new \Think\Model();
  11. $result=$myModel->query("select *from g_experiment,g_teacher where sno = $sno && tno = $exp_tno ;");
  12. $this ->ajaxReturn($result);
  13. }else{
  14. echo '你还没有选题';
  15. }
  16. }

Android+PHP+MYSQL把数据库中的数据显示在Android界面上的更多相关文章

  1. 涂抹mysql笔记-数据库中的权限体系

    涂抹mysql笔记-数据库中的权限体系<>能不能连接,主机名是否匹配.登陆使用的用户名和密码是否正确.mysql验证用户需要检查3项值:用户名.密码和主机来源(user.password. ...

  2. 自定义tt文本模板实现MySql指数据库中生成实体类

    自定义tt文本模板实现MySql指数据库中生成实体类 1.在项目中依次点击“添加”/“新建项”,选择“文本模板”,输入名称后点击添加. 2.在Base.tt中添加如下代码. <#@ templa ...

  3. PHP中将数据库中的数据显示在网页

    最近没事把以前的东西感觉还可以的又简单的看了以下,因为还在学习新的东西,所以,发表的博客也不是很多,也许是有感而发吧. 这次讲的是mysql数据库中的数据使用php如何显示在网页中.首先,先建好自己的 ...

  4. 优化MD5和IP在(MySQL)数据库中的存储

    1.MD5在MySQL数据库中的存储 用CHAR(32)来存储MD5值是一个常见的技巧.如果你的应用程序使用VARCHAR(32),则对每个值得字符串长度都需要花费额外的不 必要的开销.这个十六进制的 ...

  5. MySql 查询数据库中所有表名

    查询数据库中所有表名select table_name from information_schema.tables where table_schema='csdb' and table_type= ...

  6. mysql查询数据库中包含某字段(列名)的所有表

    SELECT TABLE_NAME '表名',TABLE_SCHEMA '数据库名',ORDINAL_POSITION '顺序',COLUMN_NAME '字段',DATA_TYPE '类型' ,CH ...

  7. mysql 从数据库中获取多条记录,二维展示数据

    展示要求: 客户/日期 2017-10-16 1017-10-17 2017-10-18 客户1       客户2       数据库中数据: 解决办法: 1.新建一个实体类:客户名称.客户数据(A ...

  8. MySql 查询数据库中所有表名以及对比分布式库中字段和表的不同

    查询数据库中所有表名select table_name from information_schema.tables where table_schema='数据库名' and table_type= ...

  9. php mysql替换数据库中出现过的所有域名实现办法 (原)

    2019-10-12备注: 数据量稍微有些大且前期数据库建设相当完善的可以看一下这边的方法,数据量小或者数据库建设不完善的可以参考这篇文章,前两天看的,没自己试,有需要可以试试  https://ww ...

随机推荐

  1. WPF MVVM框架下,VM界面写控件

    MVVM正常就是在View页面写样式,ViewModel页面写逻辑,但是有的时候纯在View页面写样式并不能满足需求.我最近的这个项目就遇到了,因此只能在VM页面去写样式控件,然后绑定到View页面. ...

  2. 前端学PHP之面向对象系列第四篇——关键字

    × 目录 [1]public [2]protected [3]private[4]final[5]static[6]const[7]this[8]self[9]parent 前面的话 php实现面向对 ...

  3. c++ stringstream(老好用了)

    前言: 以前没有接触过stringstream这个类的时候,常用的字符串和数字转换函数就是sscanf和sprintf函数.开始的时候就觉得这两个函数应经很叼了,但是毕竟是属于c的.c++中引入了流的 ...

  4. 可惜Java中没有yield return

    项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...

  5. ORM开发之解析lambda实现完整查询(附测试例子)

    上次讲解了怎么解析匿名对象(ORM开发之解析lambda实现group查询),这次来实现解析二元运算,完成基本条件语法 先看一个表达式 query.Where(b => b.Number == ...

  6. 【记录】AutoMapper Project To OrderBy Skip Take 正确写法

    AutoMapper:Queryable Extensions 示例代码: using (var context = new orderEntities()) { return context.Ord ...

  7. 自己使用的一个.NET轻量开发结构

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABFCAIAAAAerjlvAAAE2UlEQVR4nO2a3U/bVhiH+bdyPaqpmx

  8. hibernate笔记--组合主键映射方法

    一个数据库表中其主键有可能不止一个属性,同样映射到实体类中,可能有两个或多个属性共同配置成为一个主键,假设一个实体类Score,其主键有两个属性stuId(学生编号)和subjectId(科目编号), ...

  9. php插入式排序的两种写法。

    百度了下插入式排序,百度百科中php版本的插入式排序如下: function insert_sort($arr) { // 将$arr升序排列 $count = count($arr); for ($ ...

  10. 【JUC】JDK1.8源码分析之ConcurrentSkipListMap(二)

    一.前言 最近在做项目的同时也在修复之前项目的一些Bug,所以忙得没有时间看源代码,今天都完成得差不多了,所以又开始源码分析之路,也着笔记录下ConcurrentSkipListMap的源码的分析过程 ...