集合:
集合类(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。
Collection和Collections的区别:
Collection:是顶级集合接口,可以对集合中的元素进行“增删改查”的操作,并且可以调用ArrayList、Vector、LinkedList、HashSet、TreeSet等子类的方法。
Collections:是对集合操作的工具类,可对集合按自然顺序的升序进行排序。
LinkedHashSet和LinkedHashMap:
通过链表保证有序,通过哈希值保证唯一;
LinkedHashSet:保证元素有序,唯一;
LinkedHashMap:保证键有序,唯一。
增强for循环:
格式:for(数据类型 变量名:数组或Collection集合){
执行语句;
}
好处:简化了集合和数组的遍历。
静态导入:(了解)
格式:import static 包名.类名.方法名
好处:可以省略写类名,一般不使用
可变参数用法:
格式:返回值类型 函数名(形式参数...变量名){
执行语句;
}
注意:这个时候的变量名是一个数组名。
如果形参中有可变参数,那么可变参数必须放在最后
例如:
Private static int sum(int b,int...a)