JAVA学习日记第三天(list面试工作需要了解的)

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]

明明很简单的英文逻辑,硬是被国语说的高大上,很神秘,很麻烦。

(本文的实例都是重别的文章中直接复制过来的,不是原创)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值