1、List
1.1、ArrayList
-
底层基于数组的集合
-
特点:有序可重复(输入和输出顺序一致);增加、删除慢(要扩缩容和复制),查询和修改快;
-
构造:ArrayList() 构造初始值为10的空列表(经常使用)
-
集合中的数据全部为引用数组类型
-
增删改查方法:
-
增:add(Object obj); add(int index,Object obj); addAll(可以是所有的集合)
-
查:get(int index)
-
改:set(int index,Object obj)
-
删:remove(int index);boolean remove(Object o)//移除此列表中首次出现的指定元素(如果存在)
注意:删除元素时,如果元素的值为集合的下标时(比如删除整数元素4,下标也有4时)默认把元素当成下标,所以放值时整数尽量使用字符(“4”),必要时再转回整数
ArrayList list = new ArrayList(); list.add("1"); //将字符串类型转换为int类型 int i = Integer.parseInt(obj.toString()); System.out.println(i+1); System.out.println(list);
-
-
普通方法:
- clear();//清除列表
- indexOf();//指定元素下标(从前开始)
- lastIndexOf();//指定元素最后一个的下标(从后开始)
- isEmpty();//没有元素返回为空
- Object[] arr=list.toArray();//将集合转换为数组,字符串排序 是根据对应的hashCode值来排序
-
ArrayList的遍历:
-
普通for
-
增强for–>当前这个类实现了Iterable接口
-
迭代器:
ArrayList arrayList = new ArrayList(); arrayList.add("熊大"); arrayList.add("熊二"); arrayList.add("吉吉"); arrayList.add("毛毛"); /** * 单向迭代器 * 迭代器的使用 * 1 调用AbstractList中的iterator()方法 2 返回的是Iterator这个接口对象 3 调用方法来进行元素的迭代 1 boolean hasNext() 如果仍有元素可以迭代,则返回 true。 2 E next() 返回迭代的下一个元素。 */ Iterator it=arrayList.iterator(); while (it.hasNext()){ System.out.println(it.next()); } /** * 双向迭代器 * 要使用 必须先正向迭代一次 才能反向迭代 * listIterator() * 返回的是ListIterator * * 只有List接口下面的实现类才能使用双向迭代器 */ ListIterator listIterator=arrayList.listIterator(); while (listIterator.hasNext()){ listIterator.next(); } while (listIterator.hasPrevious()){ System.out.println(listIterator.previous() ); }
-
1.2、LinkedList
-
基于变量(链表)
-
增删快
-
因为LinkedList中有多个接口的实现方法,所以,同样一个功能可以有多个方法实现,但是,尽量不要交叉使用(使用同一个接口中的方法),因为交叉使用会导致其不能具有一个接口的完整特性
-
增删改查方法
-
增:add(); push();//先加后出
-
查:get(int index)
-
改:set(int index,Object obj)
-
删:remove(); pop(); poll;
注意:
- poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除;
- pop是栈结构的实现类的方法,表示返回栈顶的元素,同时该元素从栈中删除,当栈中没有元素时,调用该方法会发生异常
- 两者区别:基本一致,当头结点为空的时候,两个函数的处理方式不同:poll()选择返回null,pop()选择抛出异常。
-
-
LinkedList遍历
与ArrayList相似
2、Set
2.1、HashSet
-
元素不可重复,无序
-
增:add();
-
删:remove();
-
没有提供设置和查询单个方法
-
自定义类型 只要属性值都是一样的 就应该认为是同一个对象
-
HashSet判断重复通过重写的hashCode和equals方法 来判断
注意:自定义类需要自己重写hashCode和equals方法 来判断
-
遍历:for;增强for;迭代器
2.2、TreeSet
- 不能有重复元素 最大的特点:只能放同一个类型(因为它会将数据按照自然顺序的方式来排列)
- 判断重复一定是要hashCode和equals同时为true
- TreeSet 存放自定义的类不行,因为自定义类不具备排序的能力, 需要你当前定义的这个类去实现一个接口(Comparable)强制重写compareTo方法
- 可以放String 或者 Integer 是因为本身实现了接口(Comparable)
/**
* 实现Comparable接口 让这个类具备排序的能力
*/
public class User{
String name;
int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
/**
* 自定义的比较器
*/
public class MyComparator implements Comparator {
/**
* 0和1或者-1
* 0 表示相等
* 1和-1 区别在于排序的方式不一样
*/
@Override
public int compare(Object o1, Object o2) {
if(o1==null || o2==null){
return 0;
}
User u1 = (User)o1;
User u2 = (User)o2;
if(u1.age<u2.age){
return -1;
}else if(u1.age>u2.age){
return 1;
}else{//如果年龄不大于也不小于说明等于,那么有名字来决定对象是否相同String已经写好排序规则
return u1.name.compareTo(u2.name);
}
}
}
//测试
public class Test {
public static void main(String[] args) {
//采用无参构造创建对象 默认采用自然排序
//TreeSet set = new TreeSet();
/**
* TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。
*/
TreeSet set = new TreeSet(new MyComparator());
set.add(new User("毛毛", 30));
set.add(new User("毛毛", 31));
System.out.println(set);
}
}