List可以添加重复元素,add方法的返回值都是true,所以一般不接收返回结果
set不可以添加重复元素,如果添加,add方法会返回false
add() //添加元素
remove() //移除元素
clear() //清除集合
isEmpty() //是否为空
size() //集合长度
集合.toArray() //转为数组的方法
toArray方法会自动把集合中的元素向上转型为Object类型,所有取元素的时候还要把此时数组中的元素向下转型为本来的数据类型。
Arrays.asList(数组) //数组转为集合
转为的集合不能进行添加、删除元素,其他方法可用
也不会把基本数据类型的数组转为集合,因为此时的集合会把整个基本类型数组当做一个对象存入集合中
引用数据类型会转为集合
addAll() //把一个集合中的所有元素添加到另一个集合中
removeAll() //删除两个集合的交集
containsAll() //判断集合是否全部包含另一集合
retainAll() //取两者的交集并赋给调用的集合,调用的集合改变,返回true,否则返回false
Iterator it = 集合.iterator(); //取出来的每一个元素都会自动提升为Object
while(it.hasNext()){
System.out.println(it.next());
}
list集合可以根据角标获取元素
集合.add(index,"aaa");
集合.get(index) //根据角标index获取元素
在迭代集合的过程中,不允许直接修改集合的结构,否则就会报并发修改异常的错误。
原因是集合的修改次数modCount与迭代器的修改次数expectedModCount不相同导致的
可以使用迭代器自带的remove方法删除
与迭代删除元素相同
ArrayList可以不断增加长度的原因:把原有的数据复制出来,再创建一个新的数组容量增加50%,把复制的数组放到新的数组中,旧的数组抛弃。
特有的方法:
addFirst() //第一个位置添加元素
addLast() //最后一个位置添加元素
removeFirst() //移除第一个元素
removeLast() //移除最后一个元素
很少使用。。。。
与ArrayList的区别:Vector是加锁的(synchronized),更加安全
需要覆盖equals()和hashCode()判断
不能直接添加自定义对象
自定义对象的类必须实现Comparable接口,且覆盖里面的compareTo()方法
class Person implements Comparable<Person>{
String name;
int age;
//返回值是0,只添加第一个元素
//返回值是一个正数,都能添加到集合中,且顺序为添加时的顺序,根据二叉树,每一个都成为上一个的右孩子,读取时按照二叉树中序遍历
//返回值是一个负数,都能添加到集合中,且顺序为添加时的倒序,根据二叉树,每一个都成为上一个的左孩子,读取时按照二叉树中序遍历
@Override
public it compareTo(Person obj){
return 0;
}
}
集合中自定义对象的排序问题
TreeSet<Person> set = new TreeSet<>();
set.add(new Person("张三"),20);
set.add(new Person("李四"),25);
set.add(new Person("王五"),22);
set.add(new Person("赵六"),21);
set.add(new Person("赵六1"),21);
//重写compareTo()方法
public int compareTo(Person obj){
int num = this.age - obj.age;
//如果年龄相等就比较名字,不相等就根据年龄排序,排序方法根据二叉排序树,读取方式为二叉树的中序遍历
return num == 0 ? this.name.compareTo(obj.name) : num;
}
定义一个类实现接口comparator
覆盖里面的方法
TreeSet<String> set = new TreeSet<String>(new CompareLength());
set.add("aaaaaaaaa");
set.add("z");
set.add("sfaf");
set.add("fssfs");
class CompareLength implements Comparator<String>{
@Override
public int compare(String str1,String str2){
//按照字符串长度进行比较
//比较方式可以自定义,有了这个便不会再按照TreeSet默认的比较方式进行比较了
int length = str1.length() - str2.length();
return length == 0 ? str1.compareTo(str2) : length;
}
}
广泛通用的类型(一开始不知道是什么类型,使用的时候才知道是什么类型)
代码模板中类型不确定,谁调用该段代码,谁就可以来指明这个类型
定义两步
创建对象的时候指明类型,但必须是引用数据类型
泛型类
泛型方法
不知道使用什么类型接收的时候,使用 ? 表示位置
只用来作接收使用
void test(List<?> list) {
}
//泛型的上限,用来限定元素的类型必须是指定的(Number)的子类(或者是该指定类型)
static void test(List<? extends Number> list)
//泛型的下限,用来限定元素的类型必须是指定的(Number)的父类(或者是该指定类型)
static void test(List<? super Number> list)
把有泛型的集合赋值给没有泛型的集合,泛型会被擦除
Map如List和Set一样都是接口,不能直接创建对象
内部维护了两个集合,表示两个集合之间的映射关系
A集合元素不能重复(Set集合)为key
B集合元素可以重复(List)为Value
可以单独把Key或者Value全部取出来单独放在一个集合中
Map里面的元素是无序的
HashMap、LinkedHashMap、TreeMap(会对key进行排序)
//如果key是第一次添加,会返回null,如果key不是第一次添加会替换掉value并返回原来的value
map.put(key,value);
map.clear(); //清除功能
map.remove(key); //可以根据key值删除元素
map.size(); //返回键值对的数量
map.get(key); //根据key值返回value
//没有迭代器,不能进行快速遍历
//方式1.1
//取出所有的key存入set集合
Set<String> allKeys = map.keySet();
//取出每一个key对应的 value
Iterator<String> it = allKeys.iterator();
while(it.hasNext()) {
//取出set集合中的每一个key值
String key = it.next();
Object val = map.get(key);
System.out.println(key+"="+val)
}
//方式1.2
Set<String> allKeys = map.keySet();
for(String key : map.keySet()) {
System.out.println(key+"="+val)
}
//方式2.1
//获取所有的key-value对象 --> entry对象
Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
//遍历每一个entry对象
Iterator<Entry<String,Integer>> it = entrySet.iterator();
while(it.hasNext()) {
//取出每一个entry对象
Entry<String,Integer> en = it.next();
//取出entry对象的key
String key = en.getKey();
//取出entry对象的value
Integer value = en.getValue();
System.out.println(key+"="+value)
}
//方式2.2
Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
for( Entry<String,Integer> entry : entrySet){
System.out.println(en.getKey()+"="+en.getValue())
}
默认比较的也是对象的地址,就像List和Set一样
相同点:
不同点: