一、集合
1、什么是集合?
集合是将多个元素组成一个单元的对象。
是一种操作批量数据的工具。
为了满足不同场合的需要,java.util包中包含有一系列集合类;
如:ArrayList类、LinkedList类、Vector类、HashMap类等等。
集合类中只能存放对象,而不能存放原始数据类型的元素,所以当有原始数据类型需要存放时,只能将其转换成相应的包装类对象。
Java集合框架,为我们提供了一套性能优良、使用方便的接口和类,我们不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出现的问题了。
任何对象加入集合类后,自动转变为Object类型;取出时,需要进行强制类型转换,恢复为特定的类型。
2、集合与数组的区别
数组:
- 长度是固定的(一经创建,就不可再改变)
- 只能存放相同数据类型的元素
- 数组本身提供相应的工具操作数据
集合:
- 集合的长度没有限制,可以存放任意多的元素
- 元素的数据类型也可以不同
- 集合还提供一系列操纵数据的方法,如存储、检索等等;可以使用工具Collections自由操作集合中数据
二、ArrayList
ArrayList是长度可变的对象引用数组,称为动态数组。
随着元素的添加,元素数目的增大,数组容量也会随之自动扩展。
访问和遍历数组元素时,ArrayList的性能优越。
ArrayList类继承了AbstractList类并实现了List接口。
例1:
package test;
import java.util.ArrayList;
import java.util.List;
public class TestArrayList {
public static void main(String[] args) {
List l = new ArrayList();
l.add(12); //int
l.add(3.56f); //float
l.add(4.13636215d); //double
l.add("abc"); //String
System.out.println("集合大小:"+l.size());
Object o = l.get(1);
String a = o.toString();
System.out.println("编号为1的数据:"+a);
l.remove(2);
l.add("cde"); //String
//显示删除编号为2的数据后,集合中余下的所有内容。
for (int i = 0; i < l.size(); i++) {
Object o1 = l.get(i);
System.out.println("所有数据:"+o1.toString());
}
System.out.println("判断集合中数据是否为空:"+l.isEmpty());
System.out.println("判断集合中指定数据 12 是否存在:"+l.contains(12));
if(l.indexOf(12) < 0) {
System.out.println("12在集合中不存在");
} else {
System.out.println("12在集合中存在,索引为:" + l.indexOf(12));
}
}
}
例2:
package test;
import java.util.ArrayList;
public class TestArrayList {
public static void main(String[] args) {
ArrayList al = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Integer num = new Integer(i);
al.add(num);
}
System.out.println("数组中的元素:");
for (int i = 0; i < al.size(); i++) {
// System.out.println(al.get(i));
Integer temp = (Integer) al.get(i);
System.out.println(temp);
}
System.out.println("********************");
al.clear();
System.out.println("数组被清空后的情况:");
System.out.println("数组长度:"+al.size());
if(al.isEmpty()) {
System.out.println("数组现在为空");
} else {
System.out.println("数组现在不为空");
}
}
}
例3:
开发一套小型的新闻管理系统,要求如下:
1、可以存储各类新闻标题(包含ID、名称、创建者、创建时间)
2、可以获取新闻标题的总数
3、可以逐条打印每条新闻标题的名称
// NewsTitle.java
package test;
import java.util.Date;
public class NewsTitle {
private int id; // 新闻id
private String titleName; // 新闻名称
private String creater; // 新闻创建者
private Date createTime; // 创建时间
public NewsTitle(int id, String titleName, String creater, Date createTime) {
super();
this.id = id;
this.titleName = titleName;
this.creater = creater;
this.createTime = createTime;
}
public String getTitleName() {
return titleName;
}
public void setTitleName(String titleName) {
this.titleName = titleName;
}
}
// TestNewsTitle.java
package test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class TestNewsTitle {
public static void main(String[] args) {
NewsTitle car = new NewsTitle(1, "汽车", "管理员", new Date());
NewsTitle people = new NewsTitle(2, "人", "管理员", new Date());
List newsTitleList = new ArrayList();
newsTitleList.add(car);
newsTitleList.add(people);
System.out.println("新闻数目:" + newsTitleList.size());
print(newsTitleList);
}
private static void print(List newsTitleList) {
for (int i = 0; i < newsTitleList.size(); i++) {
NewsTitle newsTitle = (NewsTitle) newsTitleList.get(i);
System.out.println((i+1) + ":" + newsTitle.getTitleName());
}
}
}
三、LinkedList
1、LinkedList类继承了AbstractSequentialList类,并实现了List接口
2、LinkedList 类用于创建链表数据结构
3、插入或者删除元素时,它提供更好的性能。与ArrayList相比,如果需要频繁地添加和删除元素,LinkedList的性能更加优越。
4、链表中元素的数量不受任何限制,可以随意地添加和删除。
例1:
升级这套小型的新闻管理系统,要求如下:
1、可以添加头条新闻标题
2、可以删除末条新闻标题
// NewsTitle.java
package test;
import java.util.Date;
public class NewsTitle {
private int id; // 新闻id
private String titleName; // 新闻名称
private String creater; // 新闻创建者
private Date createTime; // 创建时间
public NewsTitle(int id, String titleName, String creater, Date createTime) {
super();
this.id = id;
this.titleName = titleName;
this.creater = creater;
this.createTime = createTime;
}
public String getTitleName() {
return titleName;
}
public void setTitleName(String titleName) {
this.titleName = titleName;
}
}
// TestNewsTitle.java
package test;
import java.util.Date;
import java.util.LinkedList;
public class TestNewsTitle {
public static void main(String[] args) {
NewsTitle car = new NewsTitle(1, "汽车", "管理员", new Date());
NewsTitle people = new NewsTitle(2, "人", "管理员", new Date());
// List newsTitleList = new LinkedList(); 这样写,无法调用LinkedList的方法
LinkedList newsTitleList = new LinkedList();
newsTitleList.addFirst(car);
newsTitleList.addLast(people);
NewsTitle firstNews = (NewsTitle) newsTitleList.getFirst();
System.out.println("头条新闻标题是:" + firstNews.getTitleName());
NewsTitle lastNews = (NewsTitle) newsTitleList.getLast();
System.out.println("末条新闻标题是:" + lastNews.getTitleName());
newsTitleList.removeFirst();
newsTitleList.removeLast();
}
}
例2:
package test;
import java.util.LinkedList;
public class TestLinkedList {
public static void main(String[] args) {
LinkedList ll = new LinkedList();
for (int i = 0; i < 10; i++) {
Double temp = new Double(Math.sqrt(i));
ll.add(temp);
}
System.out.println("链表中的元素:");
for (int i = 0; i < ll.size(); i++) {
System.out.println(ll.get(i));
}
System.out.println("******************");
ll.removeFirst();
ll.removeLast();
System.out.println("删除第1个元素和最后1个元素后的链表:");
for (int i = 0; i < ll.size(); i++) {
System.out.println(ll.get(i));
}
}
}
四、vector
Vector类与ArrayList类和LinkedList类很相似,最大的区别在于Vector是线程同步的。
如果在多线程的程序中要使用到集合框架,并且不希望线程与线程之间相互干扰,那么Vector是不错的选择。
Vector类继承于AbstractList类,并实现了List接口。
例:
package test;
import java.util.Vector;
public class TestVector {
public static void main(String[] args) {
Vector v = new Vector();
v.addElement("C");
v.addElement("Java");
v.addElement("Python");
System.out.println(v.toString());
v.removeElement("Java");
System.out.println(v.toString());
}
}
五、Map和HashMap
Map接口用于维护“键-值对”的关联性,可以通过键查找值;HashMap是Map接口的一个具体实现类。
对于HashMap来说,不存在索引,也就是说不可以通过索引来访问元素,只能通过键去访问值。
由于没有索引,所以HashMap中元素的存放是没有顺序的。
如要快速检索元素的话,HashMap性能优越。
HashMap类继承了AbstractMap类,并实现了Map接口。
例:
package test;
import java.util.HashMap;
public class TestHashMap {
public static void main(String[] args) {
HashMap hm = new HashMap();
hm.put("93-07", "张三");
hm.put("84-12", "李四");
hm.put("94-02", "王五");
System.out.println(hm.toString());
System.out.println("学号是84-12的学生是:" + hm.get("84-12"));
hm.remove("93-07");
System.out.println(hm.toString());
}
}
五、Set和HashSet
HashSet:对象不能相同。
HashSet如何判断2个对象是否相同?
答:在内部比较的时候,会调用这个对象的2个方法:equals和hashcode。