equals方法
equals(Object o) 方法用来比较指定的对象与列表是否相等,当且仅当指定的对象也是一个列表、两个列表有相同的大小,并且两个列表中的所有相应的元素对相等时才返回 true。换句话说,如果所定义的两个列表以相同的顺序包含相同的元素,那么它们是相等的。该定义确保了 equals 方法在 List 接口的不同实现间正常工作。虽然equals方法并不常用,但是通过下面的例子可以了解一下:
1 /** 2 * @ClassName: TestListAdd 3 * @Description: TODO(测试List的equals()方法) 4 * @author hoojjack 5 * @date 2017年5月12日 上午11:37:06 6 * 7 */ 8 public class TestListAdd { 9 private String name; 10 11 public TestListAdd() { 12 13 } 14 15 public TestListAdd(String name) { 16 this.name = name; 17 } 18 19 public String getName() { 20 return name; 21 } 22 23 public void setName(String name) { 24 this.name = name; 25 } 26 27 public static void main(String args[]){ 28 TestListAdd test =new TestListAdd("hujian"); 29 List<TestListAdd> list = new ArrayList<TestListAdd>(); 30 List<TestListAdd> list1 = new ArrayList<TestListAdd>(); 31 list.add(test); 32 System.out.println("name="+test.getName()); 33 //list.add(new TestListAdd()); 34 test.setName("hoojjack"); 35 list1.add(test); 36 System.out.println("name="+test.getName()); 37 //list1.add(new TestListAdd()); 38 System.out.println(list.equals(list1)); 39 40 } 41 42 }
测试结果:
1 name=hujianjie 2 name=hoojjack 3 true
通过上面的代码与打印结果可以了解到:无论实现是否相同,只要是List的元素顺序和值相同,equals方法就认为两个比较对象相同,也就是说equals比较的是List中的元素而不是实现对象本身(list1,list2),这与String的equals方法类似。
如果将上面注释掉的33/37行代码放开,则测试的equals()返回为false。从结果发现两个列表各新增了一个同类型的对象,因此比较的是list中的对象的引用是否相同。
ListIterator方法:
1 public static void main(String args[]){ 2 TestListAdd test =new TestListAdd("hujian"); 3 List<TestListAdd> list = new ArrayList<TestListAdd>(); 4 List<TestListAdd> list1 = new ArrayList<TestListAdd>(); 5 list.add(test); 6 list.add(new TestListAdd("123")); 7 test.setName("hoojjack"); 8 list1.add(test); 9 list1.add(new TestListAdd("456")); 10 ListIterator<TestListAdd> listIterator = list.listIterator(); 11 //位置1 12 while(listIterator.hasPrevious()){ 13 System.out.println(listIterator.previous().name); 14 } 15 //位置2 16 while(listIterator.hasNext()){ 17 System.out.println(listIterator.next().name); 18 } 19 }
结果:
1 hoojjack 2 123
如果将listIterator.hasPrevious()放在位置1处,listIterator.has()放在位置2处,则会出现上述结果,也就是list.listIterator()每次返回list列表的起始位置,因此先调用hasPrevious()将返回false。如果想要上面的hasPrevious()能输出结果,可以在位置1处先调用listIterator = list.listIterator(list.size());获得list列表的最后一个元素的游标。
1 public static void main(String args[]){ 2 TestListAdd test =new TestListAdd("hujian"); 3 List<TestListAdd> list = new ArrayList<TestListAdd>(); 4 List<TestListAdd> list1 = new ArrayList<TestListAdd>(); 5 list.add(test); 6 list.add(new TestListAdd("123")); 7 test.setName("hoojjack"); 8 list1.add(test); 9 list1.add(new TestListAdd("456")); 10 ListIterator<TestListAdd> listIterator = list.listIterator(); 11 //位置1 12 while(listIterator.hasNext()){ 13 System.out.println(listIterator.next().name); 14 } 15 //位置2 16 while(listIterator.hasPrevious()){ 17 System.out.println(listIterator.previous().name); 18 } 19 }
结果:
1 hoojjack 2 123 3 123 4 hoojjack