Java基础(课堂笔记)之集合

文章中所列的都是一些常用的方法,具体更多的方法请见API
集合
Java基础(课堂笔记)之集合_第1张图片
Java基础(课堂笔记)之集合_第2张图片
(1)List:存储数据value;有序可重复

  • ArrayList
    -》java.util包
    -》构造方法
    -》无参构造方法:ArrayList list = new ArrayList(); // 10 —> 15
    -》限定存储数据类型构造方法:ArrayList str = new ArrayList<>();
    -》常用API:增删改查
    -》增加数据:add(E e)/add(int index,E e)
    -》删除数据:remove(E e)/remove(int index)
    -》修改数据:set(int index,E e)
    -》查询数据:get(int index)
    -》集合操作
    addAll(Collection c) 并集
    removeAll(Collection c) 差集
    retainAll(Collection c) 交集
    indexOf()
    lastIndexOf()
    isEmpty()
    iterator() 获取List对应的迭代器
    size()

    -》特点:存储数据分配连续内存空间类似于动态数据,适合遍历轮询,不适合插入数据
public static void main(String[] args) {
		//实例化一个ArrayList对象
		ArrayList dogs=new ArrayList();
		
		//创建三只狗狗对象
		Dog dog1=new Dog("二傻","哈士奇");
		Dog dog2=new Dog("小短腿","柯基");
		Dog dog3=new Dog("三傻","阿拉斯加");
		
		//将狗狗对象存入ArrayList中
		dogs.add(dog1);
		dogs.add(dog2);
		dogs.add(dog3);
		
		//获取ArrayList长度
		System.out.println("删除之前共有"+dogs.size()+"条狗狗");
		
		//获取ArrayList.get()
		//必须轻质转换成相应的数据类型
//		Dog a=(Dog) dogs.get(0);
//		System.out.println(a.getName()+":"+a.getType());
		
		//删除元素
		dogs.remove(0);
		System.out.println("删除之前共有"+dogs.size()+"条狗狗");
		
		System.out.println("分别是:");
		for (Object x : dogs) {
			System.out.println(((Dog) x).getName()+":"+((Dog) x).getType());
		}
		
		if(dogs.contains(dog2)) {
			System.out.println("集合中包含"+dog2.getName()+"的信息");
		}
		
		System.out.println("*************************************************************");
		System.out.println("使用Iterator遍历,所有狗狗昵称和品种是:");
		Iterator it= dogs.iterator();
		while(it.hasNext()) {
			Dog dog = (Dog) it.next();
			System.out.println(dog.getName()+"\t"+dog.getType());
		}
		
		
	}

  • LinkedList
    -》java.util包
    -》构造方法
    -》无参构造方法:LinkedList list = new LinkedList(); // 10 —> 15
    -》限定存储数据类型构造方法:LinkedList str = new LinkedList<>();
    -》常用API:增删改查
    -》增加数据:add(E e)/add(int index,E e)
    -》删除数据:remove(E e)/remove(int index)
    -》修改数据:set(int index,E e)
    -》查询数据:get(int index)
    -》addFrist()
    -》addLast()
    -》集合操作
    addAll(Collection c) 并集
    removeAll(Collection c) 差集
    retainAll(Collection c) 交集
    indexOf()
    lastIndexOf()
    isEmpty()
    iterator() 获取List对应的迭代器
    size()

    -》特点:存储数据是采用链表的形式,适合数据插入,不适合遍历轮询
public static void main(String[] args) {
		LinkedList arr=new LinkedList();
		
		Dog dog1=new Dog("大聪明","金毛");
		Dog dog2=new Dog("二傻","哈士奇");
		Dog dog3=new Dog("小短腿","柯基");
		Dog dog4=new Dog("三傻","阿拉斯加");
		
		arr.add(dog1);
		arr.add(dog2);
		arr.add(dog3);
		arr.add(dog4);
		
		//返回列表中的第一个元素
		System.out.println("第一条狗的昵称是"+((Dog) arr.getFirst()).getName());
		//返回列表中的最后一个元素
		System.out.println("最后一条狗的昵称是"+((Dog) arr.getLast()).getName());
		
		//删除元素
		arr.remove(0);
		arr.remove(dog4);
		System.out.println("删除部分狗狗还剩"+arr.size()+"条");
		
		System.out.println("分别是");
		
		for (Object x : arr) {
			Dog d=(Dog)x;
			System.out.println("Dog ["+"name="+d.getName()+","+"type"+d.getType()+"]");
		}
		
		System.out.println("*************************************************************");
		System.out.println("使用Iterator遍历,所有狗狗昵称和品种是:");
		Iterator it= arr.iterator();
		while(it.hasNext()) {
			Dog dog = (Dog) it.next();
			System.out.println(dog.getName()+"\t"+dog.getType());
		}
		
	}
  • Vector
    ArrayList和Vector作为List的两个实现类,功能完全相同,可以相互替代。Vector是一个线程安全的类,而ArrayList是线程不安全的类。
    什么时候都不推荐使用Vector。可以通过Collections工具类把ArrayList转换为线程安全的类。
    -》java.util包
    -》ArrayList早期版本 StringBuffer StringBuilder
    -》Vector类似动态数据的形式存储数据,但是Vector扩容是以2倍的方式
    -》构造方法:
    -》无参构造方法
    -》指定存储数据类型的构造方法
    -》Vector线程是同步的,安全性高,效率
    -》常用方法:增删改查
    add()
    remove()
    set()
    get()
    size()

  • Stack 栈
    -》java.utils包
    -》数据存储特点:先进后出,后进先出
    -》构造方法:通常是用无参构造方法
    -》Stack特殊方法:
    empty() 检测栈中元素是否为空
    push() 将元素压入栈中
    pop() 将栈顶的元素删除
    peek() 查看栈顶的元素但是不删除
    search() 查找元素在栈中的位置,查找出的索引从1开始

  • Queue 队列(接口
    -》java.utils包
    -》是一个接口,实现数据的先进先出,后进后出的数据结构
    -》常用的实现类:LinkedList、ArrayDeque
    -》常用的方法对比
    List接口中
    add()
    remove()
    element()–>get()
    Queue特有的方法
    offer() 添加元素,相当于add
    peek() 查看队列中第一个元素
    poll() 删除队列底端的第一个元素
    (2)Set
    Set集合是无序的,不能存储重复元素,如果试图将两个相同的元素存储进set集合这个操作将失败。一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

  • HashSet
    HashSet是set接口的典型实现,HashSet是按照Hash算法来存存储集合中的数据,所以具有很好的存储和查询的性能。
    HashSet具有以下特点:
    1.它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变
    2.HashSet不是同步的(不是线程安全的),如果多个线程同时访问一个HashSet,必须通过其他方式保证其同步。
    3.集合中元素的值可以为null,但是只能有一个为null

public class Person {

	private int id;

	private String name;

	private int age;

	private String addr;

	public Person() {
		super();
	}

	public Person(int id, String name, int age, String addr) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.addr = addr;
	}

	// 如果Person对象的id和name相同则认为是同一个对象
	@Override
	public int hashCode() {
		// 包装id和name的hashcode相同即可
		return id + name.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj != null && obj.getClass() == Person.class) {
			Person otherPerson = (Person) obj;
			// 下方的equals的调用String方法中的equals
			if (otherPerson.getId() == this.getId() && otherPerson.getName().equals(this.getName())) {
				return true;
			}
		}

		return false;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + ", addr=" + addr + "]";
	}

}


import java.util.HashSet;
import java.util.Set;

public class HashSetTest2 {

	public static void main(String[] args) {
		Set set = new HashSet();
		//如果Person对象的id和name相同则认为是同一个对象
		Person p1 = new Person(1, "张三", 33, "杭州西湖");
		Person p2 = new Person(1, "张三", 34, "北京三里屯");
		set.add(p1);
		set.add(p2);
		// 迭代set集合 有几个对象?
		set.forEach(System.out::println);

	}
}
  • TreeSet
    TreeSet基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
    1.TreeSet自然排序
    如果是基本数值类型 ,系统会自动实现排序,如果是抽象数据类型要实现比较必须实现Comparable接口,然后指定排序规则。
public class User implements Comparable {

	private int id;

	private String name;

	private int age;

	public User() {
		super();
	}

	public User(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

	// 如果要对一个对象实现比较 必须实现Comparable接口 然后重写compareTo方法 在这里方法里指定排序规则
	@Override
	public int compareTo(Object o) {
		// 根据年龄排序
		User u = (User) o;
		// 则分别返回负整数、零或正整数。
		return this.getAge() > u.getAge() ? 1 : this.getAge() < u.getAge() ? -1 : 0;
	}

}

2.自定义排序
自定义排序是根据TreeSet的构造函数进行制定,TreeSet的构造函数可以接受一个comparator的函数式接口,所有可以使用Lambda表达式进行相关的排序操作。

import java.util.TreeSet;

public class TreeSetTest3 {

	public static void main(String[] args) {
		TreeSet set = new TreeSet((o1, o2) -> {
			int a1 = (Integer) o1;
			int a2 = (Integer) o2;
			int temp = a2 - a1;
			return temp == 0 ? 0 : temp;
		});
		set.add(12);
		set.add(23);
		set.add(3);
		set.add(35);
		set.add(8);

		System.out.println(set);
	}

}
  • Map

Map用于保存具有映射关系的数据,所以map集合里保存的是一组数值,Map里以key-value的形式保存数据,其中key和value都可以是引用类型。其中Map里的key不允许出现重复。

  • HashMap
    分析HashMap底层源码的实现
    HashMap和Hashtable都是map集合的子类 并且他们之间的关系和ArrayList和Vector之间的关系是相同的,两种功能基本类似,并且在没有并发的情况下可以相关替代。 区别如下:
    1.Hashtable是一个线程安全的类,HashMap是线程不安全的类,所以HashMap性能比Hashtable要好一些,但是如果有多个线程访问Map使用Hashtable类会更好一些。
    2.Hastable不允许使用Null作为key和value。而HashMap允许使用null作为key和value值。HashMap中也只能有一个key值为null,而value不限制

  • TreeMap
    是根据key值进行对map集合排序

import java.util.TreeMap;

public class TreeMapTest {
	
	public static void main(String[] args) {
		//TreeMap是根据key值的自然顺序完成排序
		TreeMap map =new TreeMap();
		Map map =new HashMap();
		map.put(3, "Linux入门基础");
		map.put(2, "Redis入门基础");
		map.put(6, "Oracle入门基础");
		map.put(8, "SpringMVC入门基础");
		map.put(22, "SpringBoot入门基础");
		
		map.forEach((key,value)->System.out.println(key+"---"+value));
		
		System.out.println("----------------------------");
		//取出排序完成的集合第一个和最后一个元素
		System.out.println(map.firstEntry());
		System.out.println(map.firstKey());
		System.out.println(map.lastKey());
		System.out.println(map.lastEntry());
		
		System.out.println("-----------------------");
		//比指定数据 小的和大的那个数据
		System.out.println(map.higherKey(7));
		System.out.println(map.lowerKey(7));
		
		//截取集合中的部分数据
		System.out.println(map.subMap(5, 20));
	}
	
}

你可能感兴趣的:(Java)