目录
List接口
集合框架:
list接口:
ArrayList:
概念:
用法类似于数组,且其容量可按需要动态调整,亦被称为动态数组。
数组最大的痛点是大小固定(可以改变,但是很麻烦) ArrayList底层是用数组实现的,所以名字里带了个数组(Array)。
ArrayList底层是通过数组实现,查询快、增删慢。API文档上说ArrayList不是同步的,即多线程环境下不安全,但是效率高。
使用场景:
1.频繁访问列表中的某一个元素。
2.只需要在列表末尾进行添加和删除元素操作。
常用用法:
1.public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
2.public E get(int index):返回集合中指定位置的元素。
3.public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。
4.public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。(index:要更改的索引(集合下标),element:要更改成的内容)
代码举例:
//新建集合 ArrayList<Object> objects = new ArrayList<>(); //集合开始的长度 int size1 = objects.size(); System.out.println(size1);//0 objects.add("sb"); objects.add("chenyan"); objects.add("aichidami"); //用指定元素替换集合中指定位置的元素,返回值的更新前的元素。 objects.set(1,"曹兔"); System.out.println(objects.get(1));//曹兔 //集合结束的长度 int size = objects.size(); System.out.println(size);//3 //返回集合中指定位置的元素 Object o = objects.get(0); System.out.println(o);//sb //按照索引删除元素 boolean sb = objects.remove("sb"); for (Object object : objects) { System.out.print(object.toString()+"\t");//曹兔 aichidami }
在上述代码中,我们用的全是string类型的数据(我没改类型,我在尖括号里面写的是Object,也没事如果你想变成string类型的话,就把Object变成string就行),如果我们要存储基本数据类型的数据(所有集合都只能存引用数据类型),我们就得用基本类型的包装类。
ArrayList<Object> objects = new ArrayList<>();
注意:
List接口下的子类都可以使用上面的用法,但是在set接口下的子类没有get/set方法,但是有别的方法。
LinkedList:
概念:
LinkedList使用链表实现,查询慢,增删快,适用于经常插入、删除大量数据的场合,适合采用迭代器Iterator遍历。
LinkedList实现了List和Deque(双端队列)接口。
使用场景:
1.你需要通过循环迭代来访问列表中的某些元素。
2.需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
语法:
LinkedList<E> list = new LinkedList<E>(); // 普通创建方法(一般普通方法用的比较多) 或者 LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表常用方法(LinkedList提供了大量首尾操作的方法):
1.public void addFirst(E e):将指定元素插入此列表的开头。
2.public void addLast(E e):将指定元素添加到此列表的结尾。
3.public E getFirst():返回此列表的第一个元素。
4.public E getLast():返回此列表的最后一个元素。
5.public E removeFirst():移除并返回此列表的第一个元素。
6.public E removeLast():移除并返回此列表的最后一个元素。
**7.**
public E pop():从此列表所表示的堆栈处弹出一个元素(使用这个会把这个集合的第一个元素删除,然后返回这个元素)。
**8.**
public void push(E e):将元素推入此列表所表示的堆栈(就是在第一个元素前在插入一个元素)。9.public boolean isEmpty():如果列表不包含元素,则返回true。
代码举例:
LinkedList<Object> list = new LinkedList<>(); list.add("dazhe"); list.add("曹兔子"); for (Object o : list) { System.out.print(o.toString()+"\t"); System.out.println(); } //将指定元素插入此列表的开头。 list.addFirst("曹志顺"); //返回此列表的第一个元素 Object first = list.getFirst(); System.out.println(first);//曹志顺 System.out.println(list.get(0)); //将指定元素添加到此列表的结尾 list.addLast("久诚"); System.out.println(list.get(3)); //返回此列表的最后一个元素。 Object last = list.getLast(); System.out.println(last);//久诚 //移除并返回此列表的第一个元素。 Object o = list.removeFirst(); System.out.println(o); //遍历 for (Object o1 : list) { System.out.print(o1.toString()); } //从此列表所表示的堆栈处弹出一个元素。,使用这个会把这个集合的第一个元素删除,然后返回这个元素。 Object pop = list.pop(); System.out.println(pop);//dazhe //将元素推入此列表所表示的堆栈。就是在第一个元素前在插入一个元素 list.push("ddddd"); for (Object o1 : list) { System.out.println(o1.toString());//ddddd 曹兔子 久诚 }
set接口
HashSet:
概念:
它是set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不能保证不一致)。HashSet底层的实现其实是一个java.util.HashMap支持。
HashSet
是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存储和查找性能。保证元素唯一性的方式依赖于:hashCode
与equals
方法。HashSet存储自定义类型元素:
第一步:
自定义类型也就是我们自己创建的实体类
第二步:
使用HashSet集合
代码举例:
//实体类 public class Student { //私有属性 private String name; private int age; //构造方法 public Student(String name, int age) { this.name = name; this.age = age; } public Student() { } /** * 重写对象中的hashCode和equals方法, * 建立自己的比较方式,才能保证HashSet集合中的对象唯一 * * @param o * @return */ //重写equals方法 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && name.equals(student.name); } //重写hashCode @Override public int hashCode() { return Objects.hash(name, age); } 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; } //重写tostring方法 @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } //测试HashSet //新建Hashset集合 让他装自定义类对象 HashSet<Student> set = new HashSet<>(); //新建自定义类对象 Student s= new Student("陈妍", 20); //把对象添加到集合去 set.add(s); set.add(new Student("曹兔子",23)); set.add(new Student("陈妍",20)); //遍历集合 for (Student student : set) { System.out.println(student); }//Student{name='曹兔子', age=23} Student{name='陈妍', age=20}
注意:
如果不重写equals方法和HashSet方法的话,添加相同的元素,hashset里面的元素会相同。
LikedHashSet:
概念:
set是无序、唯一的话,可以使用LikedHashSet--它是HashSet下面的一个子类,底层使用了LinkedHashMap,在HashSet的哈希表数据结构基础之上,增加了一个双向链表用来记录元素添加的顺序,能按照添加顺序遍历输出。需要频繁遍历的话效率可能高于HashSet。
结论:
LinkedHashSet 底层采用双向链表实现,可以保证元素的插入顺序,又因为是HashSet的子类,所以插入的元素不能重复。
举例代码:
public static void main(String[] args) {
//新建一个集合(输出数据是有序的集合)
LinkedHashSet<String> set = new LinkedHashSet<>();
//在集合里添加元素
set.add("ccc");
set.add("bbb");
set.add("aav");
//使用迭代器遍历输出元素
Iterator<String> ite = set.iterator();
while (ite.hasNext()){
System.out.println(ite.next());//ccc bbb aav
}
}