一.Java集合框架
说明:对于以上的框架图有如下几点说明
1.所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
2. 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。
3. 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。
4. 实现类:8个实现类(实线表示),对接口的具体实现。
5.Set、List和Map可以看做集合的三大类:
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
二.Collection
集合接口:Collection(无序,可重复的一组数据)
Collection常用的方法
此外还有:
toArray()方法 返回一个表示集合的数组。
iterator()方法 返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。
1.List
List(接口):有序(插入顺序),可重复的
常用的两个实现类ArrayList,LinkedList
a . ArrayList
1)基本知识
以数组作为底层存储
1.插入前先判断容量是否越界,则扩容
a.扩容后比数组最大长度大,则是int的最大值作为数组长度,还没达到数组最大长度,则就是数组最大长度
b.正常来说扩容1.5倍,如果扩容1.5倍以后还不够,则直接把当前长度赋值给数组新长度
c.如果是新数组和把长度与10比较,大的复制给新数组长度
2.不需要扩容则直接插入
Vector:ArrayList的线程安全版,在多线程的状况下使用
由于底层是数组,遍历方便,随机访问方便,改动对应方便
2)ArrayList常用方法
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList array=new ArrayList();//声明并分配空间
//元素的增加
array.add("我");
array.add("123");
array.add("mini");
//指定下标插入元素,同时把后面的元素后移
array.add(0,"hi");
//元素的删除,两种方法,移除具体对象或者移除指定下标元素
array.remove("123");
array.remove(1);
//指定下标修改元素
array.set(1,"big");
System.out.println(array);
}
}
效果图
[hi, big]
3)ArrayList的遍历(3种)
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList array=new ArrayList();
array.add("我");
array.add("爱");
array.add("吃");
//for循环遍历
for (int i = 0; i <array.size(); i++) {
System.out.println(array.get(i));//获取对应的下标元素
}
//增强for遍历
for (Object o : array) {//for(数据类型 变量名:遍历的目标)
System.out.println(o);
}
//迭代器
Iterator it=array.iterator();
while (it.hasNext()){
Object o=it.next();//如果需要使用当前元素多次,则用变量接受
System.out.println(o);//多次调用时,直接用接受的变量即可
}
}
}
效果图
我
爱
吃
public class TitleList {
public static void main(String[] args) {
ArrayList titles=new ArrayList();
Title t=new Title();
t.setId(1);
t.setName("读者");
t.setCreator("小陈");
Title t2=new Title(2,"格林","小陈");
titles.add(t);
titles.add(t2);
System.out.println(titles);
for (Object title : titles) {
//instanceof 是 Java 的保留关键字。
// 它的作用是测试它左边的对象是否是它右边的类的实例,
// 返回 boolean 的数据类型
if (title instanceof Title){
Title t1=(Title) title;
System.out.println(t1.getName());
}
}
}
}
效果图
[1读者小陈, 2格林小陈]
读者
格林
b . LinkedList
1)基本知识
以链表作为底层存储
链表:多个node互相存储地址,以下一个node的地址存储
根据Node对象中的Node属性next和prev来确定顺序
遍历很不方便,增加node和删除node(插入和删除元素)会很快
2)LinkedList常用方法
public class Node {//模拟链表的每一个节点
public Object element;
//下一个
public Node next;
//上一个,如果不定义上一个,则是单向链表
public Node pre;
public static void main(String[] args) {
Node n1=new Node();
n1.element="我是第一个";
Node n2=new Node();
n2.element="我是第二个";
n1.next=n2;
Node n3=new Node();
n3.element="我是第三个";
n2.next=n3;
n2.pre=n1;
n3.pre=n2;
}
}
3)LinkedList的遍历(3种)
public class TestLinkedList {
public static void main(String[] args) {
LinkedList list=new LinkedList();
list.add("a");
list.add(0,"pei");
list.addFirst("number1");
//for循环遍历
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));
}
//增强for遍历
for (Object o : list) {
System.out.println(o);
}
//迭代器遍历
Iterator it=list.iterator();
while (it.hasNext()){
Object ob=it.next();
System.out.println(ob);
}
}
}
效果图
number1
pei
a
2.Set
set:不可重复(元素),无序的
HashSet是Set接口常用的实现类
1)HashSet
是以HashMap的key值的hash码来进行存储(保证唯一,理论上)
Set接口中判断加入对象是否已经存在的方法
采用对象的equals()方法比较两个对象是否相等
set接口没有get()方法,无法按下标查找或遍历
2)Set接口的遍历(2种,因为Set接口没有下标,用不了for循环遍历)
public class TestHashSet {
public static void main(String[] args) {
HashSet set=new HashSet();
set.add("abc");
set.add(123);
//增强for遍历
for (Object o : set) {
System.out.println(o);
}
//迭代器遍历
Iterator it=set.iterator();
while (it.hasNext()){
Object obj=it.next();
System.out.println(obj);
}
}
}
效果图
abc
123
3.Map
1).基本知识
Map继承Collection接口,是Collection的子接口
Map接口存储一组键值对象,提供key到value的映射
包含接口Entry<K,V>
在HashMap中使用Node节点实现了Entry键值对
Node节点用next属性实现了单向链表
map底层entry+单向链表,数组+单向链表
当元素节点个数超过8时,转用红黑树进行底层存储
使用map.remove(Object key,Object value)方法进行删除操作时,必须要key和value都匹配时才能删除
2).Map接口常用方法
public class TestHashMap {
public static void main(String[] args) {
HashMap map=new HashMap();
map.put("CN","中华人民共和国");
map.put("UK","大不列颠");
map.put("US","美利坚合众国");
map.put("RU","俄罗斯联邦共和国");
System.out.println(map);
System.out.println(map.get("CN"));
map.put("US","美国");//修改,map.replace()修改方面基本一致
map.remove("RU");
map.remove("US","美国");//必须要key和value都匹配时才能删除
System.out.println(map);
System.out.println(map.size());
System.out.println(map.containsKey("CN"));
System.out.println(map.containsValue("美国"));
map.clear();
if (map.isEmpty()){
System.out.println("已清空");
}
}}
效果图
{RU=俄罗斯联邦共和国, UK=大不列颠, CN=中华人民共和国, US=美利坚合众国}
中华人民共和国
{UK=大不列颠, CN=中华人民共和国}
2
true
false
已清空
3).遍历Map集合
public class TestStudentDemo {
public static void main(String[] args) {
HashMap map=new HashMap();
map.put("1","rose");
map.put("2","jay");
//遍历,键值对的映射
Set entrys=map.entrySet();
for (Object o : entrys) {
System.out.println(o);
}
}
}
效果图
1=rose
2=jay
4).HashMap
a.获取键
public class TestStudentDemo {
public static void main(String[] args) {
HashMap map=new HashMap();
map.put("1","rose");
map.put("2","jay");
Set key=map.keySet();
for (Object o : key) {
System.out.println(o);
System.out.println(map.get(o));
}
}
}
效果图
1
rose
2
jay
b.获取值
public class TestStudentDemo {
public static void main(String[] args) {
HashMap map=new HashMap();
map.put("1","rose");
map.put("2","jay");
Collection values=map.values();
for (Object o : values) {
System.out.println(o);
}
}
}
效果图
rose
jay
5).练习
学生类
public class StudentDemo {
private String name;
private String sex;
@Override
public String toString() {
return "对应的学员姓名是:" +
getName() + ",性别是:" +getSex();
}
public StudentDemo() {
}
public StudentDemo(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
测试类
public class TestStudentDemo {
public static void main(String[] args) {
StudentDemo stu=new StudentDemo("李明","男");
HashMap map=new HashMap();
map.put("Jack",stu);
Set key=map.keySet();
for (Object o : key) {
System.out.println(o+""+map.get(o));
}
}
}
效果图
Jack对应的学员姓名是:李明,性别是:男
三.泛型
1.定义
2.泛型集合
3.练习
学生类同上
测试类
public class TestStudentDemo {
public static void main(String[] args) {
StudentDemo stu=new StudentDemo("李明","男");
HashMap<String,StudentDemo> map=new HashMap<>();
map.put("Jack",stu);
Set<String> key=map.keySet();
for (Object o : key) {
System.out.println(o+""+map.get(o));
}//使用泛型的时候,可以使用集合输入类型
}
}
效果图同上
四.Collections算法类
Collections类常用方法
Collections排序
自定义entry