- 浏览: 3052896 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
这话题已经被提过很多次,Java和.NET社区都应该很熟悉这点了,但总是会见到有人犯这个错误……
举个糟糕的代码为例:
代码中的两个循环用LINQ的扩展方法或者用C#内建的foreach语句效果都一样。很容易看出,第11行改变了dummyList的内容。但比较隐蔽的是,这个改变是通过IEnumerable<T>.GetEnumerator()得到一个IEnumerator<T>之后来做的。因为是通过enumerator(C++和Java社区习惯称之为iterator)来做修改,我们无法保证一个集合被修改后,先前得到的enumerator对象还能正确遍历集合。上面的例子里会看到“把表里的每个元素都删除”后,表里还剩下2和4。由于集合内容发生了变化,它们正好被跳过去了。
过程:
{ 1, 2, 3, 4, 5 }
删除位置0的元素,剩下{ 2, 3, 4, 5 }
删除位置1的元素,剩下{ 2, 4, 5 }
删除位置2的元素,剩下{ 2, 4 }
位置3超过表的长度,返回
想强调的就是,用LINQ的时候千万不要试图改变原本集合里的内容!
举个糟糕的代码为例:
using System; using System.Collections.Generic; using System.Linq; namespace BadExample { static class Program { static void Main( string[ ] args ) { var dummyList = new List<int> { 1, 2, 3, 4, 5 }; // try to remove all entries with ForEach (or foreach statement). dummyList.ForEach( item => dummyList.Remove( item ) ); // dummyList should be empty now, but... // we still see 2 and 4 in the list! dummyList.ForEach( item => Console.WriteLine( item ) ); } } }
代码中的两个循环用LINQ的扩展方法或者用C#内建的foreach语句效果都一样。很容易看出,第11行改变了dummyList的内容。但比较隐蔽的是,这个改变是通过IEnumerable<T>.GetEnumerator()得到一个IEnumerator<T>之后来做的。因为是通过enumerator(C++和Java社区习惯称之为iterator)来做修改,我们无法保证一个集合被修改后,先前得到的enumerator对象还能正确遍历集合。上面的例子里会看到“把表里的每个元素都删除”后,表里还剩下2和4。由于集合内容发生了变化,它们正好被跳过去了。
过程:
{ 1, 2, 3, 4, 5 }
删除位置0的元素,剩下{ 2, 3, 4, 5 }
删除位置1的元素,剩下{ 2, 4, 5 }
删除位置2的元素,剩下{ 2, 4 }
位置3超过表的长度,返回
想强调的就是,用LINQ的时候千万不要试图改变原本集合里的内容!
发表评论
-
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22409(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对象的重量
2011-08-21 17:15 0http://domino.research.ibm.com/ ... -
GetCustomAttribute()每次都返回新Attribute实例
2009-11-10 10:30 0Jeffrey Zhao: 一次失败的尝试(上):原来GetC ... -
委托与方法和隐藏参数
2009-09-07 15:32 3312之前正好发了些帖子是关于CLR里的委托的,然后看到老赵说事件也 ... -
要让CLR挂掉的话(第二弹)……
2009-09-04 03:26 12879(Disclaimer:如果需要转 ... -
要让CLR挂掉的话……
2009-09-02 16:53 4785(Disclaimer:如果需要转载请先与我联系。 作者:Re ... -
趣味编程:函数式链表的快速排序
2009-08-31 08:53 3450(恢复自2009-08-28的备份 ... -
事件处理器导致内存泄漏
2009-08-25 15:03 0Memory leak via event handlers ... -
C# 3.0的类型推导
2009-08-23 12:24 0Howard Dierking: Lambda, Lambda ... -
把lock的意思给弄混了 T T
2009-08-20 17:49 2604悲剧啊……前几天有个同学不停问我Java里的同步问题,今天写C ... -
把IEnumerable<T>和IObservable<T>粘起来?
2009-07-23 03:02 0Channel 9: Expert to Expert: Br ... -
Scott Peterson: Variance, Thy Name is Ambiguity
2009-07-01 23:49 1639原文作者:Scott Peterson 原文地址:http:/ ... -
void无法协变
2009-06-30 11:17 0Eric Lippert The void is invari ... -
同一个表达式算出来的浮点数结果会不相等?
2009-05-30 03:27 0浮点数有很多可把玩的地方。例如下面这段C程序: #includ ... -
C#开始默认引用Microsoft.CSharp.dll
2009-05-20 16:14 0记得VB6的运行时么?留意到VB.NET的程序都需要额外的VB ... -
反射与显式实现接口的方法
2009-05-20 11:43 4063在前一帖里,我用到了下面三处Expression.Call() ... -
看到一个关于ref参数与多态的问题,记一下
2009-05-18 10:48 1944刚才读到Alan McGovern的一帖,问为什么形式参数是r ... -
C#的+=运算符两例
2009-05-06 18:18 2041刚偶尔看到了justjavac写的java解惑 - 半斤八两( ...
相关推荐
这使得NSMutableSet更灵活,适合在需要动态改变集合内容的场景。其主要操作包括: 1. 添加对象:`[mutableSet addObject:]`可以将一个对象添加到集合中,如果对象已经存在,则不会再次添加。 2. 删除对象:`...
在ASP.NET中,Hashtable是一种常用的数据结构,它是一个键值对集合,允许程序员存储和检索对象。本篇文章将深入探讨如何在ASP.NET中遍历Hashtable,以及相关的重要知识点。 首先,理解Hashtable的基本概念至关重要...
Block 遍历非常灵活,可以在遍历过程中进行条件判断和复杂的操作,但同样要注意不要在 block 内部修改数组。 这四种遍历方法各有优缺点,选择哪种方法取决于具体需求。通常情况下,快速枚举(fast enumeration)是...
1. **缓存计数**:如果循环内的操作不改变集合,则可以在循环开始前获取集合的长度,并将其存储在一个变量中。 2. **使用枚举器**:对于大型数组或列表,使用枚举器(`IEnumerator`)可以直接访问元素而无需额外的...
- 枚举器(`Enumerator`):主要用于遍历集合或容器中的元素,`Vector`类提供了`elements()`方法返回枚举器。 这个资源可能包含上百个不同的JAVA编程实例,覆盖了上述各个知识点的实际应用,通过学习和实践这些...
[attributes] [modifiers] enum identifier [:base-type]...通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。 enum MyFlags { Flag1, Flag2, Flag3, Flag4}; MyFlags myFlag = MyFlags.Flag2 | MyF
3. 枚举器(Enumerator):集合类通常提供枚举器,允许通过`foreach`循环遍历其元素,而无需知道底层实现。 4. Linq(Language Integrated Query):是C#的一个强大特性,提供了一种声明式查询数据的方式,适用于...
Hashtable是线程安全的,不允许null键值,使用enumerator迭代器,迭代时不允许修改集合。 Reader和InputStream分别是处理字符流和字节流的抽象类。Reader适用于处理基于字符的数据,如文本文件,InputStream用于...
枚举器(Enumerator)**:枚举器提供了一种遍历集合的方式,它可以顺序地访问集合中的每一个元素而不暴露底层实现细节。 **2. 访问器(Accessor)**:访问器模式提供了一种安全访问对象属性的方式。通常包括getter...
枚举(Enumeration)在编程语言中是一种特殊的数据类型,它用于定义一组相关的常量,这些常量通常代表特定的、有限的值集合。枚举在许多编程语言中都有支持,如Java、C#、C++等,它们为编程提供了一种更加清晰、...
- `final` 关键字用于声明一个变量不可改变,一个类不能被继承,或者一个方法不能被重写。 - `finally` 用于异常处理,无论是否发生异常,`finally`块中的代码总会被执行,它是保证清理资源的关键。 - `finalize`...
Set to true after Next() has been called."指的是一个布尔变量的初始状态和改变条件,这通常与迭代器或枚举器的使用有关,其中`Next()`函数可能是用于遍历集合或数据结构的下一个元素。 1. **mt_allocator.c**: ...
Ruby的内置迭代器如`each`允许便捷地遍历集合,而块可以与这些迭代器结合使用,实现简洁的循环逻辑。枚举器(Enumerator)允许你创建自定义的迭代行为。 5. **元编程**: Ruby的元编程能力强大,通过`class`, `...
`HashMap`的迭代器(`Iterator`)是fail-fast迭代器,这意味着如果在迭代过程中,其他线程改变了`HashMap`的结构(添加或删除元素),迭代器会抛出`ConcurrentModificationException`。然而,`Hashtable`的`...