java - LinkedHashSet 不主要插入顺序吗?

标签 java android sharedpreferences hashset linkedhashset

我目前正在构建一个 Android 应用程序,在其中显示名人的名言。我有一个主屏幕和另外两个屏幕,其中我显示所有引言,另一个屏幕显示我最喜欢的引言。

因此,当我在 AllQuotesActivity 屏幕上点击“赞”按钮时,引用和作者将保存在 LinkedHashSet 中,该 LinkedHashSet 将保存在 SharedPreferences 中,因此我的 FavouriteQuotes Activity 可以获得数据。我可以获得数据,但是数据是混合的,尽管其他链接说 LinkedHashSet 维护插入顺序。也许我做错了什么。以下是重要的代码 fragment :

AllQuotesActivity.java:

SharedPreferences sharedPref;
Set<String> set = new LinkedHashSet();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.all_quotes);

    Resources res = getResources();
    Context context = getApplicationContext();
    this.sharedPref = context.getSharedPreferences(
            "MyPref", Context.MODE_PRIVATE);
    final String[] quotesAndAuthors = res.getStringArray(R.array.quotes);

    button3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            set.add(quotesAndAuthors[counter]);
            set.add(quotesAndAuthors[counter + 1]);
        }
    });

}

@Override
public void onPause() {
    super.onPause();
    Log.d("RichQuotes", "Its paused mkay");

    Editor editor = sharedPref.edit();

    editor.putStringSet("quotesAndAuthors", this.set);
    editor.commit();
}

}

FavouriteQuotesActivity.java:

SharedPreferences sharedPref;
Set<String> set = new LinkedHashSet();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.favourite_quotes);

    Resources res = getResources();
    Context context = getApplicationContext();
    this.sharedPref = context.getSharedPreferences(
            "MyPref", Context.MODE_PRIVATE);

    set = sharedPref.getStringSet("quotesAndAuthors", null);

    for (Iterator<String> it = set.iterator(); it.hasNext(); ) {
        String s = it.next();
        Log.v("test", s);
    }

我删除了不必要的代码。

在 FavouriteQuotesActivity.java 中,我正在记录该集以检查其值。日志输出和屏幕上的输出是相同的,两者都以相同的方式未排序。

最佳答案

Set set = new LinkedHashSet();

在此行中,您实例化一个新的空 LinkedHashSet 对象。然后将该对象分配给名为 set 的变量。

set = sharedPref.getStringSet("quotesAndAuthors", null);

在这一行中,您重新分配了 set 变量以指向某个其他对象,即调用 getStringSet 返回的某个 Set 对象。我们不知道实现 Set 接口(interface)的第二个对象的具体类。您可以通过调用getClass来询问。

您的第一个集合,即空的 LinkedHashSet,未使用。由于没有其他引用指向它,该集合成为最终垃圾收集的候选者。

关于java - LinkedHashSet 不主要插入顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59801957/

相关文章:

java - 垃圾收集的资格

java - 为什么将方法参数重新分配给局部变量?

java - java.nio.file.PathMatcher 线程安全吗?

android - Apprtc 与 PushNotificaiton

android - 没有相应的 commit() 或 apply() 调用的 SharedPreferences.edit()

java - Quarkus Main 方法可以在依赖项中定义吗?

android - 发布相同的应用程序但有两个版本

android - 基于android路径的自动旋转路径动画

java - 在 Android Studio 中使用 SharedPreferences 保存列表

flutter 错误 : A value of type 'Future<bool>' can't be assigned to a variable of type 'bool'