Activity状态:

每个Activity在其生命周期中最多可能有四种状态

1.运行状态:处于栈顶时。初次创建处于栈顶时依次调用:onCreate(),onStart(),onResume()。由不可见重新处于栈顶时依次调用:onRestart(),onStart(),onResume()。由可见重新处于栈顶时调用:onResume()。

2.暂停状态:可见却不在栈顶。例如在MainActivity中启动一个对话框式Activity时。该对话框式Activity处于栈顶,但MainActivity仍然可见,只是MainActivity不处于栈顶。调用onPause()。如下图:

3.停止状态:不可见并且不在栈顶时。例如在MainActivity中启动一个普通的Activity时,该Activity会彻底覆盖MainActivity,致使MainActivity不可见,这时MainActivity便进入了停止状态。依次调用onPause(),onStop()

4.销毁状态:从栈中移除后。例如在MainActivity界面按下返回键,这时是将MainActivity从栈顶移除,这样被移除后的MainActivity就成了销毁状态。依次调用onPause(),onStop(), onDestroy()

 onCreate():该方法会在Activity第一次被创建的时候调用。我们一般都会重写此方法,完成一些Activity的初始化操作,如加载布局,绑定事件等。该方法使得Activity创建。

 onStart():该方法在Activity由不可见变为可见时调用。使得Activity可见。

 onResume():该方法在Activity准备好和用户进行交互时调用。此时的Activity一定返回栈的栈顶,并且处于运行状态。使得Activity获取焦点,可以进行操作(交互)

 onPause():该方法在系统准备去启动或者恢复另一个Activity的时候调用,我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶Activity的使用。使得Activity失去焦点,不能交互。

 onStop():该方法在Activity完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动一个新的Activity是一个对话框式的Activity,那么onPause()方法会得到新的执行,而onStop()方法并不会执行。使得Activity不可见

 onDestroy():该方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。使得Activity销毁。

 onRestart():该方法在Activity由停止状态变为运行状态之前调用。也就是Activity被重新启动了。

1.创建三个Activity:MainActivity , AActivity(普通的Activity) , BActivity(对话框式Activity)

怎么将 BActivity设成对话框式?在AndroidManifest.xml中的<.activity>标签中

  1. <activity android:name=".BActivity"
  2. android:theme="@style/Theme.AppCompat.Dialog">
  3. </activity>

通过android:theme="@style/Theme.AppCompat.Dialog"指定当前Activity主题为对话框式。

2.修改MainActivity的代码:

  1. package com.java.androidstudy;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.widget.Button;
  9.  
  10. public class MainActivity extends AppCompatActivity {
  11. private Button normal_btn;
  12. private Button dialog_btn;
  13. private String tag = "MainActivity";
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. Log.d(tag,"onCreate");
  19. setContentView(R.layout.activity_main);
  20. initView();
  21. normal_btn.setOnClickListener(new View.OnClickListener() {
  22. @Override
  23. public void onClick(View v) {
  24. Intent intent = new Intent(MainActivity.this,AActivity.class);
  25. startActivity(intent);
  26. }
  27. });
  28.  
  29. dialog_btn.setOnClickListener(new View.OnClickListener() {
  30. @Override
  31. public void onClick(View v) {
  32. Intent intent = new Intent(MainActivity.this,BActivity.class);
  33. startActivity(intent);
  34. }
  35. });
  36. }
  37.  
  38. private void initView(){
  39. normal_btn = findViewById(R.id.a_btn);
  40. dialog_btn = findViewById(R.id.b_btn);
  41. }
  42.  
  43. @Override
  44. protected void onStart() {
  45. super.onStart();
  46. Log.d(tag,"onStart()");
  47. }
  48.  
  49. @Override
  50. protected void onResume() {
  51. super.onResume();
  52. Log.d(tag,"onResume()");
  53. }
  54.  
  55. @Override
  56. protected void onPause() {
  57. super.onPause();
  58. Log.d(tag,"onPause()");
  59. }
  60.  
  61. @Override
  62. protected void onStop() {
  63. super.onStop();
  64. Log.d(tag,"onStop()");
  65. }
  66.  
  67. @Override
  68. protected void onDestroy() {
  69. super.onDestroy();
  70. Log.d(tag,"onDestroy()");
  71. }
  72.  
  73. @Override
  74. protected void onRestart() {
  75. super.onRestart();
  76. Log.d(tag,"onRestart()");
  77. }
  78.  
  79. }

点击运行后,如下图:

此刻观看日志:

可以发现当MainActivity第一次被创建时会依次执行onCreate(),onStart(),onResume()

点击第一个按钮:启动普通的Activity,这时会启动AActivity,该AActivity入栈,位于栈顶,会将MainActivity完全遮挡住,因此onPause() 和 onStop()都会得到执行。

查看日志:

依次执行了onPause() 和 onStop()

点击退出

之前被遮挡住的MainActivity此时处于停止状态,点击退出时,AActivity出栈,MainActivity重新处于栈顶,由停止状态变为运行时状态。所以先调用onRestart(),之后会依次执行onStart()和onResume()。注意,此时onCreate()方法不会执行,因为MainActivity没有重新创建。

点击第二个按钮:启动对话框式Activity。如下图:

观察日志:

此时只执行了onPause(),没有执行onStop()方法。这是因为对话框式的BActivity并没有完全遮挡住MainActivity,此时的MainActivity只是进入了暂停状态。(之前启动AActivity时,MainActivity进入了停止状态。),相应的,按下返回键,也只有onResume()方法会得到执行。如下:

最后在MainActivity界面按下返回键,此时日志信息如下:

依次执行onPause(),onStop(),onDestroy().销毁MainActivity.

具体实践:

1.onCreate()和onDestory()的使用

onCreate():第一次创建Activity的时候调用

onDestory():销毁Activity的时候调用

  修改MainActivity的布局:添加两个输入。

现在的输入框,若是我输入到一半,突然退出,再次进入就要重新输入。但是我不想那么麻烦,我希望输入框能自动显示上次退出前的内容。

分析:在Activity销毁前将输入框中的内容保存,再次启动Activity时将保存的内容显示到输入框。(l类似于记住密码功能)

Activity销毁前保存数据:需要在onDestroy()中操作

Activity再次启动时显示数据:需要在onCreate中操作

代码如下:

  1. package com.java.androidstudy;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.content.Intent;
  5. import android.content.SharedPreferences;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.EditText;
  11.  
  12. public class MainActivity extends AppCompatActivity {
  13. private Button normal_btn;
  14. private Button dialog_btn;
  15. private String tag = "MainActivity";
  16. private EditText user;
  17. private EditText password;
  18.  
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. Log.d(tag,"onCreate");
  23. setContentView(R.layout.activity_main);
  24. initView();
  25. displayinfo();
  26.  
  27. }
  28.  
  29. private void initView(){
  30. normal_btn = findViewById(R.id.a_btn);
  31. dialog_btn = findViewById(R.id.b_btn);
  32. user = findViewById(R.id.user);
  33. password = findViewById(R.id.password);
  34. }
  35.  
  36. private void displayinfo(){
  37. String content_user = getSharedPreferences("myinfo",0).getString("user","");
  38. String content_pwd = getSharedPreferences("myinfo",0).getString("pwd","");
  39. user.setText(content_user);
  40. password.setText(content_pwd);
  41. }
  42.  
  43. @Override
  44. protected void onStart() {
  45. super.onStart();
  46. Log.d(tag,"onStart()");
  47. }
  48.  
  49. @Override
  50. protected void onResume() {
  51. super.onResume();
  52. Log.d(tag,"onResume()");
  53. }
  54.  
  55. @Override
  56. protected void onPause() {
  57. super.onPause();
  58. Log.d(tag,"onPause()");
  59. }
  60.  
  61. @Override
  62. protected void onStop() {
  63. super.onStop();
  64. Log.d(tag,"onStop()");
  65. }
  66.  
  67. @Override
  68. protected void onDestroy() {
  69. super.onDestroy();
  70. Log.d(tag,"onDestroy()");
  71. //获取输入的内容
  72. String content_user = user.getText().toString();
  73. String content_password = password.getText().toString();
  74.  
  75. //使用SharedPerences存储数据
  76. SharedPreferences.Editor editor = getSharedPreferences("myinfo",0).edit();
  77. editor.putString("user",content_user);
  78. editor.putString("pwd",content_password);
  79. editor.apply();
  80. }
  81.  
  82. @Override
  83. protected void onRestart() {
  84. super.onRestart();
  85. Log.d(tag,"onRestart()");
  86. }
  87.  
  88. }

运行效果如下:

会自动将上次退出时的内容显示出来。

2.onStart()和onStop的使用

onStart():此时可见,没有焦点,也就是不可以进行操作

onStop():此时不可见。没有焦点

  1. package com.java.androidstudy;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4.  
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.TextView;
  10. /*
  11. 有这样一个需求:当正在看电影的时候,突然打来电话,如果接听电话,而电影也在播放,杂音十分影响使用感。
            现在需要接听电话时电影自动暂停,挂断电话后电影继续播放。
  12. 分析:接电话时会依次执行onPause()和onStop()方法,所以我们可以在onStop()方法中暂停电影
  13. 挂断电话回答该界面时会依次执行onRestart(),onStart(),onResume。我们可以在onStart()中继续播放电影
  14. */
  15. public class AActivity extends AppCompatActivity {
  16.  
  17. private static final String TGA = "AActivity";
  18. private TextView play;
  19. private Button play_control;
  20. private boolean isPlay = false;
  21. private boolean isStopAtAmin = false;//是否是因为生命周期的变化而主动停止的
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_a);
  26. Log.d(TGA,"onCreate");
  27. initView();
  28. initListener();
  29. }
  30.  
  31. private void initView() {
  32. play = findViewById(R.id.play);
  33. play_control = findViewById(R.id.play_control);
  34. }
  35.  
  36. private void initListener(){
  37. play_control.setOnClickListener(new View.OnClickListener() {
  38. @Override
  39. public void onClick(View v) {
  40. if(isPlay){//如果当前状态是播放的,点击该按钮后就暂停播放,并将按钮上的文字显示为播放
  41. stop();
  42. }else { //如果当前状态是暂停的,点击该按钮后变为播放状态,并将按钮上的文字显示为暂停
  43. play();
  44. }
  45. }
  46. });
  47. }
  48.  
  49. private void stop() {
  50. Log.d(TGA,"暂停电影");
  51. play.setText("电影已经暂停!!!");
  52. play_control.setText("播放");
  53. isPlay = false;
  54. }
  55.  
  56. private void play() {
  57. Log.d(TGA,"播放电影");
  58. play.setText("正在播放电影!!!");
  59. play_control.setText("暂停");
  60. isPlay = true;
  61. }
  62.  
  63. @Override
  64. protected void onStart() {
  65. super.onStart();
  66. Log.d(TGA,"onStart()");
  67. if (isStopAtAmin){ //如果是因为生命周期结束停止的,在重新回到栈顶时播放电影
  68. play();
  69. isStopAtAmin = false;
  70. }
  71. }
  72.  
  73. @Override
  74. protected void onStop() {
  75. super.onStop();
  76. Log.d(TGA,"onStop() ");
  77. if (isPlay){//如果当前是播放的,那么我们需要将这个电影停掉。
  78. stop();
  79. isStopAtAmin = true;
  80. }
  81. }
  82.  
  83. @Override
  84. protected void onResume() {
  85. super.onResume();
  86. Log.d(TGA,"onResume()");
  87. }
  88.  
  89. @Override
  90. protected void onPause() {
  91. super.onPause();
  92. Log.d(TGA,"onPause()");
  93. }
  94.  
  95. @Override
  96. protected void onRestart() {
  97. super.onRestart();
  98. Log.d(TGA,"onRestart()");
  99. }
  100.  
  101. @Override
  102. protected void onDestroy() {
  103. super.onDestroy();
  104. Log.d(TGA,"onDestroy()");
  105. }
  106. }

运行如下:

点击播放电影:

此刻接听电话:右下图,可以发现依次执行了onPause(),onStop()。然后暂停电影

此刻挂断电话:可以看到依次执行了onRestart(),onStart(),onResume()。并在start()方法中自动播放电影。

 3.onResume() 和 onPause()

onResume():onstart()可见之后在这里获取到焦点,可以进行操作。

onPause():失去焦点,不可以操作。

当从FirstActivity跳转到SecondActivity后,SecondActivity至于栈顶处于可见状态,而FirstActivity进入停止状态(如果SecondActivity是对话框式的Activity,则FirstActivity进入暂停状态),在SecondActivity界面点击返回键后,SecondActivity出栈(销毁),这时FirstActivity重新处于栈顶,执行onRestart()方法,再依次执行 onStart(),onResume()。

注意:这里不止对话框式Activity(透明主题也可以),只要FirstActivity仍然可见,就不会执行onStop()方法使之进入停止状态(该状态不可见),而是只执行onPasue()方法使之进入暂定状态(该状态失去焦点,不可点击)

代码:

  1. package com.java.androidstudy;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4.  
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.widget.Button;
  10.  
  11. public class FirstActivity extends AppCompatActivity {
  12. private static final String TGA = "FirstActivity";
  13. private Button btn_first;
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_b);
  19. Log.d(TGA,"onCreate");
  20. initView();
  21. initListener();
  22. }
  23.  
  24. private void initListener() {
  25. btn_first.setOnClickListener(new View.OnClickListener() {
  26. @Override
  27. public void onClick(View v) {
  28. Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
  29. startActivity(intent);
  30. }
  31. });
  32. }
  33.  
  34. private void initView() {
  35. btn_first = findViewById(R.id.btn_first);
  36. }
  37.  
  38. @Override
  39. protected void onStart() {
  40. super.onStart();
  41. Log.d(TGA,"onStart()");
  42. }
  43.  
  44. @Override
  45. protected void onStop() {
  46. super.onStop();
  47. Log.d(TGA,"onStop() ");
  48. }
  49.  
  50. @Override
  51. protected void onResume() {
  52. super.onResume();
  53. Log.d(TGA,"onResume()");
  54. }
  55.  
  56. @Override
  57. protected void onPause() {
  58. super.onPause();
  59. Log.d(TGA,"onPause()");
  60. }
  61.  
  62. @Override
  63. protected void onRestart() {
  64. super.onRestart();
  65. Log.d(TGA,"onRestart()");
  66. }
  67.  
  68. @Override
  69. protected void onDestroy() {
  70. super.onDestroy();
  71. Log.d(TGA,"onDestroy()");
  72. }
  73. }

然后将SecondActivity的主题改成透明主题:

  1. <activity android:name=".SecondActivity"
  2. android:theme="@android:style/Theme.Translucent">
  3. </activity>

运行效果:

点击按钮后:

可以看到第二个页面弹出来了,但是第一个页面仍然可见,只是失去了焦点,不能点击。

看看日志:

FirstActivity只是进入了暂停状态,失去焦点。

点击返回键,使得SecondActivity销毁。查看日志:

这时FirstActivity重新进入栈顶,获取焦点。

横竖屏切换Activity生命周期的变化

MainActivity:

  1. package com.java.androidstudy;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6.  
  7. public class MainActivity extends AppCompatActivity {
  8. private String tag = "MainActivity";
  9.  
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. Log.d(tag,"onCreate");
  14. setContentView(R.layout.activity_main);
  15. }
  16.  
  17. @Override
  18. protected void onStart() {
  19. super.onStart();
  20. Log.d(tag,"onStart()");
  21. }
  22.  
  23. @Override
  24. protected void onResume() {
  25. super.onResume();
  26. Log.d(tag,"onResume()");
  27. }
  28.  
  29. @Override
  30. protected void onPause() {
  31. super.onPause();
  32. Log.d(tag,"onPause()");
  33. }
  34.  
  35. @Override
  36. protected void onStop() {
  37. super.onStop();
  38. Log.d(tag,"onStop()");
  39. }
  40.  
  41. @Override
  42. protected void onDestroy() {
  43. super.onDestroy();
  44. Log.d(tag,"onDestroy()");
  45. }
  46.  
  47. @Override
  48. protected void onRestart() {
  49. super.onRestart();
  50. Log.d(tag,"onRestart()");
  51. }
  52.  
  53. }

运行后:

查看日志:

现在旋转成横屏:

再来看看完整的生命周期变化:

红框内的为横屏后的变化。

可以看到:在点击横屏后,是先将原Activity销魂,再创建新的Activity

再将其从横屏切换为竖屏:

与竖屏切换横屏一样,都会先销毁Activity再重新创建。

横竖屏切换的问题:

如:将看到一半的电影切换成横屏,因为切换后是创建新的Activity,所以会造成进度条清零,需要手动去拉进度条,这种体验无疑是极差的

如:

  1. package com.java.androidstudy;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.widget.SeekBar;
  7.  
  8. public class MainActivity extends AppCompatActivity {
  9. private String tag = "MainActivity";
  10. private SeekBar progress;
  11.  
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. Log.d(tag,"onCreate");
  16. setContentView(R.layout.activity_main);
  17. initView();
  18.  
  19. }
  20.  
  21. private void initView() {
  22. progress = findViewById(R.id.progress);
  23. progress.setMax(100);
  24. progress.post(new Runnable() {
  25. @Override
  26. public void run() {
  27. progress.setProgress(0); //每次初始化的时候进度条清零
  28. }
  29. });
  30. }
  31.  
  32. @Override
  33. protected void onStart() {
  34. super.onStart();
  35. Log.d(tag,"onStart()");
  36. }
  37.  
  38. @Override
  39. protected void onResume() {
  40. super.onResume();
  41. Log.d(tag,"onResume()");
  42. }
  43.  
  44. @Override
  45. protected void onPause() {
  46. super.onPause();
  47. Log.d(tag,"onPause()");
  48. }
  49.  
  50. @Override
  51. protected void onStop() {
  52. super.onStop();
  53. Log.d(tag,"onStop()");
  54. }
  55.  
  56. @Override
  57. protected void onDestroy() {
  58. super.onDestroy();
  59. Log.d(tag,"onDestroy()");
  60. }
  61.  
  62. @Override
  63. protected void onRestart() {
  64. super.onRestart();
  65. Log.d(tag,"onRestart()");
  66. }
  67.  
  68. }

切换前:

此时进度条到一半。

切换成横屏:

可以看见进度条自动清零了。

怎么解决:

第一种:禁止屏幕旋转,指定屏幕方向。(适合只有一种屏幕状态的应用开发配置)

  1. <activity android:name=".MainActivity"
  2. android:screenOrientation="landscape">
  3. <intent-filter>
  4. <action android:name="android.intent.action.MAIN" />
  5. <category android:name="android.intent.category.LAUNCHER" />
  6. </intent-filter>
  7. </activity>
  1. android:screenOrientation="landscape" //指定为横屏
  1. android:screenOrientation="portrait" //指定为竖屏

    这样指定后的横竖屏切换不会销毁原来的Activity再创建新的Activity

    第二种:设置配置信息改变不影响。(适合有两种/多种屏幕状态的应用开发,如:视频播放器)
  1. <activity android:name=".MainActivity"
  2. android:configChanges="keyboardHidden|screenSize|orientation">
  3. <intent-filter>
  4. <action android:name="android.intent.action.MAIN" />
  5. <category android:name="android.intent.category.LAUNCHER" />
  6. </intent-filter>
  7. </activity>
  1. android:configChanges="keyboardHidden|screenSize|orientation" //对键盘隐藏,屏幕大小,屏幕方向都不敏感
    当其中一个发生变化时,生命周期不受影响。

Android四大组件——Activity——Activity的生命周期的更多相关文章

  1. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  2. Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)

                如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com   ...

  3. 【Android开发日记】之入门篇(四)——Android四大组件之Activity

    在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...

  4. Android四大组件之Activity(活动)及其布局的创建与加载布局

    Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...

  5. Android 四大组件之Activity生命周期

    写这篇博文之前,已经对android有一定的了解和认识.这篇博文主要讲述android的Activity的生命周期,这是android开发者必须掌握的知识.android的Activity组件拥有7个 ...

  6. 深入剖析Android四大组件(一)——Activity生命周期具体解释

    1.管理Activity的生命周期 不管是正在执行的Activity还是没有执行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期. ①Activity的 ...

  7. Android 四大组件之 Activity(一)

    1.Activity的定义及作用: Android系统中的四大组件之一,可以用于显示View.Activity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的一个应用程序的组 ...

  8. Android 四大组件之 Activity(二)

    1.综述 Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满 ...

  9. Android四大组件及activity的四大启动模式

    Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...

  10. Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)

    什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...

随机推荐

  1. 网络传输中的各种加密算法+SSL+CA证书详解

    1. 数据传输分类 在互联网上数据传输有两种:明文传输和加密传输.明文传输的协议有:ftp.http.smtp.telnet.但是为了数据的完整性和安全性,所以后来引用了加密等相关手段来保证数据的安全 ...

  2. Material Design with the Android Design Support Library

    Material Design with the Android Design Support Library 原文http://www.sitepoint.com/material-design-a ...

  3. RPC框架 和 fegin原理

    打个比方,你有一些想法,你把他们变成文字写在信纸上,这是http 你把这个信纸塞进信封,这个信封是tcp 你把这个信封写上地址交给邮局,这地址是IP 一层套一层 会话层,表示层,应用层归到一起  就是 ...

  4. HashMap?ConcurrentHashMap?

    Java团长在csdn 2019-02-06 19:58:00  104241  收藏 666     来源:crossoverJie(ID:crossoverJie) 前言 Map 这样的 Key ...

  5. java常见面试问题总结

    JDK1.7 并发的HashMap为什么会引起死循环? hashmap如何解决hash冲突,为什么hashmap中的链表需要转成红黑树? hashmap什么时候会触发扩容? jdk1.8之前并发操作h ...

  6. Collection和 Collections的区别?

    Collection是集合类的上级接口,继承与他的接口主要有Set和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作.

  7. int 和 Integer 有什么区别?

    Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本 数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本 数据类型都引入了对应的包装类型(wrappe ...

  8. CAS 的问题 ?

    1.CAS 容易造成 ABA 问题 一个线程 a 将数值改成了 b,接着又改成了 a,此时 CAS 认为是没有变化,其实 是已经变化过了,而这个问题的解决方案可以使用版本号标识,每操作一次 versi ...

  9. memcached 的多线程是什么?如何使用它们?

    线程就是定律(threads rule)!在 Steven Grimm 和 Facebook 的努力下, memcached 1.2 及更高版本拥有了多线程模式.多线程模式允许 memcached 能 ...

  10. SSM-learning

    架构流程图: 第一步:建立spring框架: 包括:建立所需要的dao层,sevice层和controller层和实体类,建立spring配置文件,配置自动扫描bean AccountDao: @Re ...