黑马程序员_java之集合

------- android培训java培训、期待与您交流! ----------

集合:

集合类(Collection):java中数据的操作大部分以对象体现,为了方便对多个对象进行存储和操作,java提供的容器。

1、特点:集合类只用于存储对象,长度是可以改变的。

2、数组和集合的区别:

数组:

数组存储的是同一种类型的元素;

数组可以存储基本数据类型,引用类型;

数组的长度固定。

集合类:

集合类可以存储不同类型的元素;

集合类只能存储对象类型;

集合类的长度可变。

3、Collection接口中的功能:

A:添加元素

boolean add(Object obj)添加一个元素

boolean addAll(Collection c)添加一个集合的元素

B:删除元素

boolean remove(Object obj)移除集合中指定元素

boolean removeAll(Collection c)移除集合中指定小集合所有元素

void clear()移除所有元素

C:判断

boolean contains(Object obj)判断集合是否有指定元素

boolean containsAll(Collection c)判断集合是否包含一个小集合

boolean isEmpty()判断集合是否为空

D:遍历

Iterator iterator()遍历集合中的元素

E:转成数组

Object[] toArray()把集合变成数组

4、代码体现(用集合类方法):

public class CollectionDemo{

public static void main(String[] args){

//创建一个集合类

Collection c = new ArrayList();

//创建自定义对象

Student s1 = new Student(“A”,21);

//将定义的对象传到集合中

c.add(s1);

//遍历集合对象,使用Iterator迭代器

Iterator it = c.iterator();

//判断迭代器中是否还有元素

While(it.hasNext()){

//获取元素

Student s = (Student)it.next();

System.out.println(s);

}

}

}

5、代码体现(用数组方法):

public class ArrayDemo{

public static void main(String[] args){

//创建数组对象

Student[] array = new Student[2];

//创建自定义对象

Student s1 = new Student();

array[0] = s1;

array[1] = s2;

//遍历数组

for(int i=0;i<array.length;i++){

//获取元素

Student s = new array[i];

System.out.println(s);

}

}
}

集合的体系:

Collection:

|--List:元素有序(存入和取出顺序一致),可重复

|--ArrayList: 底层数据结构是数组,查询快,增删慢

 线程不安全,效率高

|--Vector:    底层数据结构是数组,查询快,增删慢

     线程安全,效率低

|--LinkedList:底层数据结构是链表,查询慢,增删快

     线程不安全,效率高

|--Set:元素无序,不可重复

|--HashSet:底层数据结构是哈希表,这种结构其实就是对哈   希表的存储。

|--TreeSet(排序,保证元素唯一):

 底层数据结构是二叉树数据结构,这种结构可以提  高排序性能(左中右取法)

HashSet如何保证元素唯一性:

HashSet存储元素时,存储的其实是元素的哈希值,默认的每个对象的哈希值是不一样的。这样,元素就可以添加到集合中,先重写hashCode,再根据自己需求重写equals。

代码体现(重写hashCode和equals):

//重写equals

public boolean equals(Object obj){

//提高效率

if(this==obj){

return true;

}

//提高程序的健壮性

if(!(obj instanceof obj)){

return false;

}

//向下转型

Student s = (Student)obj;

return this.name.equals(s.name)&&this.age==s.age;

}

//重写hashCode

public int hashCode(){

return this.name.hashCode()+this.age*18;

}

TreeSet如何保证元素的唯一性:

根据Comparable接口的compareTo方法或者Comparato接口的compare方法的返回值是否为0来确定是否是重复元素,如果是0,就不添加元素。

1、让元素具备比较性:(Comparable---compareTo)

实现Comparable接口:

public class Teacher implements Comparable<Teacher>{

......

get/set...

toString...

public int compareTo(Teacher t){

//比较

......

}

}

2、让集合具备比较性:(Comparator---compare)

实现Comparator接口:

public static void main(String[] args){

TreeSet<Teacher> ts = new TreeSet<Teacher>

 (new Comparator<Teacher>(){

public int compare(Teacher t1,Teacher t2){

//比较

......

}

});

}

......

Map集合类:

定义:是键值对的集合,它的元素是成对出现的。

1、特点:

是一个双列集合;

Map一次存一对元素,以键值对的形式存在,键和值有对应关系;

Map集合中必须要保证集合的唯一性。

2、Map和Collection的区别:

Collection是单列集合;

Collection存储的是单个元素;

Collection中List不需要保证元素唯一性,Set需要保证元素唯一性。

3、Map的遍历思路:

  (1)思路1:获取所有键的集合keySet(),返回值类型Set()

遍历键的集合,得到每一个键Iterator

在根据键获取对应的值,value get(key)

  代码体现:(遍历)

Set<String> set = map.keySet();

Iterator<String> it = set.iterator();

While(it.hasNext()){

String key = it.next();

String value = map.get(key);

Sop(key+***+valye);

}

   (2)思路2:Set<Map.Entry<K,V>>,entrySet(),“对”实现。

代码体现:(遍历)

Set<Map.Entry<String,String>> set = map.entrySet();

Iterator<Map.Entry<String,String>> it = set.iterator();

While(it.hasNext()){

Map.Entry<String,String> m = it.next();

String key = m.getKey();

String value = m.getValue();

Sop();

}

面试题:

HashMap和HashTable的区别:

HashMap:线程安全,效率低;键和值都不能为null;

HashTable:线程不安全,效率高;键和值都可以为null。

CollectionCollections的区别:

Collection:是顶级集合接口,可以对集合中的元素进行“增删改查”的操作,并且可以调用ArrayListVectorLinkedListHashSetTreeSet等子类的方法。

Collections:是对集合操作的工具类,可对集合按自然顺序的升序进行排序。

LinkedHashSetLinkedHashMap

通过链表保证有序,通过哈希值保证唯一;

LinkedHashSet:保证元素有序,唯一;

LinkedHashMap:保证键有序,唯一。

增强for循环:

格式:for(数据类型 变量名:数组或Collection集合){

执行语句;

}

好处:简化了集合和数组的遍历。

静态导入:(了解)

格式:import static 包名.类名.方法名

好处:可以省略写类名,一般不使用

可变参数用法:

格式:返回值类型 函数名(形式参数...变量名){

执行语句;

}

注意:这个时候的变量名是一个数组名。

  如果形参中有可变参数,那么可变参数必须放在最后

例如:

    Private static int sum(int b,int...a)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值