数组的特点:
数组的长度一旦定义则不能改变
数组中的元素都有整数索引
数组只能存储同一类型的元素
数组即可以存储基本数据类型,又可以存储引用数据类型
数组的使用:
获取元素。通过索引获取,arr[2];
添加元素(在元素3后面添加一个新元素8):要先创建新的数组,长度为原先的数组长度+1;遍历原先的数组,并将要添加的元素插入到新的数组当中
当碰到元素3的时候,在元素3后面添加新的元素8,最后把剩余的元素添加到元素8的后面
数组的特点:查找快,增删慢。
链表:由链子链接起来的一堆结点
结点结构:地址值,值,下一个结点的地址值
获取结点:只能遍历链表,然后一个一个查看
添加结点(在结点2后面添加一个结点9):
把结点2的下一个结点地址值修改为新结点9的地址值,把新结点9的下一个地址值改为结点3的地址值
链表特点:查询慢,增删快;
栈:先进后出(弹夹), 队列:先进先出()
List特点和特有功能:
要想用遍历集合的自定义对象必须在自定义对象的类中重写tostring方法才可以。
List:有序的(存储和读取的顺序是一致的)
有整数索引
允许重复
Set:无序的
无索引
元素不可以重复
List的特有功能:
Void add(int index, E slement);在指定索引位置添加指定元素,本来的元素向后排
E get(int index);根据索引返回元素,没有元素的时候会出现越界异常
E remove(int index);:删除指定索引的元素,返回被删除的元素
E set(int index, E element);:修改指定索引位置的元素,替换成指定元素,返回被体替换的元素
//创建对象 。使用特有功能
List list = new ArrayList();
List.add(1, “hello”)
List 的常用子类:
Arraylist:底层结构是数组,查询快,增删慢
LinkedList:底层结构是链表,查询慢。增删快
linkedList的特有功能:
Void addFirst(E e);将元素添加到索引为0的为位置(最前位置)、
Void addLast(E e):将索引添加到索引为size()-1的位置(最后的位置)
E getFirst():获取索引为0 的元素
E getLast():获取索引为size()-1的元素
E removeFirst():删除索引为0的元素,并返回被删除的元素
E removeLast():删除索引为size()-1的元素,并返回被删除的元素
创建对象
LinkedLIST list = new linkdlist();
Alt+shift+R 改元素的名字 (可以将名字一样的一块改掉)
SET接口:
使用HashSet存储字符串并遍历:
Set的特点:无序(存储和读取的顺序可能不一样);
不允许重复
没有整数索引
//创建对象
HashSet<String> set = new HashSet<String>();
//添加元素
Boolean boo = set.add(“hello”) 返回的是添加成功不成功
//遍历集合对象
增强for
For(String s :set){
Syso(s);
}
使用HashSet存数自定义对象(不去重(先比hash值,自定义的hash值就是他们自己的地址值,他们地址值都不一样所以直接添加,不去重))并遍历:
//通过查看源码发现:
HashSET ADD()方法,首先会使用当前集合的每一元素和新添加的元素进行hash值进行比较,如果hash不一样,则直接添加元素。如果hash值一样,比较地地址或者使用equals方法进行比较,比较结果一样则认为是重复,不添加,所有的比较结果都不一样则添加
创建对象
HashSet<Student> set = new HashSet<Student>();
重写HashCode方法和equals方法实现HashSet存储自定义对象去重
在自定义的类中重写hashcode方法,返回相同值,让其运行重写的equals方法;
自动重写HashCode和equals方法是alt加shift加s加h
优化前(重写的方法1,2)
1重写equals方法时需要向下转型,获取子类特有的成员。(判断如果不同,return false;)
2重写HashCode方法,让其方法体返回相同内容即可(就可以继续比较运行equals方法),例如(return 1;)
优化后(hashCode的方法体,让基本数据类型直接相加,让引用数据的hashcode值进行相加):