Java总结 1111/1112

A: List集合底层子实现类的一些特点:
ArrayList:  底层数据结构是数组的形式,查询快,增删慢
线程角度:  单线程 不安全 执行效率高
由于ArrayList是List的子实现类,元素可以重复 并且储存和取出一致
LinkedList: 底层数据结构是链表的形式,查询慢,增删快
线程角度:   单线程 不安全  执行效率高

特有功能:
public void addFirst(E e) 将指定元素插在链表开头
public void addLast(E e)  将指定元素插在链表结尾

public Object getFirst()  返回链表开头的第一个元素
public Object getLast()  返回链表的最后一个元素

public Object removeFirst() 删除并返回链表第一个元素
public Object removeLast()  删除并返回链表的最后一个元素

Vector:     底层数据结构是数组的形式,查询快 ,增删慢 
线程角度:   多线程  安全 执行效率低
特有功能:
public void addElement(E obj)  ------>相当于add(Object e)
public Enumeration<E> elements ------>相当于 Iterator iterator()


Enumeration<E>接口:向量的组件枚举有两个方法
boolean hasMoreElements():------>相当于:hasNext()
Object nextElement():----------->相当于:next();

源码:

synchronized:同步锁(多线程中讲):它就可以保证线程安全!
public synchronized void addElement(E obj) {//由同步代码块演变过来的同步方法
 
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;


如果实现多线程程序,一般需要线程安全的类:  如
StringBuffer Vertor hashtable

synchronized(同步锁对象){
代码:
}

B: 泛型: 
Java根据数组的特点引出泛型: <>
泛型:把数据类型的明确工作提供提前到了创建对象或者是调用方法的时期明确的一种特殊类型.
参数化类型,可以像参数一样进行传递
格式: 
<引用类型>
泛型只能放引用类型

泛型的好处:
将运行时期异常转移到编译时期 (类转换异常)
不需要向下转型
解决了黄色警告线问题

泛型的应用: 
将泛型定义在类上
class Object<E>
将泛型定义在方法上
public <E> void show(E e) 
将泛型定义在接口上
interface Inter<E>{
public abstract void show(E e);
}


泛型的高级:通配符
 <?> :可以是任意类型,包括Object类型以及任意的Java类
 <? extends E>:向下限定,E类型以及E类型的子类
 <? super E>:向上限定,E类型以及E类型的父类

C: 增强for循环:
  书写格式:
  for(集合或者数组中的数据类型 变量名:集合或者数组的对象名){
  输出变量名;
  }
弊端:
遍历数组或者集合的时候,数组或者集合的对象不能为空 
否则会出现空指针异常
一般使用增强for循环的时候都会进行一个非空判断
增强for循环就是为了代替迭代器遍历的

ArrayList集合的遍历方式:
1) toArray遍历
2) Collection集合里的迭代器遍历
3) List集合里的迭代器遍历
4) 使用get() 和 size() 和普通for循环进行遍历
5) 使用增强for循环进行遍历

集合的嵌套遍历:
假设有一个Java班,看成一个容器,这个容器里面有很多学生
 ArrayList<Student>,但是又不止一个Java班,
 大的集合:ArrayList<ArrayList<Student>>
 
D : Set集合
Set集合继承自Collection集合
底层数据结构是哈希表
能保证元素的唯一性,元素不重复
它通过底层集合HashSet集合去实例化,HashSet底层是HashMap集合的实例
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;
  特别是它不保证该顺序恒久不变。。
List集合和Set集合的区别:
Set集合: 元素是唯一的, 集合是无序的(储存和取出不一致)
List集合: 元素可以重复, 集合是有序的(储存和取出一致)

HashSet底层是依赖 HashCode 和equals 这两个方法来保证元素的唯一性
果想要自定义对象的集合也不重复 要在自定义的对象里重写这两个方法
每一个元素对应的HashCode值是否一样,如果HashCode值一样,还比较他们的equals()方法


E: LinkedHashSet集合:
底层由哈希表确保元素的唯一性
又由链表确保元素的有序性

F: TreeSet集合:
TreeSet集合是Set集合中的一个重点
TreeSet底层是依赖TreeMap的实例 , 而TreeMap<K,V> 依赖于红黑树结构来实现的
分两种:
1) 自然排序:
2) 比较器排序:
这种排序的使用取决于使用者使用什么构造方法
当TreeSet使用TreeSet() 无参构造的时候 
必须让自定义的对象Student里面implements Comparable
且里面要重写compareTo方法

当TreeSet使用TreeSet(Comparator<? super E> comparator)  构造的时候

方式1)  定义一个借口Comparator 的子实现类 MyComparator 里面重写 compare方法

方式2)  使用匿名内部类:

TreeSet<Student> st = new TreeSet<Student>(new Comparator<Student>{

@Override
public int compare(Student s1 , Student s2){
//代码;

}
});

猜你喜欢

转载自blog.csdn.net/a1003873553/article/details/78544570