Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何提高arraylist的获取速度?_Java_Android_Listview_Arraylist_Android Contacts - Fatal编程技术网

Java 如何提高arraylist的获取速度?

Java 如何提高arraylist的获取速度?,java,android,listview,arraylist,android-contacts,Java,Android,Listview,Arraylist,Android Contacts,我正在使用Arraylist获取应用程序中的所有可用联系人。这是没有效率的,因为Arraylist需要很长时间才能获取和填充Listview,因为几乎有600多个联系人 我正在寻找一种性能更好的替代方法。 虽然我搜索了其他相关的问题,但我没有找到方便的问题 以下是我的java代码: private List<String> getContactList() { List<String> stringList=new ArrayList<>();

我正在使用
Arraylist
获取应用程序中的所有可用联系人。这是没有效率的,因为
Arraylist
需要很长时间才能获取和填充
Listview
,因为几乎有
600多个联系人

我正在寻找一种性能更好的替代方法。

虽然我搜索了其他相关的问题,但我没有找到方便的问题

以下是我的java代码:

private List<String> getContactList() {
      List<String> stringList=new ArrayList<>();
      ContentResolver cr = context.getContentResolver();
      Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
        null, null, null, null);

      if ((cur != null ? cur.getCount() : 0) > 0) {
        while (cur != null && cur.moveToNext()) {
          String id = cur.getString(
            cur.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur.getString(cur.getColumnIndex(
            ContactsContract.Contacts.DISPLAY_NAME)
          );

          if (cur.getInt(cur.getColumnIndex(
            ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {
              Cursor pCur = cr.query(                  
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null,
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                  new String[]{id}, null
               );

               while (pCur.moveToNext()) {
                 String phoneNo = pCur.getString(pCur.getColumnIndex(
                 ContactsContract.CommonDataKinds.Phone.NUMBER));                  
                 Log.v("Data : ",""+id+" "+name+" "+phoneNo);
                 stringList.add(id);
                 stringList.add(name);
                 stringList.add(phoneNo);
               }
               pCur.close();
             }
            }
          }
          if(cur!=null){
            cur.close();
          }
          return stringList;
        }   
private List getContactList(){
List stringList=新建ArrayList();
ContentResolver cr=context.getContentResolver();
Cursor cur=cr.query(Contacts contract.Contacts.CONTENT\u URI,
空,空,空,空);
如果((cur!=null?cur.getCount():0)>0){
while(cur!=null&&cur.moveToNext(){
字符串id=cur.getString(
cur.getColumnIndex(ContactsContract.Contacts.\u ID));
字符串名称=cur.getString(cur.getColumnIndex(
联系人contract.Contacts.DISPLAY\u NAME)
);
if(cur.getInt(cur.getColumnIndex(
Contacts contact.Contacts.HAS_PHONE_NUMBER))>0){
游标pCur=cr.query(
ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,
无效的
ContactsContract.CommonDataTypes.Phone.CONTACT_ID+“=?”,
新字符串[]{id},null
);
while(pCur.moveToNext()){
String phoneNo=pCur.getString(pCur.getColumnIndex(
Contacts contract.CommonDataTypes.Phone.NUMBER));
Log.v(“数据:”、“+id+”+name+”+phoneNo);
stringList.add(id);
stringList.add(名称);
stringList.add(电话号码);
}
pCur.close();
}
}
}
如果(cur!=null){
cur.close();
}
返回字符串列表;
}   

< /代码> 您可以考虑使用<代码>分页< /COD>库:

它的设计思想是一个列表只显示一定数量的项目,因此实际上没有必要加载比它可能显示的更多的内容。例如,ListView可能只显示10个联系人,因此不需要获取600个联系人


相反,当用户滚动时,分页库将获取较小的数据量,从而删除600个联系人的加载时间、600个联系人的内存等等。。。从而使它更有效率

< P>可以考虑使用<代码>分页< /COD>库:

它的设计思想是一个列表只显示一定数量的项目,因此实际上没有必要加载比它可能显示的更多的内容。例如,ListView可能只显示10个联系人,因此不需要获取600个联系人


相反,当用户滚动时,分页库将获取较小的数据量,从而删除600个联系人的加载时间、600个联系人的内存等等。。。从而使它更有效率

如果您担心速度,我会尝试使用Set,尽管ArrayList中有600多个联系人,这应该不会有问题。当数据集数以百万计时,这就成了一个问题。我将尝试查看您代码中的任何其他低效之处


就集合而言,两种最常见的Java数据结构是HashSet和TreeSet。如果要订购集合,请选择TreeSet。HashSet的速度稍微快一点,但在排序上会有损失。这两个都有O(1)个访问时间。

如果您担心速度,我会尝试使用Set,尽管ArrayList中有600多个联系人,这应该不会有问题。当数据集数以百万计时,这就成了一个问题。我将尝试查看您代码中的任何其他低效之处


就集合而言,两种最常见的Java数据结构是HashSet和TreeSet。如果要订购集合,请选择TreeSet。HashSet的速度稍微快一点,但在排序上会有损失。两者都有O(1)个访问时间。

您的查询效率很低,您当前对每个联系人进行的查询速度非常慢,您可以通过一个大查询(非常快)获得所有信息:


您的查询效率很低,您当前对每个联系人进行的查询速度非常慢,您可以通过一个大查询(非常快)获得所有信息:


ArrayList
在这里不是问题,它只是一个
集合
ContentResolver
查询需要时间,所以最好在工作线程上执行此操作。而且
ContentResolver
支持分页,因此您也可以逐页加载数据。请检查此-。它可能会对您有所帮助。请检查这是否可以解决您的查询,您的实际问题是从数组列表中提取联系人对象不是问题。
ArrayList
在这里不是问题,它只是一个
集合
ContentResolver
查询需要时间,所以最好在工作线程上执行此操作。而且
ContentResolver
支持分页,因此您也可以逐页加载数据。检查此-。可能会对您有所帮助。请检查这是否可以解决您的查询,您的实际问题是从数组列表中提取
联系人
对象不是问题。抱歉,我迟到了,我将尝试这种方法。抱歉,迟到了,我会这样做的。HashSet对我来说很明显。因为联系人应该按字母顺序排列。HashSet对我来说很明显。因为联系人应该按字母顺序排列。
String[] projection = new String[] { Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER };
Cursor c = cr.query(Phone.CONTENT_URI, projection, null, null, null);
while (c.moveToNext()) {
   long contactId = c.getLong(0);
   String name = c.getString(1);
   String phone = c.getString(2);
   Log.i("Phones", "got contact phone: " + contactId + " - " + name + " - " + phone);
}
c.close();