★ 数组转Collection
使用Apache Jakarta Commons Collections:
import org.apache.commons.collections.CollectionUtils;
String[] strArray = {"aaa", "bbb", "ccc"};
List strList = new ArrayList();
Set strSet = new HashSet();
CollectionUtils.addAll(strList, strArray);
CollectionUtils.addAll(strSet, strArray);
CollectionUtils.addAll()方法的实现很简单,只是循环使用了Collection的add()方法而已。
如果只是想将数组转换成List,可以用JDK中的java.util.Arrays类:
</pre><pre name="code" class="java">import java.util.Arrays;
String[] strArray = {"aaa", "bbb", "ccc"};
List strList = Arrays.asList(strArray);
不过Arrays.asList()方法返回的List不能add对象,因为该方法的实现是使用参数引用的数组的大小来new的一个ArrayList。
★ Collection转数组
直接使用Collection的toArray()方法,该方法有两个重载版本:
Object[] toArray();
T[] toArray(T[] a);
★ Map转Collection
直接使用Map的values()方法。
★ List和Set转换
List list = new ArrayList(new Hashset());// Fixed-size list
List list = Arrays.asList(array);// Growable
list list = new LinkedList(Arrays.asList(array));// Duplicate elements are discarded
Set set = new HashSet(Arrays.asList(array));
String[] strArray = {"aaa", "bbb", "ccc"};
List<String> strList = new ArrayList<String>();
Collections.addAll(strList, strArray);
strList.add("aaa");
strList.add("bbb");
Set set = new HashSet<String>(strList);
Log.e("<<<<<<<<<", set.toString()+ "");
运行结果
★ 数组转Collection
使用Apache Jakarta Commons Collections:
import org.apache.commons.collections.CollectionUtils;
String[] strArray = {"aaa", "bbb", "ccc"};
List strList = new ArrayList();
Set strSet = new HashSet();
CollectionUtils.addAll(strList, strArray);
CollectionUtils.addAll(strSet, strArray);
CollectionUtils.addAll()方法的实现很简单,只是循环使用了Collection的add()方法而已。
如果只是想将数组转换成List,可以用JDK中的java.util.Arrays类:
</pre><pre name="code" class="java">import java.util.Arrays;
String[] strArray = {"aaa", "bbb", "ccc"};
List strList = Arrays.asList(strArray);
不过Arrays.asList()方法返回的List不能add对象,因为该方法的实现是使用参数引用的数组的大小来new的一个ArrayList。
★ Collection转数组
直接使用Collection的toArray()方法,该方法有两个重载版本:
Object[] toArray();
T[] toArray(T[] a);
★ Map转Collection
直接使用Map的values()方法。
★ List和Set转换
List list = new ArrayList(new Hashset());// Fixed-size list
List list = Arrays.asList(array);// Growable
list list = new LinkedList(Arrays.asList(array));// Duplicate elements are discarded
Set set = new HashSet(Arrays.asList(array));
String[] strArray = {"aaa", "bbb", "ccc"};
List<String> strList = new ArrayList<String>();
Collections.addAll(strList, strArray);
strList.add("aaa");
strList.add("bbb");
Set set = new HashSet<String>(strList);
Log.e("<<<<<<<<<", set.toString()+ "");
运行结果
——————————————————————————————————
[aaa, ccc, bbb]
//================================================================//
因为 成员不能重复
这里就涉及到了一个问题,如果set中的不是基础数据类型,而是自定义的数据对象,有自己判断是否相同的原则,怎么办呢?
覆盖了equals方法,同时注意修改hashCode方法。(如果是TreeSet,成员要求实现caparable接口,或者使用 Comparator构造TreeSet)关于这点在http://blog.csdn.net/bihansheng2010/article/details/50587029 有更详细的介绍
public class User implements Serializable {
public String name;
public int age;
public String DNA;
public User(String name, int age, String DNA) {
this.name = name;
this.age = age;
this.DNA = DNA;
}
/**
* 这里认为DNA相同就判断是同一个人
* @param o
* @return
*/
@Override
public boolean equals(Object o) {
return DNA.equals(((User) o).DNA);
}
@Override
public int hashCode() {
return DNA.hashCode();
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", DNA='" + DNA + '\'' +
'}';
}
}
List<User> strList = new ArrayList<User>();
strList.add(new User("zhangsan",20,"aaa") );
strList.add(new User("lisi",1,"aaa"));
Set set = new HashSet<User>(strList);
Log.e("<<<<<<<<<", set.toString()+ "");
运行结果:
[User{name='zhangsan', age=20, DNA='aaa'}]
Object的hashCode返回值基本上是对象的内存地址
Object的equals方法判断两个Object对象是否“相等”的依据其实是两个对象是否“相同”
所以,如果obj1 和 obj2 都是Object实例,那么 obj1.equals(obj2) 和 obj1 == obj2 是等价的
equals和hashCode这两个方法的关系是:
如果两个对象equals返回true,那么它们的hashCode必须返回相同的integer值。反之,则不做要求,但建议是:如果它们返回相同的hashCode,那么equals应该返回true。
因为上面的原因,如果某个类覆盖了Object的equals方法,那它就必须覆盖hashCode方法,以满足上述要求。
对于自己定义的类,是否要覆盖这些方法,完全取决于自己的需要,如果需要放宽两个对象相等的条件,就需要覆盖。如果不需要,就用Object的实现好了,完全没有问题。
例如,对于Integer类,它需要将两个Integer相等的条件放宽到只要它们包含的数值相等,两个对象就相等,它就会覆盖equals方法,同时,它必须覆盖hashCode方法,返回值很简单,就是它包含的整型值。
再例如,Thread类就没有覆盖这两个方法,它作为Object的直接继承,写Thread类的人认为继承使用Ojbect的这两个方法是合适的,他就不会去覆盖。