一 集合
Java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象。
对象存入集合都会变成Object类型,取出时需要类型转换。
Java集合框架体系结构
根接口 | 子接口 | 特点 | 接口的实现类 |
Collection | List | 排列有序,可重复(序列) | ArrayList 数组序列 LinkedList |
Queue | LinkedList 链表 | ||
Set | 元素无序,不可重复 | HashSet 哈希集 | |
Map | 以<Key,Value>两个对象为一个映射去存储数据,这样一个映射就是一个Entry类(键值对)的实例。 Entry类是Map的一个内部类。 | HashMap 哈希表 | |
其他的几个主要成员如下: | |||
Comparable接口 | |||
Comparator接口 | |||
Collections工具类 |
二 Collection接口
ArrayList
ArrayList底层是由数组实现的。
方法 | 参数 | 备注 |
addAll | Collection的一个实例 | Arrays.asList(数组名),可以将数组转换为List |
遍历ArrayList
1. 未指定list中存放什么数据类型
public List courseLit;
public void getListObject() {
for(Object a:courseLit) {
//一个元素要存入到集合中去的时候,它的类型是被忽略了的,即集合只拿它当Ojbect用;要先进行类型转换
Course c=(Course)a;
System.out.println(c.id+" "+c.name);
}
}
2. 指定了list中的数据类型
public List<Course> courseLit;
public void getListValue() {
for(Course a:courseLit) {
System.out.println(a.id+" "+a.name);
}
}
3. 通过迭代器遍历li's't
/**
* 通过迭代器来遍历List;
* 在Collection接口中定义了iterator()方法, 通过这个方法可以返回一个当前集合对象的迭代器,
* 然后通过这个迭代器去遍历当前集合中的每一个元素
* 迭代器Iterator也是接口
* hasNext() 如果还有元素,就返回一个真值;next()方法取得具体的某个元素
*
*/
public void testIterator() {
//通过集合的iterator()方法,取得迭代器的实例
Iterator it=courseLit.iterator();
while(it.hasNext()) {
Course c=(Course) it.next();
System.out.println(c.id+" "+c.name);
}
}
removeAll
Course c[]= {courseLit.get(3),courseLit.get(4)};
courseLit.removeAll(Arrays.asList(c));
泛型
集合中的元素,可以是任意类型的对象(对象的引用),如果把某个对象放入集合,则会忽略它的类型,而把他当作Object处理,取出的时候,也是当作一个Object取出。
泛型规定了某个集合只能存放特定类型的对象,并且会在编译期间进行类型检查。
- 泛型集合中,可以存入泛型类型的对象实例以及泛型的子类型的对象实例。
- 泛型集合中的限定类型不能使用基本数据类型
- 可以通过使用包装类限定允许存入的基本数据类型
Set
Set中,添加某个对象,无论添加多少次,最终只会保留一个该对象(的引用),并且保留的是第一次添加的那一个。
contains方法
判断是否包含某个元素。
- 当调用List的contains方法的时候,其实就相当于遍历list中的每一个元素,然后调用每个元素的equals(Object obj)方法,去跟contains方法中的参数进行比较,如果有一个元素的equals方法返回true值,则contains方法返回true值。
- Object的hashCode()方法返回的是对象的哈希码的值,当调用HashSet类的contains方法的时候,先调用每一个元素的hashCode()方法来返回哈希码,如果哈希码的值相等的情况下,再调用equals(obj)方法去判断是否相等;只有这两个方法所返回的值都相等的情况下,才认为这个HashSet包含某个元素。
- Eclipse可以自动生成equals()和hashCode()方法
重写equals方法
@Override
public boolean equals(Object obj) {
if (this == obj)// 同一个对象
return true;
if (obj == null)
return false;
if (!(obj instanceof Course))
return false;
Course course = (Course) obj;
if (this.name == null) {
if (course.name == null)
return true;
return false;
}
if (this.name.equals(course.name))
return true;
return false;
}
//Eclipse自动生成的equals方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Course other = (Course) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Course))
return false;
Course other = (Course) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
indexOf方法
取得某元素的索引位置(List)。
indexOf的实现机制:与contains方法类似,从序列的第0个位置开始,依次循环,调用每个元素的equals()方法, 去和参数对象进行比较,如果某个元素的equals方法返回值为true,则把该元素的索引位置作为结果返回。假如序列中有多个重复的元素,只返回该元素第一次出现时所在的位置。找不到时返回-1。
三 Map
Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够根据key快速查找value.
- Key和Value可以是任意类型的对象
- Map中的键值对以Entry类型的对象实例形式存在
HashMap类
- 基于哈希表实现
- HashMap中的Entry对象是无序排列的
- Key值和Value值均可为null,但一个HashMap只能有一个key值为null的映射(key值不可重复)
遍历Map
通过entrySet方法遍历
public Map<String,Student> students;
public void disStuEntry() {
System.out.println("目前学生有:");
Set<Entry<String, Student>> s=students.entrySet();//Entry也有泛型
for (Entry<String, Student> entry : s) {
System.out.println(entry.getKey()+" "+entry.getValue().name);
}
}
通过keySet遍历
public void getStu() {
Set<String> st=students.keySet();//返回键的集合
System.out.println("添加的学生如下:");
for (String string : st) {
System.out.println(students.get(string).name);
}
}
修改Map
用put方法修改Map中的已有映射
练习代码: https://www.imooc.com/article/309956
containsKey() | 判断是否包含某个key值 |
containsValue() | |
containsKey
public Map<String, Student> students = new HashMap<String, Student>();
System.out.println(t.students.containsKey("1")); //比较的是key的值
containsValue
Value比较的是用equals()方法,如果只是想比较值相等,需要重写equals方法。
public void testContains() {
Scanner sc=new Scanner(System.in);
System.out.println("请输入要查询的姓名:");
String name=sc.next();
if(students.containsValue(new Student(null,name)))
//students的value是个Student类型,所以需要new一个Student对象;判断是否存在一个学生姓名为name的学生对象
System.out.println("yese");
else
System.out.println("no");
}