首先当我们学习一个东西的时候,首先要按照一个思维过程,那就是:它是什么,为什么要用它(用了之后有什么好处),然后是怎么用。
1集合是什么:容器,用来存放东西
2为什么使用集合
数组:1长度不可变
2 缺少方法
特点:查询快,但是添加删除操作麻烦。
List和Set
往list中添加或者在某一位置添加东西用add方法,取数据用get方法。
List中存放数据是有序的(有序指的是存放时间先后上的顺序),且可存放重复元素
Set中存放数据是无序的,并且不可存放重复元素,那么既然是不能放重复元素,它是根据什么来判定的,是根据“==”还是equals?--》用的是equals
要验证这个问题,先写一个JavaBean,然后重写equals和hashCode方法就能得到验证。
ArrayList与Vector的区别:ArrayList是线程不安全的Vector是线程安全的,但是即使在线程不安全的情况下我们也要使用ArrayList,我们可以用Collections(在JUC这个包中,不是Collection)工具类将它转换为线程安全的。
LinkedList不仅实现了List接口,而且实现了Queue和Deque接口。
Queue是一种基于队列的操作,FIFO先进先出。里面主要看两个方法:
peek()获取但不移除此队列的头;如果此队列为空,则返回 null
poll()获取并移除此队列的头,如果此队列为空,则返回 null。
Deque是一种基于堆栈的操作。FILO先进后出,其中有两个方法:
push()和pop()分别是往栈中放入一个元素和从栈中弹出一个元素
ArrayList与LinkedList的区别:ArrayList底层是数组实现的,LinkedList底层是链表实现的。
如何取出容器中的数据
List中我们用get方法取出,用remove方法删除,因为Set中的数据是无序的,当我们取数据的时候不可能说直接得到第几个。所以用iterator迭代器来遍历。
写一个方法,取出Set中的数据,用iterator
public static void showSet(Set set){
Iterator iterator=set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
Set中,当我们用HashSet存数据并且用iterator方法遍历查看的时候,结果发现是无序的,当我们我们用TreeSet存储基本数据类型并且遍历查看数据的时候当我取出数据的时候发现总是有顺序的,默认是升序。这里就引出一个问题:我怎样让它降序?
1 对于基本数据类型
实现Comparator接口,重写compare方法做一个比较器,当我new这个TreeSet的时候把这个构造器给放进去。
2对于抽象数据类型
(1)做一个比较器,这时对象之间进行排序一定是根据对象的某一个属性进行排序
public class Test {
public static void showSet(Set set){
Iterator iterator=set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
public static void main(String[] args) {
Comparator com=new Comparator() {
public int compare(Object o1, Object o2) {
User u1=(User) o1;
User u2=(User) o2;
if(u1.getAge()>u2.getAge()){
return -1;
}else if(u1.getAge()<u2.getAge()){
return 1;
}
return 0;
}
};
TreeSet set=new TreeSet(com);
User u1=new User(1,"zhangsan",20);
User u2=new User(2,"lisi",30);
User u3=new User(1,"zhangsan",50);
set.add(u1);
set.add(u2);
set.add(u3);
showSet(set);
}
}
(2)除了做一个构造器这个方法之外,我们还可以使那个类实现Comparable接口,然后重写compareTo这个方法
public int compareTo(Object o) {
if(o instanceof User){//User这个类是一个javabean
User otherUser=(User) o;
if(this.age>otherUser.getAge()){
return 1;
}else if(this.age<otherUser.getAge()){
return -1;
}
}
return 0;
}
然后就是Map接口,它有三个实现类,Hashtable,HashMap,Properties。有一个子接口SortedMap,SortedMap下面有一个实现类TreeMap。
Map是一种基于key--value的存储方式,其中key也是一种set,Hashtable与HashMap最重要的区别是HashMap中可以将null作为key而Hashtable不允许,另外Hashtable是线程安全的HashMap是线程不安全的。我们一般用HashMap,就像ArrayList和Vector一样。
public class TestHashMap {
public static void showMap(Map map){
Set set=map.keySet();//取出所有的key放到一个Set中去
Iterator ite=set.iterator();//迭代Set中的key值
while(ite.hasNext()){
Object keys=ite.next();
Object value=map.get(keys);//根据key值取出对应的value
System.out.println(value);
}
}
public static void main(String[] args) {
HashMap map=new HashMap();
map.put("0531", "济南");
map.put("0532", "青岛");
map.put("0533", "淄博");
showMap(map);
}
}
注:Set中当我添加重复元素的时候会添加不进去,但是在Map中当我put相同的key值得时候,它会覆盖第一次添加的东西。
补充:
自己开发arraylist时考虑数组扩容
数组扩容:
1新建一个数组长度为原来数组长度两倍的数组,
2 将原来数组中的内容拷贝到新的数组
3将全局变量的数组引用指向新的数组
数组扩容的另一种高性能方法:system.arraycopys( )方法,但是不好用
还有一种:Arrays.copyof
研究:hashMap源代码