目录
1.Java集合概念
- Java中集合类是用来存放对象的
- 集合相当于一个容器,里面包容着一组对象 —— 容器类
- 其中的每个对象作为集合的一个元素出现
2.Java中数组与集合的比较
- 数组也是容器,它是定长的,访问较快,但是数组不会自动扩充
- 数组可以包含基本数据类型或引用类型的对象,而集合中只能包含引用类型的对象
3.Java中集合框架层次结构
4.Collection接口
①一组称为元素的对象
②一个Collection中可以放不同类型的数据
③是Set接口和List接口的父类
④是否有特定的顺序以及是否允许重复,取决于它的实现
- Set - 无序的集合;不允许重复
- List - 有序的集合;允许重复
(1)List接口
用来包含一组有序有重复的对象
List有两种主要的集合实现类:
- ArrayList — ArrayList是线性顺序存储的,是一种线性表
- LinkedList — 相对于List来说,LinkedList最主要的功能方面的增强是可以在List的头部和尾部添加、删除、取得元素,直接提供了这些方法的实现。所以它可以非常方便的实现我们数据结构中的常见的Stack(栈)、queue(队列)等
常见方法:
LinkedList增加的方法:
例子:
package test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
//<>:砖石运算符,用于指定集合类型
ArrayList<String> arrayList = new ArrayList<>();//创建ArrayList集合
LinkedList<String> linkedList = new LinkedList<>();//创建LinkedList集合
//给ArrayList集合添加元素
arrayList.add("string1");
arrayList.add("string2");
arrayList.add("string3");
arrayList.add("string4");
arrayList.add("string5");
arrayList.add("string5");
arrayList.add(null);
System.out.println(arrayList.toString());//[string1, string2, string3, string4, string5, string5, null]
System.out.println(arrayList.indexOf("string5"));//4
System.out.println(arrayList.lastIndexOf("string5"));//5
arrayList.remove(arrayList.size() - 1);//移除最后一个元素
arrayList.set(5, "string6");//替换索引为5的元素
System.out.println(arrayList.toString());//[string1, string2, string3, string4, string5, string6]
Iterator<String> iterator = arrayList.iterator();//返回集合中元素的列表迭代器
while(iterator.hasNext()){//遍历迭代器
System.out.print(iterator.next() + " ");
//string1 string2 string3 string4 string5 string6
}
System.out.println("\n------------------");
//给linkedList集合添加元素
linkedList.add("string1");
linkedList.add("string2");
linkedList.add("string3");
linkedList.add("string4");
linkedList.add("string5");
linkedList.add("string5");
linkedList.add(null);
linkedList.addFirst("string0");//在集合头部添加元素
linkedList.addLast("string6");//在集合尾部添加元素
System.out.println(linkedList.toString());//[string0, string1, string2, string3, string4, string5, string5, null, string6]
System.out.println(linkedList.getFirst());//string0,获取头部元素
System.out.println(linkedList.getLast());//string6,获取尾部元素
linkedList.removeFirst();//移除第一个元素
linkedList.removeLast();//移除最后一个元素
System.out.println(linkedList.toString());//[string1, string2, string3, string4, string5, string5, null]
}
}
(2)Set接口
用来包含一组无序无重复的对象
Set接口的常见实现类
- HashSet — HashSet的特性在于其内部对象的散列存取,即采用哈希技术
- TreeSet — TreeSet存入的顺序跟存储的顺序不同,但是存储是按照排序存储的
例子:
package test;
import java.util.HashSet;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
HashSet<String> hashSet = new HashSet<>();
hashSet.add("123");
hashSet.add("45");
hashSet.add("67");
hashSet.add("89");
System.out.println(hashSet.toString());//[45, 67, 89, 123]
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(123);
treeSet.add(456);
treeSet.add(789);
treeSet.add(156);
System.out.println(treeSet.toString());//[123, 156, 456, 789]
}
}
4.Iterator接口
Iterator是为遍历而设计,能够从集合中取出元素和删除元素,但是没有添加元素的功能;使用中,只能单向移动
(1)Iterator常用方法
(2)例子:
package test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("123");
list.add("456");
list.add("789");
list.add("156");
list.add("178");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String string = iterator.next();
System.out.print(string + " ");//123 456 789 156 178
if(string.equals("156")){//移除元素“156”
iterator.remove();
}
}
System.out.println("\n" + list.toString());//[123, 456, 789, 178]
}
}
5.迭代器模式(重点)
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
(1)创建自定义迭代器接口
package test;
/**
* @author lqh 自定义迭代器
*/
public interface MyIterator<T> {
/**
* 判断游标右边是否有元素
* @return 查询结果
*/
public boolean hasNext();
/**
* 返回游标右边的元素并将游标移动到下一个位置
* @return 游标右边的元素
*/
public T next();
/**
* 删除游标左边的元素,在执行完next之后,该操作只能执行一次
*/
public void remove();
}
(2)自定义集合类
package test;
import java.util.ArrayList;
import java.util.List;
/**
* @author lqh 自定义集合
*/
public class MyList<T> {
private List<T> list = new ArrayList<T>();// 集合属性造假
/**
* 添加元素
*
* @param element
*/
public void add(T element) {
list.add(element);
}
/**
* 获取对应索引的元素
*
* @param index
*/
public void get(int index) {
list.get(index);
}
@Override
public String toString() {
StringBuffer result = new StringBuffer("[");
for (T t : list) {
result.append(t + " ");
}
result.append("]");
return result.toString();
}
public MyIterator<T> iterator() {
return new MyIteratorImpl();
}
/**
* @author lqh 实现自定义迭代器
*/
private class MyIteratorImpl implements MyIterator<T> {
private int index = 0;// 游标指向的位置
@Override
public boolean hasNext() {
boolean isFlag = false;
if (list == null || list.size() == 0) {
isFlag = false;
} else if (index < list.size()) {
isFlag = true;
} else {
isFlag = false;
}
return isFlag;
}
@Override
public T next() {
T element = list.get(index);
index++;
return element;
}
@Override
public void remove() {
index--;
list.remove(index);
}
}
}
(3)测试
package test;
public class Test {
public static void main(String[] args) {
MyList<String> mylist = new MyList<>();
mylist.add("123");
mylist.add("456");
mylist.add("789");
mylist.add("156");
mylist.add("178");
MyIterator<String> iterator = mylist.iterator();
while (iterator.hasNext()) {
String string = iterator.next();
System.out.print(string + " ");// 123 456 789 156 178
if (string.equals("156")) {// 移除元素“156”
iterator.remove();
}
}
System.out.println("\n" + mylist.toString());// [123 456 789 178 ]
}
}
6.Collections类
Collections类是类似于Arrays类的公用工具类 ,它提供了一些static方法供集合类使用或操作集合类
(1)Collections常见方法
(2)例子
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Tom");
list.add("tom");
list.add("atom");
list.add("ctom");
list.add("bcom");
System.out.println("集合中的最大元素为:" + Collections.max(list));//集合中的最大元素为:tom
System.out.println("集合中的最小元素为:" + Collections.min(list));//集合中的最小元素为:Tom
Collections.sort(list);//排序
System.out.println("排序之后集合为:" + list.toString());//[Tom, atom, bcom, ctom, tom]
Collections.reverse(list);//逆序
System.out.println("逆序之后集合为:" + list.toString());//逆序之后集合为:[tom, ctom, bcom, atom, Tom]
}
}
7.自定义比较器(重点)
(1)第一种方式:
创建实体类不实现Comparable接口,并创建自定义比较器
①实体类
package test;
/**
* @author lqh 书本类,不实现Comparable接口
*/
public class Book {
private Integer book_no;//图书编号
private String book_name;//书名
private Double price;//价格
public Integer getBook_no() {
return book_no;
}
public void setBook_no(Integer book_no) {
this.book_no = book_no;
}
public String getBook_name() {
return book_name;
}
public void setBook_name(String book_name) {
this.book_name = book_name;
}
public Book(Integer book_no, String book_name, Double price) {
this.book_no = book_no;
this.book_name = book_name;
this.price = price;
}
public Book() {
}
@Override
public String toString() {
return "Book [book_no=" + book_no + ", book_name=" + book_name + ", price=" + price + "]";
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
②自定义比较器类
package test;
import java.util.Comparator;
/**
* @author lqh 自定义书名比较器,实现Comparator接口
*/
public class BookNameComparator implements Comparator<Book>{
@Override
public int compare(Book o1, Book o2) {
return o1.getBook_name().compareTo(o2.getBook_name());//比较两个对象的书名
}
}
(2)第二种方式:
创建实体类实现Comparable接口
package test;
/**
* @author lqh 用户类,实现Comparable接口,按用户id排序
*/
public class User implements Comparable<User> {
private Integer id;// 用户id
private String name;// 用户姓名
public Integer getId() {
return id;
}
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
public User() {
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(User o) {
return this.id.compareTo(o.id);
}
}
(3)测试
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Book> books = new ArrayList<>();
List<User> users = new ArrayList<>();
books.add(new Book(1001, "bcd", 120.5));
books.add(new Book(1002, "dfb", 120.5));
books.add(new Book(1003, "abc", 120.5));
books.add(new Book(1004, "gd", 120.5));
books.add(new Book(1005, "bc", 120.5));
users.add(new User(1001, "tom1"));
users.add(new User(1000, "tom2"));
users.add(new User(1020, "tom3"));
users.add(new User(1010, "tom4"));
Collections.sort(books, new BookNameComparator());//第一个参数是Book类的集合,第二个参数是比较器对象
System.out.println("按书名排序后:");
for (Book book : books) {
System.out.println(book.toString());
}
/*
Book [book_no=1003, book_name=abc, price=120.5]
Book [book_no=1005, book_name=bc, price=120.5]
Book [book_no=1001, book_name=bcd, price=120.5]
Book [book_no=1002, book_name=dfb, price=120.5]
Book [book_no=1004, book_name=gd, price=120.5]
*/
Collections.sort(users);
System.out.println("按用户id排序后:");
for (User user : users) {
System.out.println(user.toString());
}
/*
User [id=1000, name=tom2]
User [id=1001, name=tom1]
User [id=1010, name=tom4]
User [id=1020, name=tom3]
*/
}
}