Java第九天笔记01——集合1

目录

1.Java集合概念

2.Java中数组与集合的比较

3.Java中集合框架层次结构

4.Collection接口

4.Iterator接口

5.迭代器模式(重点)

6.Collections类

7.自定义比较器(重点)


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]
		 */
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值