我正在进行查询以检索大量ID(整数).而不是通过ResultSet迭代数百万次并将所有内容一个一个地复制到ArrayList,有没有办法简单地将所有内容检索为ArrayList?
我理解ResultSet应该被迭代,因为底层实现可能是缓存内容,但在我的情况下,我只需要立即获取所有ID.我知道我可以将FetchSize设置为一个很大的数字,但是我仍然需要逐个检索ID.
澄清:我想这样做的原因是表现.分析告诉我,数百万次执行ResultSet.next(),ResultSet.getInt()和ArrayList.add()需要相当长的时间.我认为数据库(我使用H2,用Java编写)可能在内存中的某个地方有数组或列表,所以我正在寻找一种方法将它直接复制到我而不是通过ResultSet迭代接口.
我有一个我正在迭代几次的ArrayList,看起来它没有维持迭代的顺序.我看得更深,似乎为此迭代(由其他人)编写的自定义迭代器标记首先在ArrayList中传递并使用Arrays.asList在迭代之前将其桥接到Object []集合.迭代的顺序是否会丢失?是否与Arrays.asList一起预期?
编辑:
以下是操作对传递给iterator标记的原始集合的作用:
if(collection.getClass().isArray()) {
iterator = Arrays.asList((Object[]) collection).iterator();
} else if(collection instanceof Collection) {
iterator = ((Collection) collection).iterator();
} else if(collection instanceof Iterator) {
iterator = (Iterator) collection;
} else if(collection instanceof Map) {
iterator = ((Map) collection).entrySet().iterator();
}
Run Code Online (Sandbox Code Playgroud) 我有一个java ArrayList,我添加了5个对象.
如果我遍历列表并将其打印出来,则迭代列表并再次打印出来.
这两种情况下的检索顺序是否相同?(我知道它可能与插入顺序不同)
所以我在Java工作,我想声明一个通用的List.
所以我到目前为止所做的是 List<T> list = new ArrayList<T>();
但现在我想添加一个元素.我怎么做?通用元素是什么样的?
我尝试过像List.add("x")这样的东西,看看我是否可以添加一个字符串,但这不起作用.
(我没有声明a的原因List<String>是因为我必须将此List传递给另一个仅List<T>作为参数的函数.
我试图在两个活动之间传递一个对象的arraylist,但我的应用程序在第二个活动时崩溃.有人可以帮我解决这个问题......
这是我第一次活动的代码:
Intent i = new Intent();
Bundle b = new Bundle();
b.putParcelableArrayList("songs",(ArrayList<? extends Parcelable>) albumsArray.get(position).getSongs());
Log.v("--", "OK");
i.putExtras(b);
i.setClass(LatestAlbums.this, AlbumDetails.class);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
和第二个活动的代码:
songs=new ArrayList<Songs>();
Bundle b = this.getIntent().getExtras();
if(b!=null)
songs = b.getParcelable("songs");
Log.v("--", songs.size()+"");
Run Code Online (Sandbox Code Playgroud)
我的logcat输出:
04-03 16:37:03.513: E/AndroidRuntime(6576): FATAL EXCEPTION: main
04-03 16:37:03.513: E/AndroidRuntime(6576): java.lang.RuntimeException: Parcel: unable to marshal value com.musicapp.objects.Songs@419489e8
04-03 16:37:03.513: E/AndroidRuntime(6576): at android.os.Parcel.writeValue(Parcel.java:1137)
04-03 16:37:03.513: E/AndroidRuntime(6576): at android.os.Parcel.writeList(Parcel.java:524)
04-03 16:37:03.513: E/AndroidRuntime(6576): at android.os.Parcel.writeValue(Parcel.java:1097)
04-03 16:37:03.513: E/AndroidRuntime(6576): at android.os.Parcel.writeMapInternal(Parcel.java:493)
04-03 16:37:03.513: E/AndroidRuntime(6576): at android.os.Bundle.writeToParcel(Bundle.java:1612)
04-03 16:37:03.513: E/AndroidRuntime(6576): …Run Code Online (Sandbox Code Playgroud) android arraylist parcelable android-intent android-activity
假设我有一个ArrayList<Account>非常简单的自定义对象.例如:
class Account
{
public String Name;
public Integer Id;
}
Run Code Online (Sandbox Code Playgroud)
我想Account根据Id应用程序的许多部分中的参数检索特定对象.最好的办法是什么?
我想扩展,ArrayList但我相信必须有更好的方法.
我在Core Java I书中阅读了下面的代码片段.
将数组列表分配为 新的ArrayList <'Employee>(100)//容量为100
与新员工[100] //大小为100时分配新数组不同
数组列表的容量与数组的大小之间存在重要区别.如果您分配一个包含100个条目的数组,则该阵列有100个插槽,可供使用.容量为100个元素的数组列表有可能容纳100个元素(实际上,超过100个,以额外的重新分配为代价); 但是在开始时,即使在初始构造之后,数组列表也根本不包含任何元素.
当我看到源代码数组列表时,构造函数创建一个给定容量的Object数组,该数组已准备好容纳给定容量的元素(下面是代码片段).
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚作者在上面的文字中提到的实际差异.
Java(7,8)中用于消除彼此integer元素的最佳性能方法是什么Arraylist.所有元素在第一和第二列表中都是唯一的.
目前我知道API方法removeall并以这种方式使用它:
tempList.removeAll(tempList2);
Run Code Online (Sandbox Code Playgroud)
当我操作arraylists有超过10000个元素时出现问题.例如,当我删除65000个元素时,延迟似乎约为2秒.但我需要使用超过1000000个元素的更大的列表进行操作.
这个问题的策略是什么?
也许新的Stream API应该解决它?
假设我有一个带字符串键和整数值的HashMap:
map = {cat=1, kid=3, girl=3, adult=2, human=5, dog=2, boy=2}
Run Code Online (Sandbox Code Playgroud)
我想通过将此信息放入另一个HashMap来切换键和值.我知道HashMap不能有重复的键,因此我尝试将信息放入带有Integer的HashMap中,用于映射到String ArrayList的键,这样我就可以将一个Integer映射到多个字符串:
swap = {1=[cat], 2=[adult, dog, boy], 3=[kid, girl], 5=[human]}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码:
HashMap<Integer, ArrayList<String>> swap = new HashMap<Integer, ArrayList<String>>();
for (String x : map.keySet()) {
for (int i = 0; i <= 5; i++) {
ArrayList<String> list = new ArrayList<String>();
if (i == map.get(x)) {
list.add(x);
swap.put(i, list);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的代码唯一的区别是我没有将数字5硬编码到我的索引中; 我有一个方法,在原始的HashMap中找到最高的整数值并使用它.我知道它工作正常,因为我得到相同的输出,即使我在那里硬编码5,我只是没有包括它来节省空间.
我的目标是能够使用任何数据集进行"反转",否则我只能对值进行硬编码.我从上面的代码得到的输出是这样的:
swap = {1=[cat], 2=[boy], 3=[girl], 5=[human]}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我的问题是值ArrayList只保留放入其中的最后一个String,而不是收集所有String.如何使ArrayList存储每个String,而不仅仅是最后一个String?
我有一个值列表,其中一些可能是列表/集合或单个值.在JavaScript表示法中,它可能看起来像:
const input = [1,2,[3,4], [5,6], 7];
Run Code Online (Sandbox Code Playgroud)
我想得到:
const concatenated = [1,2,3,4,5,6,7];
Run Code Online (Sandbox Code Playgroud)
所以我有这个Java代码:
ArrayList<T> concatenated = new ArrayList<>();
for (T v : input) {
try{
concatenated.addAll((Collection) v);
}
catch (Exception e1){
try{
concatenated.addAll((List) v);
}
catch (Exception e2){
concatenated.add(v);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但那段代码对我来说似乎很糟糕.首先我不知道是否尝试强制转换为List或Collection是否足够 - 是否还有其他类型我应该尝试强制转换?有什么错误我不应该忽略吗?
怎么做对了?
arraylist ×10
java ×9
collections ×2
android ×1
arrays ×1
generics ×1
hashmap ×1
jdbc ×1
list ×1
object ×1
parcelable ×1
performance ×1
removeall ×1
resultset ×1