Android使用SharedPreferences(sp)存储基本数据类型、List集合、Map集合、对象都在这了

2023-11-05

基于一些小伙伴说在取出对象的时候出现null,这个问题可能是因为你的对象没有序列化的原因,如果存在内部类的也需要进行序列化。看下面的例子:

public class Test implements Serializable{
        //内部类
        public class Son implements Serializable{

            //外部对象嵌套
            private Son2 son;
        }
}
//Son2类也需要进行序列化
public class Son2 implements Serializable{}

Son内部类或者Son2也需要进行序列化。

给大家分享一个小小的工具类,直接可以拷来用。有些什么不足的地方可以提一下意见哦。

版本1:

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.text.TextUtils;
import android.util.Base64;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class SpUtil {

    private static SharedPreferences sp;

    private static SharedPreferences getSp(Context context) {
        if (sp == null) {
            sp = context.getSharedPreferences("SpUtil", Context.MODE_PRIVATE);
        }
        return sp;
    }


    /**
     * 存入字符串
     *
     * @param context 上下文
     * @param key     字符串的键
     * @param value   字符串的值
     */
    public static void putString(Context context, String key, String value) {
        SharedPreferences preferences = getSp(context);
        //存入数据
        Editor editor = preferences.edit();
        editor.putString(key, value);
        editor.commit();
    }

    /**
     * 获取字符串
     *
     * @param context 上下文
     * @param key     字符串的键
     * @return 得到的字符串
     */
    public static String getString(Context context, String key) {
        SharedPreferences preferences = getSp(context);
        return preferences.getString(key, "");
    }

    /**
     * 获取字符串
     *
     * @param context 上下文
     * @param key     字符串的键
     * @param value   字符串的默认值
     * @return 得到的字符串
     */
    public static String getString(Context context, String key, String value) {
        SharedPreferences preferences = getSp(context);
        return preferences.getString(key, value);
    }

    /**
     * 保存布尔值
     *
     * @param context 上下文
     * @param key     键
     * @param value   值
     */
    public static void putBoolean(Context context, String key, boolean value) {
        SharedPreferences sp     = getSp(context);
        Editor            editor = sp.edit();
        editor.putBoolean(key, value);
        editor.commit();
    }

    /**
     * 获取布尔值
     *
     * @param context  上下文
     * @param key      键
     * @param defValue 默认值
     * @return 返回保存的值
     */
    public static boolean getBoolean(Context context, String key, boolean defValue) {
        SharedPreferences sp = getSp(context);
        return sp.getBoolean(key, defValue);
    }

    /**
     * 保存long值
     *
     * @param context 上下文
     * @param key     键
     * @param value   值
     */
    public static void putLong(Context context, String key, long value) {
        SharedPreferences sp     = getSp(context);
        Editor            editor = sp.edit();
        editor.putLong(key, value);
        editor.commit();
    }

    /**
     * 获取long值
     *
     * @param context  上下文
     * @param key      键
     * @param defValue 默认值
     * @return 保存的值
     */
    public static long getLong(Context context, String key, long defValue) {
        SharedPreferences sp = getSp(context);
        return sp.getLong(key, defValue);
    }

    /**
     * 保存int值
     *
     * @param context 上下文
     * @param key     键
     * @param value   值
     */
    public static void putInt(Context context, String key, int value) {
        SharedPreferences sp     = getSp(context);
        Editor            editor = sp.edit();
        editor.putInt(key, value);
        editor.commit();
    }

    /**
     * 获取long值
     *
     * @param context  上下文
     * @param key      键
     * @param defValue 默认值
     * @return 保存的值
     */
    public static int getInt(Context context, String key, int defValue) {
        SharedPreferences sp = getSp(context);
        return sp.getInt(key, defValue);
    }

    /**
     * 保存对象
     *
     * @param context 上下文
     * @param key     键
     * @param obj     要保存的对象(Serializable的子类)
     * @param <T>     泛型定义
     */
    public static <T extends Serializable> void putObject(Context context, String key, T obj) {
        try {
            put(context, key, obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取对象
     *
     * @param context 上下文
     * @param key     键
     * @param <T>     指定泛型
     * @return 泛型对象
     */
    public static <T extends Serializable> T getObject(Context context, String key) {
        try {
            return (T) get(context, key);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 存储List集合
     * @param context 上下文
     * @param key 存储的键
     * @param list 存储的集合
     */
    public static void putList(Context context, String key, List<? extends Serializable> list) {
        try {
            put(context, key, list);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取List集合
     * @param context 上下文
     * @param key 键
     * @param <E> 指定泛型
     * @return List集合
     */
    public static <E extends Serializable> List<E> getList(Context context, String key) {
        try {
            return (List<E>) get(context, key);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 存储Map集合
     * @param context 上下文
     * @param key 键
     * @param map 存储的集合
     * @param <K> 指定Map的键
     * @param <V> 指定Map的值
     */
    public static <K extends Serializable, V extends Serializable> void putMap(Context context,
            String key, Map<K, V> map)
    {
        try {
            put(context, key, map);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static <K extends Serializable, V extends Serializable> Map<K, V> getMap(Context context,
            String key)
    {
        try {
            return (Map<K, V>) get(context, key);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**存储对象*/
    private static void put(Context context, String key, Object obj)
            throws IOException
    {
        if (obj == null) {//判断对象是否为空
            return;
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream    oos  = null;
        oos = new ObjectOutputStream(baos);
        oos.writeObject(obj);
        // 将对象放到OutputStream中
        // 将对象转换成byte数组,并将其进行base64编码
        String objectStr = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
        baos.close();
        oos.close();

        putString(context, key, objectStr);
    }

    /**获取对象*/
    private static Object get(Context context, String key)
            throws IOException, ClassNotFoundException
    {
        String wordBase64 = getString(context, key);
        // 将base64格式字符串还原成byte数组
        if (TextUtils.isEmpty(wordBase64)) { //不可少,否则在下面会报java.io.StreamCorruptedException
            return null;
        }
        byte[]               objBytes = Base64.decode(wordBase64.getBytes(), Base64.DEFAULT);
        ByteArrayInputStream bais     = new ByteArrayInputStream(objBytes);
        ObjectInputStream    ois      = new ObjectInputStream(bais);
        // 将byte数组转换成product对象
        Object obj = ois.readObject();
        bais.close();
        ois.close();
        return obj;
    }
}

版本2:(由于Context传得太多,比较麻烦,进行了一些更改。这个工具类需要先调用init方法进行初始化,初始化的时候可以给定文件名称)

import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.text.TextUtils;
import android.util.Base64;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

/**SharedPreferences工具类,需要先调用init进行初始化*/
public final class SpUtil {

    private static SharedPreferences sp = null;

    /**初始化SpUtil工具类
     * @param application 用于获取上下文
     * @param spName 设置SharedPreferences文件名(不用添加后缀),默认名称:SpUtil.xml*/
    public static void init(@NonNull Application application, String spName) {
        if (sp == null) {
            sp = application.getApplicationContext().getSharedPreferences(
                    TextUtils.isEmpty(spName) ? "SpUtil" : spName, Context.MODE_PRIVATE);
        }
    }

    /**
     * 存入字符串
     * @param key     字符串的键
     * @param value   字符串的值
     */
    @SuppressLint("ApplySharedPref")
    public static void putString(String key, String value) {
        //存入数据
        Editor editor = sp.edit();
        editor.putString(key, value);
        editor.commit();
    }

    /**
     * 获取字符串
     * @param key     字符串的键
     * @return 得到的字符串
     */
    public static String getString(String key) {return getString(key, "");}

    /**
     * 获取字符串
     * @param key     字符串的键
     * @param defValue   字符串的默认值
     * @return 得到的字符串
     */
    public static String getString(String key, String defValue)
    {return sp.getString(key, defValue);}

    /**
     * 保存布尔值
     * @param key     键
     * @param value   值
     */
    @SuppressLint("ApplySharedPref")
    public static void putBoolean(String key, boolean value) {
        Editor editor = sp.edit();
        editor.putBoolean(key, value);
        editor.commit();
    }

    /**
     * 获取布尔值
     * @param key      键
     * @param defValue 默认值
     * @return 返回保存的值
     */
    public static boolean getBoolean(String key, boolean defValue)
    {return sp.getBoolean(key, defValue);}

    /**
     * 保存long值
     * @param key     键
     * @param value   值
     */
    @SuppressLint("ApplySharedPref")
    public static void putLong(String key, long value) {
        Editor editor = sp.edit();
        editor.putLong(key, value);
        editor.commit();
    }

    /**
     * 获取long值
     * @param key      键
     * @param defValue 默认值
     * @return 保存的值
     */
    public static long getLong(String key, long defValue) {return sp.getLong(key, defValue);}

    /**
     * 保存int值
     * @param key     键
     * @param value   值
     */
    @SuppressLint("ApplySharedPref")
    public static void putInt(String key, int value) {
        Editor editor = sp.edit();
        editor.putInt(key, value);
        editor.commit();
    }

    /**
     * 获取int值
     * @param key      键
     * @param defValue 默认值
     * @return 保存的值
     */
    public static int getInt(String key, int defValue) {return sp.getInt(key, defValue);}

    /**
     * 保存对象
     * @param key     键
     * @param obj     要保存的对象(Serializable的子类)
     * @param <T>     泛型定义
     */
    public static <T extends Serializable> void putObject(String key, T obj)
    {
        if (obj == null) {
            putString(key, "");
            return;
        }
        putString(key, obj2Base64(obj));
    }

    /**
     * 获取对象
     * @param key     键
     * @param <T>     指定泛型
     * @return 泛型对象
     */
    @Nullable
    public static <T extends Serializable> T getObject(String key)
    { return base64ToObj(getString(key));}

    /**
     * 存储List集合
     * @param key 存储的键
     * @param list 存储的集合
     */
    public static void putList(String key, List<? extends Serializable> list)
    {putString(key, obj2Base64(list));}

    /**
     * 获取List集合
     * @param key 键
     * @param <E> 指定泛型
     * @return List集合
     */
    @Nullable
    public static <E extends Serializable> List<E> getList(String key)
    {return (List<E>) base64ToObj(getString(key));}

    /**
     * 存储Map集合
     * @param key 键
     * @param map 存储的集合
     * @param <K> 指定Map的键
     * @param <V> 指定Map的值
     */
    public static <K extends Serializable, V> void putMap(String key, Map<K, V> map)
    {putString(key, obj2Base64(map));}

    /**
     * 获取map集合
     * @param key 键
     * @param <K> 指定Map的键
     * @param <V> 指定Map的值
     * @return 存储的集合
     */
    @Nullable
    public static <K extends Serializable, V> Map<K, V> getMap(String key)
    {return (Map<K, V>) base64ToObj(getString(key));}

    /**
     * 对象转字符串
     * @param obj 任意对象
     * @return base64字符串
     */
    private static String obj2Base64(Object obj) {
        //判断对象是否为空
        if (obj == null) {return null;}
        ByteArrayOutputStream baos      = null;
        ObjectOutputStream    oos       = null;
        String                objectStr = null;
        try {
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
            oos.writeObject(obj);
            // 将对象放到OutputStream中
            // 将对象转换成byte数组,并将其进行base64编码
            objectStr = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
        } catch (Exception e) {e.printStackTrace();} finally {
            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {e.printStackTrace();}
            }
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {e.printStackTrace();}
            }
        }
        return objectStr;
    }

    /**
     * base64转对象
     * @param base64 字符串
     * @param <T> 指定转成的类型
     * @return 指定类型对象 失败返回null
     */
    private static <T> T base64ToObj(String base64) {
        // 将base64格式字符串还原成byte数组
        if (TextUtils.isEmpty(base64)) {return null;}
        byte[]               objBytes = Base64.decode(base64.getBytes(), Base64.DEFAULT);
        ByteArrayInputStream bais     = null;
        ObjectInputStream    ois      = null;
        T                    t        = null;
        try {
            bais = new ByteArrayInputStream(objBytes);
            ois = new ObjectInputStream(bais);
            t = (T) ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bais != null) {
                try {
                    bais.close();
                } catch (IOException e) {e.printStackTrace();}
            }
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {e.printStackTrace();}
            }
        }
        return t;
    }

    /**
     * 移除字符串
     * @param key     字符串的键
     */
    public static void removeByKey(String key) {
        Editor editor = sp.edit();
        editor.remove(key);
        editor.apply();
    }
}

有疑问可以发邮件到我邮箱:binary_56@foxmail.com

转载时请标明出处,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android使用SharedPreferences(sp)存储基本数据类型、List集合、Map集合、对象都在这了 的相关文章

  • Android:共享首选项不保存按钮的状态

    我有一个包含三个活动的选项卡主机 并且在每个活动中都有按钮 每次按下按钮时 我都会更改背景可绘制资源 那么现在如何保存所有三个子活动中每个按钮的按下状态 以便当我从一个活动移动到另一个活动时 按钮的按下状态将反映在向后移动时 第一个活动 g
  • 使用共享首选项包来存储用户最喜欢的项目,但它不起作用

    这是用户选择一个项目作为最爱的地方 class ItemCard extends StatefulWidget ValueKey key ItemCard this key super key key override State
  • 如何从 Android 中的 PreferenceActivity 获取 SharedPreferences?

    我正在使用 PreferenceActivity 来显示我的应用程序的一些设置 我通过 xml 文件扩充设置 以便我的 onCreate 和完整的类方法 如下所示 public class FooActivity extends Prefe
  • Android M 奇怪的共享首选项问题

    在我运行 Android M 开发者预览版 2 的 Nexus 5 上 卸载 重新安装应用程序时 设备正在检索我很久以前存储的共享首选项 例如布尔值isFirstLaunch 清除这些的唯一方法是从设备设置中手动执行此操作 Android
  • 静态 Linkedhashmap 还是 Sharedpreference?

    Android 应用程序具有两种在活动之间传递数据的解决方案 请不要意图额外 public class A public static LinkedHashMap
  • android 卸载应用程序后保留数据库

    我正在开发 sq lite 数据库 可以在其中找到三星设备中的问题 当我卸载应用程序时 Android 操作系统会保留导致数据库版本冲突的数据库 以前我使用版本 2 现在我使用版本 1 作为参数sqllitehelper构造函数 按照惯例
  • 如何从 Android 中的应用程序中删除共享首选项数据

    如何删除我的应用程序的 SharedPreferences 数据 我正在创建一个使用大量 Web 服务来同步数据的应用程序 出于测试目的 我需要在重新启动应用程序时清除一些 SharedPreferences 值 要删除特定值 Shared
  • Android 如何从 SharedPreference 设置 EditTextPreference 的默认值?

    这次在同一个项目中 我面临一个稍微具有挑战性的问题 在 res xml 文件夹中的 settings xml 文件中
  • 无法让 onSharedPreferenceChanged() 工作

    当用户从我的首选项活动中的列表首选项中选择特定项目时 我想显示一个对话框 但是 我无法让 onSharedPreferenceChanged 工作 我在方法的开头放了一个Toast 但它没有显示 所以方法根本没有运行完 这是为什么 这是我的
  • 处理 appwidget 的多个实例

    我有一个配置活动 一个大型小部件提供程序和一个小型小部件提供程序 在配置活动中 我在共享首选项中保存了一些值 我从大大小小的应用程序小部件提供商那里获得了这些共享的偏好 我无法为应用程序小部件提供唯一的 ID 并且每次从配置活动转到应用程序
  • 在 Android 游戏中保存高分 - 共享首选项

    最近我正在开发一个简单的android游戏 对于评分部分 我在许多网站上都提到共享偏好最能保存高分 现在 如果我需要保存游戏中不同关卡的高分该怎么办 我希望保存每个级别的前三名得分手的得分 要保存您的分数 您可以执行以下操作 prepare
  • 当应用程序强制关闭或设备重新启动时,共享首选项会重置数据

    我正在开发一个在其中存储的应用程序username and password in SharedPreferences 一切对我来说都工作正常 存储和检索值 但我发现 当我重新启动设备或应用程序被强制关闭时 存储在SharedPrefere
  • 如何强制小数点后两位数

    我有以下 TextView 它始终显示 0 00 除非在单击按钮并保存到此 TextView 后完成任何计算
  • 如何保存单选按钮状态

    我正在开发Android应用程序 其中我打开自己的自定义对话框 当我选择单选按钮时 我使用单选按钮 毫无疑问它被选中并工作 但是当我再次打开对话框时 所有单选按钮都被取消选择 我想保存上一个按钮的状态 enter code here pri
  • 将 uri 保存到共享首选项并使用媒体播放器播放

    这是我用来将 Uri 的字符串表示形式保存到 SharedPreferences 的代码 public void onActivityResult int requestCode int resultCode Intent data sup
  • 如何实现加密的共享偏好设置

    如何在我的 android java 应用程序中实现加密的共享首选项https developer android google cn reference androidx security crypto EncryptedSharedPr
  • OnSharedPreferenceChangeListener 未调用 #2

    好吧 我开始从 Google 的 android 实现这个可怕的代码 未调用 OnSharedPreferenceChangeListener 这是我的代码 你能建议一下吗 类定义 private SharedPreferences sPr
  • Flutter - 每次应用程序重新启动后保留变量的值

    在我的一页上 我希望我的用户从一个变量上的默认文本开始 codeDialog 然后我希望他们更改该文本 之后他们编写的文本将成为我的新默认文本 遗憾的是我无法让它发挥作用 现在 当我重新启动应用程序并打开该屏幕时 它会重置为null 我认为
  • 如何使用 SharedPreferences 保存多个值?

    我正在开发一个字典应用程序 在我的应用程序中 我假设用户想要保存最喜欢的单词 我决定使用共享首选项保存这些值 我知道 SQLite 和文件更好 但我坚持使用 SharedPreferences 所以继续使用它 下面是我的代码 Overrid
  • 当首选项屏幕启动时,Android 应用程序立即崩溃

    我一直在为应用程序开发首选项屏幕 但我什至没有让它在崩溃之前显示屏幕 我已经检查了几个关于共享首选项的教程 我的代码与他们的类似 但没有任何效果 我认为问题出在我的preferences xml 文件中 因为我注释掉了除了Preferenc

随机推荐

  • Unity3D GUI学习

    Unity3D内置有GUI 首先 使用GUI实现一个按钮 并且点击实现触发 void OnGUI GUI Button new Rect 10 10 50 50 nihaoa if GUI Button new Rect 50 50 50
  • java后台下载附件_java 后台文件下载

    public static void download HttpServletRequest request HttpServletResponse response String filePath String displayName t
  • [Orangepi 3 LTS]学习记录(二)

    本章内容基于官方手册 OrangePi 3 LTS H6 用户手册 v2 4 与自己实际操作撰写 一 设置 linux 系统终端自动登录 1 root 用户自动登录终端 先输入下面的命令创建终端自动登录的配置文件 root orangepi
  • Java中的常用日志框架合集

    目录 一 日志的概念 1 1 日志文件 1 1 1 调试日志 1 1 2 系统日志 二 Java日志框架 2 1 JUL 2 1 1 架构介绍 2 1 2 使用与日志级别 2 1 3 日志的配置文件 2 1 4 原理解析 2 2 LOG4J
  • 学习笔记-贪心算法

    贪心算法 贪婪算法 贪心算法 是指在对问题进行求解时 在每一步选择中都采取最好或者最优 即最有利 的选择 从而希望能够导致结果是最好或者最优的算法 贪婪算法所得到的结果不一定是最优的结果 有时候会是最优解 但是都是相对近似 接近 最优解的结
  • NoNodeAvailableException[None of the configured nodes are available

    遇到以上错误的解决办法 Settings settings Settings settingsBuilder put cluster name clusterName put client transport sniff true buil
  • Groovy/Spock 测试导论

    测试对于软件开发者而言至关重要 不过总会有人说 写代码是我的事 测试那是QA的工作 这样的想法真是弱爆了 因为大量的业界实践已经证明测试驱动编码可以有效地帮助开发者提升代码质量 大多数遵循TDD的Java开发者均会使用mockito或pow
  • Ant Design Vue Table 组件 getCheckboxProps 事件

    Ant Design Vue Table 组件 getCheckboxProps 可选择事件 版本 实现效果 代码实现 版本 Ant Design Vue 版本 1 7 8 Vue 版本 2 X 实现效果 达到一定的条件 禁用某一行 不能勾
  • openGL之API学习(一八八)glVertexAttribPointer和glVertexPointer

    在之前的OpenGL版本里 每个属性都对应了一个特定的通道 我们使用glVertex glTexCoord glNormal 或者通过访问指针函数glVertexPointer glTexCoordPointer orglNormalPoi
  • 2022 SWPUCTF Web+Crypto方向wp

    文章目录 2022 SWPUCTF WP web 欢迎来到web安全 easy sql happy rce do not wakeup newnew baby pop happy php easy xss baby ssrf sql2 ph
  • 计算机图形学入门(十三)-光线追踪(基本原理)

    本部分主要介绍了光线追踪的基本原理 简述了光线追踪的实现过程 并对实现过程中第一步 求解射线与表面的交点的过程进行了全面的分析和解答 学习视频来源 GAMES101 现代计算机图形学入门 闫令琪 哔哩哔哩 bilibilihttps www
  • Spring的事务配置文件配置

  • 大数据毕设 - 深度学习植物识别系统(python OpenCV)

    文章目录 0 前言 2 相关技术 2 1 VGG Net模型 2 2 VGG Net在植物识别的优势 1 卷积核 池化核大小固定 2 特征提取更全面 3 网络训练误差收敛速度较快 3 VGG Net的搭建 3 1 Tornado简介 1 优
  • 213. House Robber II

    题目描述 每个房子有一定的钱 条件 不能偷相邻房子的钱 条件 第一个房子和最后一个房子相邻 围成一个圆形 也就是不能同时偷第一个房子和最后一个房子的钱 解题思路 如果抢劫第一家 则不可以抢最后一家 否则 可以抢最后一家 因此 这个问题就转化
  • Java——JavaWeb

    文章目录 1 Tomcat 1 1 安装Tomcat 1 2 Tomcat启动和配置 1 3 配置文件 2 HTTP 2 1 HTTP请求 2 2 HTTP响应 3 Maven 3 1 Maven项目架构管理工具 3 2 下载安装Maven
  • Dictionary用法总结

    说明 必须包含名空间System Collection Generic Dictionary里面的每一个元素都是一个键值对 由二个元素组成 键和值 键必须是唯一的 而值不需要唯一的 键和值都可以是任何类型 比如 string int 自定义
  • 嵌入式硬件 入门路线

    嵌入式硬件 入门路线 文章目录 嵌入式硬件 入门路线 前言 C语言 推荐学习方法 推荐资料 51单片机 学习51单片机的收获 推荐学习方法 推荐资料 学习成本 stm32单片机 前置知识需求 推荐学习法 推荐资料 学习线路推荐说明 学习成本
  • matlab的详细使用方法

    help命令 格式help 函数名 例 局部上 1 help plot 二维绘图 2 help elfun 基本函数 初等函数的帮助 3 help exp 指数函数的简单帮助 4 网页格式的帮助doc exp 5 Lookfor 模糊查询
  • vscode连接远程服务器+SFTP同步本地文件

    vscode连接远程服务器 SFTP同步本地文件 前言 准备工作 配置远程服务器 SFTP 前言 最近在做毕设 本来使用的是kaggle的gpu资源 但是上传数据 修改数据实在不方便 于是向实验室学长要了一个单卡服务器 下面介绍如何使用vs
  • Android使用SharedPreferences(sp)存储基本数据类型、List集合、Map集合、对象都在这了

    基于一些小伙伴说在取出对象的时候出现null 这个问题可能是因为你的对象没有序列化的原因 如果存在内部类的也需要进行序列化 看下面的例子 public class Test implements Serializable 内部类 publi