1.List排序
List是Collection的家族成员,为了是List集合里面的元素排序,我们往往用到Collections.sort()。
如果遇到复杂的对象就需要重写(override) Conllections.sort()的方法
https://blog.csdn.net/zj20142213/article/details/79183538
重写compare或者compareto
2.List去重问题
List是有序集合而且元素可重复,set集合是无序集合而且不可重复。
所以给List去重我们往往要用到set,将List转换为set,去除重复元素。
如果是基本数据类型组成的list集合就可以这样做。
exp1.
public class Test { public static void main(String[] args) { List list = new ArrayList(); list.add(11); list.add(12); list.add(13); list.add(14); list.add(15); list.add(11); System.out.println(list); Set set = new HashSet(); List newList = new ArrayList(); set.addAll(list); newList.addAll(set); System.out.println(newList); } }
结果:
[11, 12, 13, 14, 15, 11]
[11, 12, 13, 14, 15]
但如果换成复杂的类型就不行了。我们就需根据类的属性重写equals()和hashCode();
exp2.
public class People { private String name; private String phoneNumber; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public People(String name, String phoneNumber) { super(); this.name = name; this.phoneNumber = phoneNumber; } @Override public String toString() { return "People{" + "name='" + name + ''' + ", phoneNumber='" + phoneNumber + ''' + '}'; } @Override public boolean equals(Object arg0) { // TODO Auto-generated method stub People p = (People) arg0; return name.equals(p.name) && phoneNumber.equals(p.phoneNumber); } @Override public int hashCode() { // TODO Auto-generated method stub String str = name + phoneNumber; return str.hashCode(); } }
String中的equals()方法和hashCode()方法源码来加深认识:
equals()
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
比较两个对象时,首先先去判断两个对象是否具有相同的地址,如果是同一个对象的引用,则直接放回true;如果地址不一样,则证明不是引用同一个对象,接下来就是挨个去比较两个字符串对象的内容是否一致,完全相等返回true,否则false。
equals特点先看地址再看内容
hashCode()
public int hashCode() { int h = hash; if (h == 0 && count > 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; }
hashCode()官方定义:
hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。
hashCode 的常规协定是:
在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。hashcode依靠equals判断;
3.两个List求交集 并集 差集 去重并集
List<String> list1 = new ArrayList<String>(); list1.add("A"); list1.add("B"); List<String> list2 = new ArrayList<String>(); list2.add("B"); list2.add("C");
0.求差集
例如,求List1中有的但是List2中没有的元素:
public static void test3(List list1, List list2) { list1.removeAll(list2);//单词翻译一目了然,就是删除list1中所有list2有的元素; System.out.println(list1); } 结果:[A]
1.求并集(不去重)---将一个集合全部加入另一个集合
public static void test(List list1, List list2) { list1.addAll(list2);//添加所有list2的元素 System.out.println(list1); } 结果:[A, B, B, C]
2.求并集(去重)
例如:求List1和List2的并集,并实现去重。
思路是:先将list中与list2重复的去掉,之后将list2的元素全部添加进去。
public static void test1(List list1, List list2) { list1.removeAll(list2);//用的还是数学的加减方法 list1.addAll(list2); System.out.println(list1); } 结果:[A, B, C]
3.求交集
例如:求List1和List2中都有的元素。
public static void test2(List list1, List list2) { list1.retainAll(list2);//翻译:list1里包含的list2的元素 System.out.println(list1); } 结果:[B]
明明很简单的英文逻辑,硬是被国语说的高大上,很神秘,很麻烦。
(本文的实例都是重别的文章中直接复制过来的,不是原创)