概述
1、Collection集合的继承结构图、以及各个集合的特性和数据结构。
Map集合的继承结构图
2、 关于java.util.Collection接口中常用的方法
Collection中存放的元素:没有泛型--->Object(老祖宗)的所有子类型
有泛型--->只能存储某个具体的类型。
boolean | add(Object o) | 向集合中添加元素 |
int | size() | 获取集合中元素的个数 |
void | clear() | 清空集合 |
boolean | contains(Object o) | 判断当前集合中是否包含o,包含返回true,不包含返回false |
boolean | remove(Object o) | 删除集合中的某个元素 |
boolean | isEmpty() | 判断该集合中元素的个数是否为0 |
Object[ ] | toArray() | 把集合转换成数组 |
JDK1.8的中文文档:
链接:https://pan.baidu.com/s/1J0pTghuqXDIsPWRe7GZniQ
提取码:zsbl
3.1、创建没有带有泛型的集合。 3、可以利用继承与实现关系,创建List集合:ArrayList、LinkedList、Vector;或者创建Set集合:HashSet、TreeSet。
// 创建List类型的集合。
List myList = new LinkedList();
List myList = new Vector();
List myList = new ArrayList();
// 创建Set类型的集合。
Set set = new HashSet();
Set set = new TreeSet();
3.2、引入泛型机制
引入泛型的好处:
第一:集合中存储的元素类型统一了。 第二:从集合中取出来的元素类型是泛型指定的类型,不需要进行大量的“向下转型”(强制类型转换)。
List<Animal> myList = new ArrayList<Animal>();
没有泛型机制的迭代器写法:
Iterator it = myList.iterator();
while(it.hasNext()){
Object obj = it.next();
// obj中没有move方法,无法调用,需要向下转型!
Animal a = (Animal)obj;
a.move();
}
有了泛型机制的迭代器写法:
Iterator<Animal> it = myList.iterator();
while(it.hasNext()){
// 使用泛型之后,每一次迭代返回的数据都是Animal类型。
Animal a = it.next();
// 这里不需要进行强制类型转换了。直接调用。
a.move();
}
3.3、创建带有泛型的集合。
//创建集合对象
ArrayList<String> list = new ArrayList<>();
LinkedList<String> list = new LinkedList<>();
Map<Integer,String> map = new HashMap<>();
HashSet<String> set = new HashSet<>();
TreeSet<Integer> ts = new TreeSet<>();
3.4、附上代码测试集合
3.4.1、ArrayList
遍历方式:迭代器、for下标、增强foreach
package test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
/*
1.1、每个集合对象的创建(new)
1.2、向集合中添加元素
1.3、从集合中取出某个元素
1.4、遍历集合
*/
public class ArrayListTest {
public static void main(String[] args) {
//创建集合对象
//ArrayList<String> list = new ArrayList<>();
LinkedList<String> list = new LinkedList<>();
//添加元素
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
//从集合中取出某个元素
//List集合有下标
String firstElt = list.get(0);
System.out.println(firstElt);
//遍历(下标方式)
for (int i = 0; i < list.size(); i++) {
String elt = list.get(i);
System.out.println(elt);
}
//遍历(迭代器方式,这个是通用的,所有的Collection都通用。)
Iterator<String> it = list.iterator();
while(it.hasNext()){
String elt = it.next();
System.out.println(elt);
}
// 遍历(foreach方式)
for (String s : list){
System.out.println(s);
}
}
}
3.4.2、HashMap
为了保证HashMap的特点:无序不可重复
要进行同时重写hashCode()和equals()方法
注意:Integer、String等类型的hashCode和equals放都已经被SUN写好,无需重写了。
package test;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
1.1、每个集合对象的创建(new)
1.2、向集合中添加元素
1.3、从集合中取出某个元素
1.4、遍历集合
*/
public class HashMapTest {
public static void main(String[] args) {
//创建Map集合
Map<Integer,String> map = new HashMap<>();
//添加元素
map.put(1,"zhangsan");
map.put(9,"lisi");
map.put(10,"wangwu");
map.put(2,"king");
map.put(2,"simth"); // key重复value会覆盖。
//获取元素个数
System.out.println(map.size());//4
//取key是2的元素
System.out.println(map.get(2)); //simth
//第一种方式:先获取所有的key,遍历key的时候,通过key获取value
Set<Integer> keys = map.keySet();
for (Integer key : keys){
System.out.println(key + "=" + map.get(key));
}
//第二种方式:是将Map集合转换成Set集合,Set集合中每一个元素都是Node
//这个Node节点中有key和value
Set<Map.Entry<Integer,String>> nodes = map.entrySet();
for (Map.Entry<Integer,String> node : nodes){
System.out.println(node.getKey() + "=" + node.getValue());
}
}
}
3.4.3、HashSet
遍历方式:迭代器、增强foreach
放到HashMap集合key部分的元素其实就是HashSet集合中了。
所以HashSet集合中的元素也需要同时重写hashCode()+equals()方法。
用IDEA集成工具直接生成即可。
当存储的是非Integer、String等类型,是自定义类型时:
package test;
import java.util.*;
/*
1.1、每个集合对象的创建(new)
1.2、向集合中添加元素
1.3、从集合中取出某个元素
1.4、遍历集合
1.5、测试HashSet集合的特点:无序不可重复。
*/
public class HashSetTest {
public static void main(String[] args) {
//创建集合对象
HashSet<String> set = new HashSet<>();
//添加元素
set.add("abc");
set.add("def");
set.add("king");
//set集合中的元素不能通过下标取了。没有下标
//遍历集合(迭代器)
Iterator<String> it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//遍历集合(foreach)
for (String s : set){
System.out.println(s);
}
set.add("king");
set.add("king");
set.add("king");
System.out.println(set.size()); // 3 (后面3个king都没有加进去。)
set.add("1");
set.add("10");
set.add("2");
for(String s : set){
System.out.println("---->" + s);
}
// 创建Set集合,存储Student数据
Set<Student> students = new HashSet<>();
Student s1 = new Student(111,"zhangsan");
Student s2 = new Student(222,"lisi");
Student s3 = new Student(111,"zhangsan");
students.add(s1);
students.add(s2);
students.add(s3);
System.out.println(students.size()); // 2
//遍历
for (Student stu : students){
System.out.println(stu);
}
}
}
class Student{
int no;
String name;
public Student() {
}
public Student(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"no=" + no +
", name='" + name + ''' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return no == student.no && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(no, name);
}
}
3.4.4、TreeSet
遍历方式:迭代器、增强foreach
TreeSet集合中存储自定义类型:
需要实现对存储的自定类型进行(比较)。
实现比较的两种方式:
(1)实现Comparable接口。
class A implements Comparable<A>{
public int compareTo(A o) {
}
}
(2)实现Comparator接口。(比较器)
采用实现接口的方式:
class BComparator implements Comparator<B>{
@Override
public int compare(B o1, B o2) {
}
}
采用匿名内部类的方式:
TreeSet<B> bTree = new TreeSet<>(new Comparator<B>() {
@Override
public int compare(B o1, B o2) {
}
});
package test;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
/*
1.1、每个集合对象的创建(new)
1.2、向集合中添加元素
1.3、从集合中取出某个元素
1.4、遍历集合
1.5、测试TreeSet集合中的元素是可排序的。(无序不可重复)
1.6、测试TreeSet集合中存储的类型是自定义的。
1.7、测试实现Comparable接口的方式。
1.8、测试实现Comparator接口的方式(最好测试以下匿名内部类的方式)
*/
public class TreeSetTest {
public static void main(String[] args) {
//集合的创建(可以测试以下TreeSet集合中存储String、Integer的。这些类都是SUN写好的。)
//TreeSet<Integer> ts = new TreeSet<>();
//编写比较器可以改变规则。
TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; // 自动拆箱
}
});
//添加元素
ts.add(1);
ts.add(100);
ts.add(10);
ts.add(10);
ts.add(10);
ts.add(10);
ts.add(0);
//遍历(迭代器方式)
Iterator<Integer> it = ts.iterator();
while(it.hasNext()){
Integer i = it.next();
System.out.println(i);
}
//遍历(foreach)
for (Integer integer : ts){
System.out.println(integer);
}
//TreeSet集合中存储自定义类型
TreeSet<A> aTree = new TreeSet<>();
aTree.add(new A(100));
aTree.add(new A(200));
aTree.add(new A(500));
aTree.add(new A(300));
aTree.add(new A(400));
aTree.add(new A(1000));
//遍历
for (A a : aTree){
System.out.println(a);
}
//TreeSet<B> bTree = new TreeSet<>(new BComparator());
//匿名内部类的方式
TreeSet<B> bTree = new TreeSet<>(new Comparator<B>() {
@Override
public int compare(B o1, B o2) {
return o1.i - o2.i;
}
});
bTree.add(new B(500));
bTree.add(new B(100));
bTree.add(new B(200));
bTree.add(new B(600));
bTree.add(new B(300));
bTree.add(new B(50));
for (B b : bTree){
System.out.println(b);
}
Iterator<B> it2 = bTree.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
}
}
//第一种方式:实现Comparable接口。
class A implements Comparable<A>{
int i;
public A(int i){
this.i = i;
}
@Override
public String toString() {
return "A{" +
"i=" + i +
'}';
}
@Override
public int compareTo(A o) {
//return this.i - o.i; //升序
return o.i - this.i; // 降序
}
}
//第二种方式:
class B{
int i;
public B(int i){
this.i = i;
}
@Override
public String toString() {
return "B{" +
"i=" + i +
'}';
}
}
//比较器
class BComparator implements Comparator<B>{
@Override
public int compare(B o1, B o2) {
return o1.i - o2.i;
}
}
最后
以上就是如意康乃馨为你收集整理的Java集合类(详细)的全部内容,希望文章能够帮你解决Java集合类(详细)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复