Java 类集
类集本质上属于动态对象数组,数组有一个最大的缺陷就是长度固定,所有Java类集框架就是为了解决数组长度问题。数据结构中最基础的就是链表
先来回顾一下链表的特点:
1、节点关系的处理操作,核心需要一个Node类用来保存数据、设置索引
2、进行链表数据的查找、删除时需要equals()方法支持
Collection集合接口
Collection接口是单个集合保存的最大父接口,每一次进行数据操作时只能对单个对象进行处理
从JDK1.5开始发现Collection接口上追加有泛型应用,这样的直接好处就是可以避免ClassCastException,里面的所有数据的保存类型应该是相同的。
Collection接口使用:
Collection<String> collection = new ArrayList<>();
collection.add("Java");//增加
collection.add("C++");
collection.add("PHP");
Object[] values = collection.toArray();
for (Object value : values){
System.out.println(value);
}
//toString
System.out.println(Arrays.toString(values));
在开发过程中很少直接使用Collection接口,往往考虑Collection接口的子接口:List(允许数据重复)、Set(不允许数据重复)
1、List接口
List本身还是接口,要想取得接口的实例化对象,就必须有子类,在List接口下有三个常用子类:ArrayList、Vector、LinkedList。
ArrayList子接口的使用
List<String> list = new ArrayList<>();
list.add("java");//增加
list.add("C++");
list.add("Java");
list.add(0,"PHP");//指定位置增加
list.add(2,"Python");
//判断
System.out.println("原List"+list);
System.out.println(list.isEmpty());//判断链表是否为空
System.out.println(list.size());//获取长度
System.out.println(list.contains("PHP"));//判断是否含有特定元素
System.out.println(list.remove("Java"));//删除
System.out.println(list.remove(1));//删除指定位置
//获取 0<= index <= size()-1
System.out.println(list.get(2));//获取指定位置元素
System.out.println(list);//打印输出
向集合保存简单Java类对象:集合操作简单Java类时,对于remove()、contains()方法需要equals()方法支持
class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name) &&
Objects.equals(age, person.age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
public class TestDemo {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person("张三", 10));
personList.add(new Person("李四", 11));
personList.add(new Person("王五", 12));
// 集合类中contains()、remove()方法需要equals()支持
personList.remove(new Person("李四", 11));
System.out.println(personList.contains(new Person("王五", 12)));
for (Person p : personList) {
System.out.println(p);
}
}
}
Vector子接口的使用
public static void main(String[] args) {
List<String> list = new Vector<>();
list.add("hello");
list.add("world");
list.add("!!!");
System.out.println(list);
list.remove("hello");
System.out.println(list);
}
常见面试题:请解释ArrayList和Vector的区别
1、历史时间:ArrayList是JDK1.2提供的,Vector是JDK1.0提供的
2、处理形式:ArrayList是异步处理,性能高;Vector是同步处理,性能较低
3、数据安全:ArrayList是非线程安全;Vector线程安全
4、**输出形式:**ArrayList 支 持 Iterator 、 ListIterator 、 foreach;Vector 支 持 Iterator 、 ListIterator 、 foreach 、Enumeration。
LinkedList子接口的使用
public static void main(String[] args) {
//LinkedList双向链表
List<String> list = new LinkedList<>();
list.add("Java");
list.add("C++");
list.add(1,"PHP");
System.out.println(list.size());
System.out.println(list.contains("Java"));
System.out.println(list.remove("C++"));
}
2、Set集合接口
Set接口与List接口最大的区别在于Set接口中内容不允许重复
Set接口中有两个常用子类:HashSet(无序存储)、TreeSet(有序存储)
HashSet使用:
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Java");//增加
set.add("C++");
set.add("PHP");
set.add("C++");
//set元素不能重复 无序
System.out.println(set.size());//获取长度
System.out.println(set.contains("Java"));//判断是否含有指定元素
System.out.println(set.remove("C++"));//删除元素
System.out.println(set);
}
TreeSet使用
public static void main(String[] args) {
Set<Integer> set = new TreeSet<>();
set.add(27);
set.add(13);
set.add(33);
set.add(21);
set.add(43);
//打印输出升序
//两种方式
//1.元素必须能够排序,实例化元素的类型需要实现Comparable接口
//2.构造TreeSet时指定Comparator的实例化对象
System.out.println(set);
Set<String> set1 = new TreeSet<>();
set1.add("Java");
set1.add("APP");
set1.add("C++");
System.out.println(set1);
}