对于java.util.Collections.copy():列表List浅拷贝感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍javalist深拷贝,并为您提供关于'java.lang.NoC
对于java.util.Collections.copy ():列表 List 浅拷贝感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍java list深拷贝,并为您提供关于'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”、c# – 无法将类型’System.Collections.Generic.List>’隐式转换为’System.Collections.Generic.List、Collections.sort (list的有用信息。
本文目录一览:- java.util.Collections.copy ():列表 List 浅拷贝(java list深拷贝)
- 'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”
- c# – 无法将类型’System.Collections.Generic.List>’隐式转换为’System.Collections.Generic.List
- Collections.sort (list
- Collections.sort(List list) list排序学习笔记
java.util.Collections.copy ():列表 List 浅拷贝(java list深拷贝)
今天同事问我怎样将一个列表(list1)拷贝到另一个列表(list2),然后修改新的列表(list2)不会影响到旧的列表(list1),想了一想,这是深拷贝啊。
可是,除了循环 new 还有别的办法吗,想了又想,自己也是啥都不懂啊,赶紧百度学习一下,于是就找到了 java.util.Collections.copy (),一开始还以为这个是个深拷贝呢,没想到还是个浅拷贝。虽然还没找到深拷贝的方法去解决同事的问题,但还是要学习一下这个浅拷贝,毕竟也是有用滴。
先写个单元测试试一下:
@Test
public void testCollectionsCopy() {
List<String> srcList = new ArrayList<>();
srcList.add("张三");
srcList.add("李四");
srcList.add("王五");
List<String> descList = new ArrayList<>(3);
Collections.copy(descList, srcList);
for (String desc : descList) {
System.out.println(desc);
}
}
结果报错,悲剧了:java.lang.IndexOutOfBoundsException: Source does not fit in dest。下标越界啊。
赶紧看看 java.util.Collections.copy () 的源码压压惊。
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
int srcSize = src.size();
if (srcSize > dest.size())
throw new IndexOutOfBoundsException("Source does not fit in dest");
if (srcSize < COPY_THRESHOLD ||
(src instanceof RandomAccess && dest instanceof RandomAccess)) {
for (int i=0; i<srcSize; i++)
dest.set(i, src.get(i));
} else {
ListIterator<? super T> di=dest.listIterator();
ListIterator<? extends T> si=src.listIterator();
for (int i=0; i<srcSize; i++) {
di.next();
di.set(si.next());
}
}
}
通过看源码,发现这个方法是有目标数组和源数组的元素个数进行比较的操作,如果目标数组的元素个数小于源数组的元素个数,则抛出下标越界的异常。
可是我已经指定了 descList 的容量为 3 了呀!难道这个容量不等于实际元素个数吗?通过打印 descList.size () 才发现,descList 的实际元素个数为 0。这样我就知道,指定的 descList 容量为 3,只是指定了 descList 当前容纳的元素个数为 3,即 descList 的容纳能力(Capacity)为 3,并不代表 descList 中有了三个实际的元素。初始化时实际元素个数(Size)永远为 0,只有在进行 add () 和 remove () 等相关操作时,实际元素个数才会发生改变。
好吧,元凶找到了。只要给 descList 塞一些空对象就完事了。
@Test
public void testCollectionsCopy() {
List<String> srcList = new ArrayList<>();
srcList.add("张三");
srcList.add("李四");
srcList.add("王五");
List<String> descList = new ArrayList<>(3);
descList.add(null);
descList.add(null);
descList.add(null);
descList.add("赵六");
System.out.println(descList.size());
Collections.copy(descList, srcList);
for (String desc : descList) {
desc = desc + "是笨蛋";
System.out.println(desc);
}
}
这里可以发现,给 descList 指定容量好像并没有什么用,因为 ArrayList 是可变动态数组队列(底层实现是 Array 数组),长度会随着实际元素个数自动增大,那么到底是有什么用呢?(保留疑问,这个要看看 Java 的集合恶补一下知识啦,或者有没有大佬告诉我一下啊)
也可以中 JDK7 中新增加的方法 Array.asList () 来实现,即数组转 List。
@Test
public void testCollectionsCopy() {
List<String> srcList = new ArrayList<>();
srcList.add("张三");
srcList.add("李四");
srcList.add("王五");
List<String> descList = Arrays.asList(new String[srcList.size()]);
System.out.println(descList.size());
Collections.copy(descList, srcList);
for (String desc : descList) {
desc = desc + "是笨蛋";
System.out.println(desc);
}
}
其实也可以用 addAll ()。
@Test
public void testCollectionsCopy() {
List<String> srcList = new ArrayList<>();
srcList.add("张三");
srcList.add("李四");
srcList.add("王五");
List<String> descList = new ArrayList<>();
descList.addAll(srcList);
System.out.println(descList.size());
for (String desc : descList) {
desc = desc + "是笨蛋";
System.out.println(desc);
}
}
嘻嘻,就这些了,接着找找深拷贝的知识吧,顺便还要总结下浅拷贝和深拷贝的知识呢。
"愿你既可以安于朝九晚五,波澜不惊;又能随时出发,踏浪远航。"
'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”
如何解决''java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”?
我收到此错误,我已阅读该错误以解决它我必须将 import java.util.Base64
替换为 import android.util.Base64
但在我的整个项目中我只发现 Base68 result = Base64.getEncoder().encodetoString(macData);
的唯一用法
我该如何解决?而且我不能用 android.util.Base.64 替换 java.util.Base64 因为这行代码在后端
解决方法
这很不幸 - 这意味着您正在使用某个库,而那个库正在尝试使用 /i
。 Android 选择了 Java 库,就像 android 发布时一样,现在已经是很久以前的事了。从那以后它们就没有真正更新过。 (那个 oracle v google 法庭案件可能没有帮助……)
java.util.Base64
已添加到 https://forge.autodesk.com/en/docs/design-automation/v3/reference/cmdLine/cmdLine-inventor/(有关此信息,请参阅 javadoc 中的“since”行;任何“1.6”或以下,或者如果没有“since”行,肯定可用在 android 上。其他东西通常不是)。 java 8 现在已经 7 岁了,因此不是专门为 android 设计的库越来越有可能开始使用这些非 android 库调用。
检查堆栈跟踪,您会找到正在执行此操作的库。恐怕除了停止使用这个库之外别无他法。您可以尝试在您的应用程序中粘贴 juBase64 impl,但这会相对棘手,因为这可能涉及一些法律问题,因此,要么没有人这样做,要么如果他们这样做,他们可能不会宣传如何。
您可以要求这个库使用第三方库来做 base64 工作,但他们可能不想这样做,这可能不是库无法在 android 上运行的唯一问题。
如果 android 变体是一个替代品,你可以重写这个库的类文件,但这也是一个有点笨拙、笨拙的概念,并不完全困难,但因为这不是一件正常的事情,而且通常积极不喜欢,我认为您无法轻松找到有关如何操作的文档。
因此,建议:尝试寻找另一个图书馆。
c# – 无法将类型’System.Collections.Generic.List>’隐式转换为’System.Collections.Generic.List
ERROR: Cannot implicitly convert type
System.Collections.Generic.List<System.Collections.Generic.IEnumerable<ADCO.eJMC.EntityDataModel.ShareholderUser>>
toSystem.Collections.Generic.List<ADCO.eJMC.EntityDataModel.ShareholderUser>
我使用了以下代码
List<ShareholderUser> list = new List<ShareholderUser>(); list = dataContext.EJMCShareholderApprovals .Include(s => s.Shareholder.ShareholderUsers) .Where(e => e.EJMCRequestId == requestId) .Select(s => s.Shareholder.ShareholderUsers .Where(x => x.AccessMode == true)) .ToList();
@R_301_5609@
List<ShareholderUser> list = dataContext.EJMCShareholderApprovals .Where(e => e.EJMCRequestId == requestId) .SelectMany(s => s.Shareholder.ShareholderUsers) .Where(x => x.AccessMode == true) .ToList();
请注意,如何在多行上打破查询使得阅读更加简单.此外,将列表变量初始化为新的List< ShareholderUser>是没有意义的.如果你那么立即给它一个不同的价值.我还删除了Include调用,因为这是不必要的 – 您在查询中明确选择了Shareholder.ShareholderUsers,因此您不需要包含它.
Collections.sort (list
Collections.sort(AssetlandCertlist,new Comparator<AssetLandCert>() {@Override
public int compare(AssetLandCert o1, AssetLandCert o2) {
if(o1.getIsEdit() > o2.getIsEdit()){
return 1;
}
if(o1.getIsEdit() == o2.getIsEdit()){
return 0;
}
return -1;
}
});
报错误信息:java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableList.sort(Collections.java:1331)
at java.util.Collections.sort(Collections.java:175)
at com.zdvictory.asset.basic.action.AssetLandCertAction.HouseCetAuthControl(AssetLandCertAction.java:618)
at com.zdvictory.asset.basic.action.AssetLandCertAction.list(AssetLandCertAction.java:124)
求解????????急急!!!!!
Collections.sort(List list) list排序学习笔记
先上代码:
class ListSortExample {
private String flag ;
public ListSortExample(String flag){
this.flag = flag;
}
public String getFlag(){
return this.flag;
}
public void setFlag(String flag){
this.flag = flag;
}
}
/**
* 比较器,重写compare方法,根据ListSortExample的flag字段来排序ListSortExample
*
*/
class ComparatorListSort implements Comparator{
public int compare(Object arg0, Object arg1) {
ListSortExample example0=(ListSortExample)arg0;
ListSortExample example1=(ListSortExample)arg1;
//首先比较年龄,如果年龄相同,则比较名字
int flag=example0.getFlag().compareTo(example1.getFlag());
return flag;
}
}
public class TestListSort{
public static void main(String[] args){
List<ListSortExample> sortExampleList=new ArrayList<ListSortExample>();
sortExampleList.add(new ListSortExample("aa"));
sortExampleList.add(new ListSortExample("ee"));
sortExampleList.add(new ListSortExample("bb"));
sortExampleList.add(new ListSortExample("cg"));
Comparator comparator=new ComparatorListSort();
//排序--注意:sortExampleList中的对象引用必须被comparator进行比较了,即是:comparator对象的compare方法一定是对sortExampleList中的对象就行比较
Collections.sort(sortExampleList, comparator);
for (ListSortExample example:sortExampleList){
System.out.println(example.getFlag());
}
}
}
运行结果:
aa
bb
cg
ee
上面初步对Collections.sort的应用做了一个简单的描述。
下面的篇章我们将会Collections.sort实现进行解析:见代码和代码注释
public static <T> void sort(List<T> list, Comparator<? super T> c) {
//将排序list转化为数组
Object[] a = list.toArray();
//然后调用Arrays的静态方法sort()进行排序,所以说Collections的sort()功能是委派Arrays来实现的,我们重点看看Arrays的sort()方法
Arrays.sort(a, (Comparator)c);
//这边简单:将排序完成的数组对象中的数据赋值给list对象
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set(a[j]);
}
}
public static <T> void sort(T[] a, Comparator<? super T> c) {
//数组拷贝
T[] aux = (T[])a.clone();
if (c==null)
//如果比较器为空,采用默认比较器
mergeSort(aux, a, 0, a.length, 0);
else
//采用用户自定义的比较器来比较排序
mergeSort(aux, a, 0, a.length, 0, c);
}
private static void mergeSort(Object[] src,
Object[] dest,
int low, int high, int off,
Comparator c) {
int length = high - low;
//当数组的数据小于或者等于7个时候,直接采用冒泡排序法进行比较,然后返回
// Insertion sort on smallest arrays
if (length < INSERTIONSORT_THRESHOLD) {
for (int i=low; i<high; i++)
for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
swap(dest, j, j-1);
return;
}
// Recursively sort halves of dest into src
int destLow = low;
int destHigh = high;
low += off;
high += off;
int mid = (low + high) >>> 1;
//如果数组中的个数大于7的话,通过调用递归方法,一直将原数组划分成多个小数组,数组的长度在7之间的,将这些小数组的中的数据按比较器中的规则排好序
//通过A,B将数组一分为二的,然后再将1/2的数组再次划分为2个,直至最后被划分的数组的长度在7之内,
mergeSort(dest, src, low, mid, -off, c);----A //对src[low], src[mid](假如程为数组1)之间的数据进行排序
mergeSort(dest, src, mid, high, -off, c);----B//对src[mid], src[high](假如程为数组2)之间的数组进行排序
//下面的操作就是将内部已经排序好的数组1,2就行排序
// If list is already sorted, just copy from src to dest. This is an
// optimization that results in faster sorts for nearly ordered lists.
//当数组2的第一个数据(也就是最小数据)大于数组1的最后一个数据(就是最大数据),直接合并俩数组到到目标数组
if (c.compare(src[mid-1], src[mid]) <= 0) {
System.arraycopy(src, low, dest, destLow, length);
return;
}
// Merge sorted halves (now in src) into dest
//否则采用算法,什么算法我也忘了,很简单的,依次比较,将比较好了的数据赋值给目标数组
for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
}
废话再说俩句,竟然要排序,显然就要比较要排序元素的顺序或者大小,而比较器的作用就是用来干这个的。用比较器来实现对排序元素的比较。例如上面的代码:Collections.sort(sortExampleList, comparator);comparator比较器中的compare()方法就是用来比较sortExampleList中的ListSortExample对象。
版权声明:本文为博主原创文章,未经博主允许不得转载。
关于java.util.Collections.copy ():列表 List 浅拷贝和java list深拷贝的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”、c# – 无法将类型’System.Collections.Generic.List>’隐式转换为’System.Collections.Generic.List、Collections.sort (list等相关知识的信息别忘了在本站进行查找喔。
本文标签: