Collection

Collection

   

List集合

   

/**

* 集合中常见的方法:

* boolean add(object element) 向集合中添加元素

*

*addAll() 将集合的所有元素加到

* void clear() 清空集合

* boolean contains(Object o) 看集合中是否包含某个元素

* Iterator<E> iterator() 获取集合所属的迭代器

* boolean Remove(Object o) 删除某个元素

* int size() 获取集合大小

* Object[] toArray();将集合转换成数组

*

*

*/

   

以上方法的详解:

//创建集合

Collection c=new ArrayList();//多态 父类型引用指向子类型对象

 

//添加元素

c.add(1);

 

//获取集合大小

System.out.println(c.size());

 

//是否为空

System.out.println(c.isEmpty());

 

//将集合        转化为 Object 数组

c.toArray();

 

//清空

c.clear();

   

   

//关于contains() 方法:

Integer i1=new Integer(10);

c.add(i1);

   

System.out.println(c.contains(i1));//true

   

Integer i2=new Integer(10);

   

System.out.println(c.contains(i2));//true

//原因,contains 方法底层调用的是equals 方法,如果 equals 返回的是 true表明就是包含

//存储在集合中的对象都要重写 equals 方法

   

   

//关于 remove 方法:重写 equals 方法,以及remove() 方法的详解:

   

Integer i3=new Integer(16);

c.add(i3);

   

Integer i4=new Integer(16);

c.remove(i4);//0

   

System.out.println(c.size());//0

原因:在调用remove() 方法时,是按照equals 方法查找,找到与要移除的元素相等的就移除

以上i3,i4 的值相等,所以c.remove(i4 ) 实际上是 c.remove(16).

   

   

/**

* collection remove Iterator remove 有什么区别

* 当使用 collection的方法删除元素之后,删除了一个元素之后,collection Iterator 就改变了需要生成另一个 迭代器

* 所以推荐使用 iterator remove 方法。

*

*/

   

//创建一个集合

Collection c = new ArrayList();

//添加元素

c.add(1);

c.add(2);

c.add(3);

//声明一个 迭代器

Iterator it = c.iterator();

   

while (it.hasNext()) {

it.next();

it.remove(); //调用 迭代器的remove() 方法

   

/**

* Object o=it.next();//调用集合的 remove() 方法

* c.remove(o);

*/

   

}

   

关于List 的子类 ArrayList Vector LinkedList 的详解:

   

   

/**

* List 集合的特点:

*                 元素有序 (有下标,可以通过下标访问),存进去是什么样的,就是什么样的

*                 元素可重复

* 常见方法:

*                 add();//在列表尾部添加元素

*

* ArrayList()

*                  底层是由数组实现,默认长度是 10 ,扩大之后的容量为原来的1.5

*                 ArrayList add(int index,E element); //在列表的指定位置添加元素

* vector 集合,底层默认初始化,容量也是10,扩大之后的容量是原来的两倍

* 如何优化:

*                 尽量减少扩容操作,因为扩容需要数组拷贝,数组拷贝很消耗内存,

*

*

*/

//创建list

List l=new ArrayList();

//添加元素

l.add(1);

l.add(32);

l.add(1,555);//在下标为1 的地方添加 555

System.out.println(l.get(0));//取出下标为0 的元素

   

//遍历方法一

Iterator it=l.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

   

//遍历方法二

for(int i=0;i<l.size();i++){

Object element=l.get(i);

System.out.println(element);

}

   

   

关于Set

Collection

   

   

/**

* HashStet 底层是HashMap,hashMap 底层就是散列表/hash

*                 hash表示数组和单向链表的结合,hash表本质是一个数组,只不过这个数组中的元素是一个单向链表

*                 链表的结构是这样的         Object key,

*                                         Object value;

*                                         final int hash;

*                                         Entry next;

*                 添加元素的方法:void put(Object key,Object value)

*                         添加元素时,通过hash 函数,计算出key hashcode 值,然后和已有的 hashcode值进行比较:

*                         如果存在,就在hashcode 值相等的这个链表之中依次比较value值,如果value值夜相等,那么这个元素就已经存在,不用添加

*                         如果value值不相等,则把这个元素添加到链表的后面。

*                         如果在value hashcode 值从一开始就不存在,就把这个元素加到数组的后面。

*                 查询元素的方法:Object get(Object key)

*                         计算出key hashcode 值,然后再根据hashcode 值进行定位,如果hashcode不存在,则不存在这个元素

*                         如果hashcode存在,然后就在相同hashcode的这个链表中 比较value 的值

*

*                         

*

*/

Collection

* 5.hashmaphashset的默认初始化容量都是 16,默认的加载因子为0.75 ()

* 什么是加载因子: 简单的说,设,一个数组长度为100,加载因子为0.75 ,当数组加载到75时,数组就开始扩容

/**

* 关于往Set集合中存储的元素,该元素的 hashcode() equals() 方法

* hashmapz中有一个put 方法,put(key,value),key 是无序不可重复的

*

* 当往hashset()以及hashMap() 中添加元素的时候需要重写,equals() 以及hashCode()方法

*/

 

   

   

TreeSet

   

/**

* SortedSet 是继承自set 的一个接口

* java.util.set 父接口

*                 java.util.sortedSet 子接口 无序不可重重复,就是,那个啥,存入数组之后会按元素值得大小排序。可以排序的有,数字,字符串,日期

*                         java.util.TreeSet 实现类

*

* sorted 是如何实现排序的         

*                 因为被存储的元素实现了comparable 接口

*                 sun编写TreeSet 集合在添加元素的时候,会调用CompareTo()

* 有两种方法:

*                 一种是实现comparable 接口,然后实现那个什么的 compareTo方法

*                 

*                 一种是单独编写一个比较器,就是 实现 comparator接口,推荐使用, 单独写一个比较器。

*

*/

eg

public class User implements Comparable{//实现comparable 接口

   

int age;

   

public User(int age) {

this.age = age;

}

   

@Override

public String toString() {

return "User [age=" + age + "]";

}

   

   

public int getAge() {

return age;

}

   

public void setAge(int age) {

this.age = age;

}

   

/**

* 实现java.util.Comparabl,接口中的就是 compableTo()方法

* comaparable 底层是二叉树

*/

@Override

public int compareTo(Object o) {

int age1=this.age;

int age2=((User)o).age;

return age1-age2;

}

   

}

   

Eg:

public class Product {

double prices;

   

@Override

public String toString() {

return "Product [prices=" + prices + "]";

}

   

public Product(double prices) {

this.prices = prices;

}

   

public double getPrices() {

return prices;

}

   

public void setPrices(double prices) {

this.prices = prices;

}

   

   

}

   

   

//重写一个 Comparator 接口,就是重新写一个 Comparator

class ProductComparator implements Comparator{

@Override

public int compare(Object o1, Object o2) {

double prices1=((Product)o1).prices;

double prices2=((Product)o2).prices;

if(prices1==prices2){

return 0;

}else if(prices1>prices2){

return 1;

}else{

return -1;

}

}

   

}