Java 集合(List/Set/Map)
List
1.常见的数据结构
1.数组(ArrayList)
查询和修改效率高,但是删除和插入效率低。
2.链表(LinkedList)
插入和删除效率高,修改和查询效率低(要遍历)
3.堆栈(栈) 特点 FILO
先进后出(FILO) / 后进先出
4.队列 FIFO
先进先出(FIFO) First input first out
2.集合框架的体系
1.继承体系
Collection(所有集合类接口的超级接口)
|--List:特点 有序(添加的顺序)可以重复的数据
|--ArrayList :查询和修改效率高,但是删除和插入效率低。(线程不安全)
|--LinkedList :插入和删除效率高 (线程不安全)
|--Vector : 线程安全
2.如何选择
到底怎么使用如何选择:
1.有序(添加的顺序)可以重复的数据
2.如果查询和修改的频率高-ArrayList
3.如果插入删除频率高-LinkedList
4.如果要求线程安全 Vector
3.ArrayList
1多查询API
2.基本数据的维护 常用的CRUD 方法
CRUD:增删踢查
3.集合的遍历
1.for
2.增强for循环
无法获取下标
3.迭代器
就是从下标0开始遍历
1.单向迭代器
Iterable 接口 有接口方法
Iterable 接口 有接口方法 Iterator iterator();
返回一个Iterator
Iterator
hasNext() 是否有下一个(不会移动指针)
next() 返回下一个元素(要移动指针)
remove() 删除下一个元素
注意:如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法
ConcurrentModificationException:不能在迭代过程中对数据源进行改变
2.双向迭代器
是List下面的方法
所有的list的实现类都可以获取 这个对象
//得到一个 双向迭代器
ListIterator listIterator = list.listIterator();
//从左往右迭代
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
//反向迭代
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
4.LinkedList
1.多查询API
2.基于数据结构的不同,他提供了很多操作头 和尾的方法
Set
HashSet(不可重复,无序)
观察不能重复是从哪里得出来的。并且在实际业务中覆写equals根据业务需求。
覆写HashCode
//当任何一个hashCode值不同,那么就是执行新增,一样就执行不可新增
public inthashCode() {
return age+name.hashCode();//使每个对象调用的HashCode的值都相等。
覆写equals
//比较地址值,如果相同,则不新增
//覆写equals了之后,先一个值一个值的判断。如果相等,那么就返回false,那么就新增。true为不新增。
//当对象中的字段有一个或者多个不同时,那么就新增上去。如果所有字段都相同时,则不新增。
public booleanequals(Objectobj) {
if(obj instanceofPerson) {//先确定传入的值是Person类型的。意思就是传入一个Person类型的对象或者Person子类的对象
//给HashSet中,进行CRUD存储
Personp= (Person)obj;
if(p.getAge() !=this.getAge()){
return false;
}else{
if(p.getName().equals(this.getName())){
return true;
}
}
}
return false;
TreeSet(不可重复,无序,可指定排序)
根据业务区去实现Comparable接口,并且覆写compareTo方法
创建一个比较器去实现Comparator接口,并且覆写compare方法
Comparable
//谁调用这个方法,这个this就表示当前对象,即上一次对象。
//如果升序,那么大的值就向后排。
public intcompareTo(Objecto) {
if(o instanceofPerson) {
Personp= (Person)o;
if(p.getAge()>this.getAge()) {
return-1;
}else if(p.getAge()
return1;
}
}
return0;
}
Comparator
public intcompare(Objecto1, Objecto2) {
if(o1 instanceofAnimal &&o2 instanceofAnimal) {
Animala= (Animal)o1;
Animalb= (Animal)o2;
if(a.getAge()>b.getAge()){
return1;
}else if(a.getAge()
return-1;
}
}
return0;
}
Map
Map
HashMap与HashSet中的不可重复无序是一样的
TreeMap
和TreeSet中的排序两种方式(比较器-自定义比较Compartor、实现接口-自然排序Comparable)一样
Collections
列如数组Array有工具类Arrays
Collections是Collection的工具类
会使用常见的Collections中的方法就好
Properties
将一个或者多个值存放在内存中,然后创建一个文件存放,保存在数据库中(硬盘)。
public class PropertiesDemo{
public static voidmain(String[]args)throws IOException{
//set();
Properties ps=new Properties();
/**
* void load(InputStream inStream) 从输入流中读取属性列表(键和元素对)。
*/
//指定一个文件路径
//InputStream inStream = new FileInputStream("db.txt");
InputStream inStream=new FileInputStream("E:/workspace/Day21_Map/db.txt");
//把数据加载到内存
ps.load(inStream);
System.out.println(ps);
}
public static void set()throws FileNotFoundException{
//创建Properties
Properties ps=new Properties();
//放值
ps.setProperty("AAA","狗蛋蛋");
//取值
String property=ps.getProperty("AAA");
//把文件保存到电脑上
ps.list(new PrintStream("db.txt"));
System.out.println(property);
System.out.println(ps);
}
}
泛型
//1.8 以后的写法
//ArrayList<> arrayList = new ArrayList<>();
//泛型 不支持基本数据类型
Pointp=newPoint<>();
p.setX(1);
p.setY(1.00);
ArrayListarray=new ArrayList<>();
array.add(p);
System.out.println(array);
/**
* 泛型的上下限
* ?号 :表示通配符,不确定的类型,可以表示任意类型【? extends Object】 ;
? extends Number :表示通配符?的上限 ,必须是Number及Number的子类
? Super Number: 表示通配符 ?的下限,必须是Number及Number的父类
*/