为什么要使用集合框架
如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java集合框架
集合框架图
Collection接口简介
Collection下拥有List、Set两个子类
Collection 接口存储一组不唯一,无序的对象
List接口简介
List接口下有很多子类实现,这里面简单的说一下ArrayList和LinkedList这两个子类
ArrayList子类
ArrayList存储一组不唯一,但有序的对象
底层数据结构是数组结构
扩容增量:原容量的 0.5倍+1
如 ArrayList的容量为10(默认值就为10),一次扩容后是容量为16
ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高
ArrayList常用的方法:
增加元素
- boolean add(Element e) 增加指定元素到尾部.
- void add(int index, Element e) 增加指定元素到指定位置
list.add(title4);//添加元素 list.add(1, title5);//在指定位置下添加元素
删除元素
- void clear() 删除所有元素.
- E remove(int index) 删除指定位置的元素
list.remove(title1);//删除指定的某一个元素 list.clear();//清空元素
获取元素
- E get(int index) 获取链表中指定位置处的元素
- Object[] toArray() 获取一个数组,数组中所有元素是链表中的元素.(即将链表转换为一个数组)
for (int i = 0; i < list.size(); i++) { NewsTitle title=list.get(i);//获取每一个元素 System.out.println(title.getTitle()); }
修改元素
- E set(int index, E element) 将链表中指定位置上的元素替换成新元素
list.set(1, title6);//修改元素
搜索元素
- boolean contains(Object o) 如果链表包含指定元素,返回true
- int indexOf(Object o) 返回元素在链表中第一次出现的位置,如果返回-1,表示链表中没有这个元素
- int lastIndexOf(Object o) 返回元素在链表中最后一次出现的位置,如果返回-1,表示链表中没有这个元素
System.out.println(list.contains(title1));//判断列表中是否存在指定元素 list.indexOf(title1);//返回元素在链表中第一次出现的位置 list.lastIndexOf(title6);//返回元素在链表中最后一次出现的位置
检查元素是否为空
- boolean isEmpty() 返回true表示链表中没有任何元素
if(map.isEmpty()){ System.out.println("已清空Map中的数据!"); }
获取元素的长度
- int size() 返回长度(包含元素的个数)
System.out.println("Map中共有"+map.size()+"组数据");
ArrayList的迭代器
listIterator.hasPrevious()检查序列中是否还有上一个元素
listIterator.previous()获得序列中的上一个元素
listIterator.hasNext()检查序列中是否还有下一个元素
listIterator.next()获得序列中的下一个元素
LinkedList子类
LinkedList存储一组不唯一,但有序的对象
底层数据结构是数组结构
扩容增量:原容量的 0.5倍+1
如 LinkedList的容量为10(默认值就为10),一次扩容后是容量为16
LinkedList采用链表储存方式。插入删除元素时效率比较高
LinkedList常用方法
增加元素:
- add(E e):在链表后添加一个元素; 通用方法
- addFirst(E e):在链表头部插入一个元素; 特有方法
- addLast(E e):在链表尾部添加一个元素; 特有方法
list.add(title3);//添加元素 list.addFirst(title4);//在开头插入一个元素 list.addLast(title5);//在最末尾添加一个元素
删除元素:
- remove() :移除链表中第一个元素; 通用方法
- remove(E e):移除指定元素; 通用方法
- removeFirst(E e):删除头,获取元素并删除; 特有方法
- removeLast(E e):删除尾; 特有方法
list.remove(title5);//删除元素 list.remove(2);//删除指定下标元素 list.removeFirst();//删除第一个元素 list.removeLast();//删除最后一个元素
检察元素:
- get(int index):按照下标获取元素; 通用方法
- getFirst():获取第一个元素; 特有方法
- getLast():获取最后一个元素; 特有方法
list.get(i);//获得元素 list.getFirst();//获得头条元素 list.getLast();//获得末尾元素
Set接口
Set下面也有很多子类实现了它,这里我就说一下HashSet
Set()中不存在get()方法
HashSet子类
HashSet接口存储的是一组唯一,并且无序的对象
底层实现是一个HashMap(保存数据),实现Set接口
默认初始容量为16
加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
扩容增量:原容量的 1 倍
如 HashSet的容量为16,一次扩容后是容量为32
HastSet常用方法
这里就不贴代码了跟上面的一样.....
//增加
- add(null);
//删除
- remove(news);
//对比查找
- contains(news);
//清空集合
- clear();
//获取长度
- size();
Map接口简介
Map中介绍一个最常用的HashMap子类
Map接口存储一组键值对象,提供key到value的映射
HashMap子类
默认初始容量为16
加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
扩容增量:原容量的 1 倍
如 HashSet的容量为16,一次扩容后是容量为32
HashMap常用方法
put 添加键值对
containsKey() 键中是否包含这个数据
get() 通过键拿到值
isEmpty() 判断是否为空
remove() 在键值对中删除
size() 键值对的数据长度
clear() 清空键值对
Iterator迭代器
使用next()获得序列中的下一个元素。
使用hasNext()检查序列中是否还有下一个元素
泛型类
如果类中存在泛型变量,类必须声明为泛型类
如果类中存在泛型函数,可以声明为泛型类,也可以将函数声明为泛型函数
如果集合设置为了泛型:只能存储泛型变量及其子类
泛型的使用方式,分别为:泛型类、泛型接口、泛型方法
//泛型类 public class FanXing <E>{ //泛型变量 private E fname; private E age; //泛型方法 public <T>T Test(T num){ return num; } public E getFname() { return fname; } public void setFname(E fname) { this.fname = fname; } public E getAge() { return age; } public void setAge(E age) { this.age = age; } }
泛型解决的问题
主要为了解决程序中装箱和拆箱的问题
装箱: 值类型-->引用类型 Object obj=1;
拆箱: 引用类型--->值类型 int number=(int)obj
如果集合设置为了泛型:只能存储泛型变量及其子类
HashSet去重
HashCode跟equals
两个对象的hashCode值相同,两个对象equals方法不一定返回true
两个对象的equals返回为true,则hashCode一定相同
public class Student1 { private String name;//姓名 private int num;//学号 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public Student1(int num,String name ) { super(); this.num = num; this.name = name; } public Student1() { super(); } @Override
//重写equals方法比较学号 public boolean equals(Object obj) { Student1 str=(Student1)obj;//类型强转 if(str.getNum()==this.getNum()){//比较学号 return true; }else { return false; } } @Override public int hashCode() {//重写方法hashcode让内存地址相同 return getNum()/10; } @Override public String toString() { return getName()+getNum(); } }
public class HashSet1 { public static void main(String[] args) { Set<Student1> st=new HashSet();//创建对象 Student1 s1=new Student1(10001,"张三"); Student1 s3=new Student1(10002,"李四"); Student1 s2=new Student1(10001,"张三"); //添加对象 st.add(s1); st.add(s2); st.add(s3); //for循环遍历集合元素 for (Student1 student : st) { System.out.println(student); } } }
ArrayList使用Collections工具排序
//学生类有学号、姓名 public class Student implements Comparator<Student>{ private int number; private String name; public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student(int number, String name) { super(); this.number = number; this.name = name; } public Student() { super(); } @Override //实现Comparator接口的compare方法 public int compare(Student o1, Student o2) { if(o1.getName().equals(o2.getName())){//对比性名如果相等则比较学号 return o1.getNumber()-o2.getNumber(); }else { return o1.getName().compareTo(o2.getName());//compareTo比较两个是否相等 } } @Override public String toString() {//重新toString方法显示姓名、学号 return getName()+getNumber(); } }
//姓名相同 按学号排序 public class Listpaixu { public static void main(String[] args) { List<Student> st=new ArrayList<>(); Student s1=new Student(10002,"张三"); Student s2=new Student(10005,"张三"); Student s3=new Student(10003,"小丽"); Student s4=new Student(10006,"小丽"); st.add(s1); st.add(s2); st.add(s3); st.add(s4); //调用Collections工具类里地sort排序方法 Collections.sort(st,new Student()); for (Student student : st) { System.out.println(student); } } }
Collections常用方法
- Collections.max()最大值
- Collections.min()最小值
- Collections.sort()升序排序
- Collections.binarySearch查找
- Collections.reverse反转集合元素
目前就介绍这么多,还望大佬手下留情....
.