java学习笔记(8) - 面向对象(8) : 集合
集合的介绍
集合的常用接口和类
ArrayList
(动态数组结构)的基本操作
package chapter06;
import java.util.ArrayList;
public class Collection_01 { public static void main(String[] args) throws Exception {
ArrayList list = new ArrayList(3);
list.add("zhangsan"); list.add("zhangsan"); list.add("wangwu"); list.add("zhaoliu"); System.out.println(list.size()); System.out.println(list.get(1)); for ( int i = 0; i < list.size(); i++ ) { } for ( Object obj : list ) { System.out.println("集合中的数据:" + obj); }
Object oldVal = list.set(1, "lisi"); System.out.println("修改前的值:" + oldVal);
Object removeVal = list.remove(1); System.out.println("删除的值:" + removeVal);
System.out.println(list);
System.out.println("main方法执行完毕"); } }
|
ArrayList
的常用方法
package chapter06; import java.util.ArrayList;
public class Collection_ArrayList { public static void main(String[] args) throws Exception { ArrayList list = new ArrayList();
list.add("zhangsan"); list.add("lisi"); list.add("wangwu");
list.add(1, "zhaoliu"); System.out.println(list.get(1));
ArrayList otherList = new ArrayList(); otherList.add("1"); otherList.add("2"); otherList.add("3"); list.addAll( otherList );
System.out.println(list.size());
System.out.println(list.isEmpty());
System.out.println(list.contains("zhangsan123")); System.out.println(list.indexOf("zhangsan123")); System.out.println(list.indexOf("zhangsan")); System.out.println(list.lastIndexOf("zhangsan"));
Object[] objects = list.toArray();
Object clone = list.clone(); System.out.println(clone); ArrayList list1 = (ArrayList)clone;
System.out.println(list); System.out.println(list1); } }
|
LinkedList
(链表结构)的常用方法
LinkedList
是List
接口的实现类,因此也实现了List
的方法。但LinkedList
是采用链表结构的方式来实现List接口的,因此在进 行insert
和remove
动作时效率要比ArrayList
高。
package chapter06;
import java.util.ArrayList; import java.util.LinkedList;
public class Collection_02 { public static void main(String[] args) throws Exception {
LinkedList list = new LinkedList();
list.add("zhangsan"); list.add("lisi"); list.add("wangwu"); list.addFirst("lisi"); list.add(1, "wangwu"); list.push("push");
System.out.println(list.getFirst()); System.out.println(list.getLast());
System.out.println(list.get(1)); for ( int i = 0; i < list.size(); i++ ) { }
for ( Object obj : list ) { System.out.println(obj); }
list.remove(2); System.out.println(list.contains("lisi"));
System.out.println(list); } }
|
新增操作图解
删除操作图解
集合 - 比较器(排序)
- Java中的比较器(
Comparator
)是一种对象,用于定义两个对象之间的比较规则。它是一个独立的类,实现了Comparator
接口,通常用于对集合中的元素进行排序。Comparator
接口中有一个compare()
方法,它接受两个对象作为参数,并返回一个int
值,表示它们的顺序。
例如:
import java.util.*; public class StringComparator implements Comparator<String> { public int compare(String s1, String s2) { return s1.compareTo(s2); } } public class Main { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("pear"); list.add("orange"); Collections.sort(list); System.out.println("自然排序结果:" + list); StringComparator comparator = new StringComparator(); Collections.sort(list, comparator); System.out.println("自定义比较器排序结果:" + list); } }
|
在这个例子中,我们定义了一个StringComparator
类,实现了Comparator
接口中的compare()
方法,用于按字典序
比较两个字符串的大小。然后使用Collections.sort()
方法对字符串列表进行排序,分别使用自然排序和自定义比较器排序,输出排序结果。
再比如我们可以自定义一个排序方法:
package chapter06;
import java.util.ArrayList; import java.util.Comparator;
public class Collection_sort { public static void main(String[] args) {
ArrayList list = new ArrayList(); list.add(1); list.add(3); list.add(2);
Integer i1 = 1; Integer i2 = 0;
list.sort(new NumberComparator());
System.out.println(list); } }
class NumberComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { if ( o1 < o2 ) { return -1; } else if ( o1 == o2 ) { return 0; } else { return 1; } } }
|
Comparable 接口定义
说明:根据这个方法的返回值来判断
大于0:说明前一个比后一个大
小于0:说明前一个小于后一个
等于0:说明这两个一样大
ArrayList
和linkedList
的对比
ArrayList
:
- 优点:
ArrayList
是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询 操作效率会比较高(在内存里是连着放的)。当然是在不扩容的情况下
- 缺点:因为地址连续,
ArrayList
要移动数据,需要把所有元素的位置向后移动或者向前移动,效率慢,所以插入和删除操作效率比较低。
LinkedList
- 优点:
LinkedList
基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add
和remove
,LinedList
比较占优势。LinkedList
适用于要头尾操作或插入指定位置的场景
- 因为
LinkedList
要移动指针,所以查询操作性能比较低。