1 集合的结构
HashSet实现自定义类型内容不重复的原理:根据hash值先计算要存储的位置,如果该位置没有元素则直接存储,如果该位置有元素,则遍历该位置的所有元素,先比较hash值,再比较equals,两者其一不相同才认定不是同一个,存储的该位置的链表中。存储自定义类型时,要保证唯一元素,需要重写hashCode和equals方法(根据实际情况决定)。
TreeSet:使用无参构造存储自定义对象要实现Comparable接口,重写CompareTo方法;使用带参构造,需要自定义Conparator排序规则;注意自己分析主要排序条件和次要排序条件。
1.1 多线程使用集合
a List的选择:ArrayList不是线程安全的集合。
b Vector太过于笨重性能低下.
c new CopyOnWriteArrayList()也会频繁创建数组.
d List objects = Collections.synchronizedList(new ArrayList<>()) 相对来说性能更好。
2 collection集合中常用共性方法
- public boolean add():添加元素
- public boolean remove():删除元素
- public boolean contains():判断是否包含
- public boolean isEmpty():判断集合中是否有元素
- public int size():判断集合中元素的个数
- public boolean clear(): 清空集合元素
- public boolean toArray():将集合转换成数组(转换的数组元素个数固定,原集合不改变)
- 注意:遍历集合不能对集合进行修改,会引起并发修改异常,java.util.ConcurrentModificationException,想要删除必须使用迭代器。
3 迭代器iterator
- boolean hasNext():返回是否有仍有元素
- E next()L返回下一个迭代的元素
- void remove():移除集合中的元素
4 泛型
不使用泛型
- 好处:数据类型可以多种多样。
- 弊端:数据不安全,获取的时候需要自己转型。
使用泛型
- 好处:把运行期异常变成了编译期异常,存的是什么类型就取什么类型,避免了类型转换的麻烦。
- 弊端:只能存储一种数据类型。
- 定义含有泛型的类:创建对象的时候确定泛型的具体类型
修饰符 class 类名<代表泛型的变量> { }
class ArrayList<E>{
public boolean add(Ee){}
public E get(int index){}
....
}
- 定义含有泛型的方法:调用的时候确定泛型的具体类型
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
public class MyGenericMethod {
public<MVP> void show(MVP mvp) {
System.out.println(mvp.getClass());
}
public <MVP> MVPshow2(MVP mvp) {
return mvp;
}
}
- 定义含有泛型的接口:定义实现类的时候确定类型或者创建类对象的时候确定
修饰符 interface 接口名<代表泛型的变量> { }
public interface MyGenericInterface<E>{
public abstract void add(E e);
public abstract E getE();
}
- 泛型通配符
4.1 当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,元素自身方法无法使用
4.2 通配符高级使用----受限泛型
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限和下限。
- 泛型的上限:
格式:类型名称 <? extends 类 > 对象名称
意义:只能接收该类型及其子类泛型的 - 下限:
格式:类型名称 <? super 类 > 对象名称
意义:只能接收该类型及其父类型
5 数据结构
5.1 红黑树
6 可变参数
- 当参数类型确定,参数个数不确定时可以使用可变参数,public void add(int…变量名称)。
- 如果参数有多个,可变参数要放在最后写。
7 Collections工具类
- addAll:添加多个元素。
- shuffle:打乱顺序。
- sort:排序,自定义类型需要实现Comparable或者Comparator接口,重写compareTo或者compare方法,自定义比较规则(返回0相等,大于0升序,小于0降序),或者使用匿名内部类来创建排序规则。