day17、权限修饰符、集合
当前类 | 同一个包的类 | 不同包的子类 | 不同包不同类 | |
---|---|---|---|---|
public | 可以 | 可以 | 可以 | 可以 |
protected | 可以 | 可以 | 可以 | 不可以 |
默认的 | 可以 | 可以 | 不可以 | 不可以 |
private | 可以 | 不可以 | 不可以 | 不可以 |
集合
interface Collection Java中集合的总接口
List Set 是子接口
实现类:ArrayList LinkedList
HashSet TreeSet
collection接口
增
boolean add(E e)
boolean add(Collection<? extends E> c);
删:
boolean remove(Object obj);
boolean removeAll(Collection<?> c);
void clear();
查
int size();
Object[] toArray();
boolean contains(Object obj);
boolean containsAll(Collection<? extends E> c);
boolean isEmpty();
循环
for循环
for循环增强版
迭代器 Iterator
List接口
独有的方法:
增:boolean add(int index, E e);
boolean addAll(int index, Collection<? extends E> c);
删:
E remove(int index);
改:
E set(int index , E e );
查:
E get(int index);
int indexOf(Object obj)
int lastIndexOf(Object obj)
list subList(int startIndex , int endIndex );
迭代器遍历:反向
ListIterator<String> listIterator = list.listIterator(list.size());
while( listIterator.hasPrevious()){
sout( listIterator.previous())
}
day18、ArrayList源码,ArrayList和LinkedList区别
源码:add方法里,最后用了grow方法,每次扩容1.5倍
ArrayList和LinkedList的区别
1、ArrayList底层是数组,LinkedList底层是链表
2、ArrayList在随机取数据的时候,效率高于LinkedList
3、ArrayList在删除 和 插入 的时候,效率低于LinkedList
4、ArrayList会自己扩容,需要预留一定空间
5、LinkedList是存储数据的节点的信息,以及节点信息的内存的指针
day19、Object类,Set集合、匿名内部类
public String toString();
public boolean equals( Object obj );
public int hashCode();
hashCode
的总合同是:第二条
如果根据equals(Object)
方法两个对象相等,则在两个对象中的每个对象上调用hashCode
方法必须产生相同的整数结果
Set集合
set集合存数据的效果:无序的,不可重复的
HashSet : 底层是hash值进行存储的,如果hash值一样的,就无法存入集合
TreeSet : 底层是二叉树,对存入的数据进行自然排序
总结: 如果将对象存入到hashSet中的时候,必须重写当前类的equals和hashCode方法 为了保证对象的内容不重复。
HashSet的底层是HashMap JDK1.8 数组 + 链表 + 红黑树 三个组成
TreeSet
会对存入的数据,进行自然排序
自定义的类,存入TreeSet时,需要类实现Comparable接口,重写compareTo(E e)方法
返回值是int
另一种方式是 创建集合时,传入指定的比较器
TreeSet(Comparator<? super E> comparator)
class MyComparator implements Comparator<Emp> {
@Override
public int compare(Emp o1, Emp o2) {
// TODO Auto-generated method stub
int num1 = o2.age - o1.age;
return num1;
}
}
匿名内部类
基于抽象类的匿名内部类
abstract class XXX{public void eat()}
public void test(XXX xxx) {xxx.eat()}
test( new XXX(){
代码块
} )
基于接口的匿名内部类
class Emp{
int age;
}
TreeSet set = new TreeSet(
new Comparator(){
public int compare (Emp e1, Emp e2){
return e1.age - e2.age;
}
}
);