认识集合
在开发应用程序时,如果想存储多个同类性的数据,可以使用数组来实现,但是使用数据存在一些明显的缺陷。
例如 :
1.数组的长度不能改变;
2.数据类型单一;
3.数组采用在内存中分配连续空间的存储方式存储,根据元素信息查找是效率比较低,需要多次比较。
1.了解Java集合框架体系结构(为了解决长度不可变的问题)
Java集合框架提供了一套性能优良、使用方便的接口和类,它们都位于Java.util包中。
List接口
Collection接口是最基本的集合接口,可以存储一组不唯一、无序的对象。List接口继承自Collection接口,是有序集合。
使用ArrayList存取数据
ArrayList<存储的数据的类型> 集合名 = new ArrayList<存储的数据的类型>();
boolean add(Object object); 向列表中追加元素
void add(int index,Object object); 向列表中的指定索引添加元素
int size(); 获取列表的长度/元素个数
Object get(int index); 根据索引获取对应的元素
boolean contains(Object obj); 判断是否包含某个元素
boolean remove(Object obj); 删除指定的元素
Object remove(int index); 根据索引删除元素 且返回被删除的元素值
来自于ArrayList的父级接口们:
toArray() 转换为数组
clear() 清除所有的元素
isEmpty() 判断是否为空集合 / list.size() == 0
iterator() 迭代器
集合泛型的特点:它是用来约束/声明集合元素的数据类型的。
1.泛型必须是引用数据类型,如果是存储基本数据类型值,则必须将其转为对应引用数据类型(包装类型)。
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
char -> Character
boolean -> Boolean
会使用LinkedList存取数据
底层是链表。
LinkedList linkedList = new LinkedList<>();
List接口中的API它也拥有,
void addFirst(Object obj); 将元素添加到第一个
void addLast(Object obj); 将元素添加到最后一个
Object getFirst(); 获取第一个
Object getLast(); 获取最后一个
Object removeFirst(); 删除第一个
Object removeLast(); 删除最后一个
public static void main(String[] args) { // 创建集合对象 List(有序 不唯一) -> ArrayList(可变数组)
// <> 泛型 规范需要添加
// News[] news = new News[];
List list = new ArrayList();
// 存储数据
// news[0] = xxx; news[1] = xxx;
News news1 = new News(1, "震惊!巴黎圣母院失火!", "xxx");
News news2 = new News(2, "震惊!LOL玩家和DOTA玩家竟然在众人面前互斥对方算什么男人!", "xxx");
News news3 = new News(3, "是中国人必须转!不转不是中国人!", "xxx");
// boolean add = list.add(news1);
// 存储数据
list.add(news1);
list.add(news2);
list.add(news3);
// 获取总数
// news.length() length len size lenOf...
int size = list.size();
System.out.println("新闻的总数:"+size);
News news4 = new News(4, "震惊!xxx半夜起床走向窗外....", "xxx");
// 向指定的索引位置添加数据 原有数据依次后移
list.add(0, news4);
// 遍历集合
// 遍历数组 因为数组有索引 所以采用遍历索引 遍历数组
/*
* for(int i = 0; i < news.length; i++){
* news[i]
* }
*/
for(int i = 0; i < list.size(); i++) {
// 集合根据索引获取数据
News news = list.get(i);
System.out.println(news.getTitle()+" ");
}
System.out.println("是否包含xxx相关新闻:"+list.contains(news4));
// 删除李天义数据
// list.remove(news4);
// 删除指定索引的数据 并且返回被删除的数据
list.remove(0);
System.out.println("是否包含xxx相关新闻:"+list.contains(news4));
Collections.shuffle(list);
}`
了解ArrayList和LinkedList的区别?
ArrayList:底层是数组结构,所以因为是数组,则拥有索引,在遍历或随机查找时比较快,但是又因为是数组,数组长度不可变,每一次增删都是要创建新的数组,比较慢。
LinkedList:底层是链表结构,链表结构存储每一个元素由两部分组成,数据域和指针域,它没有索引。多个元素之间,通过指针域指向连接。 因为没有索引,所以查找比较慢,但是因为是链表所以在增删时只需要切换指针指向即可(尤其首尾更快)。
ArrayList的索引是固定的。类似于座位号 找到16号座位。
LinkedList的索引是根据元素位置计算出来的,并非固定的。 找到第16个座位。
使用Set集合存取数据
Set的特点:无序 唯一
例:
public class Demo {
public static void main(String[] args){
//List系列集合 ArrayList LinkedList
List<String> list = Arrays.asList("hehe","xixi");
//创建Set集合
Set<String > set = new HashSet<>();
set.add("hehe");
set.add("xixi");
set.add("meme");
// 1.普通for循环 利用索引来遍历
/*for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(str);
}*/
// 2.增强for循环【推荐】 遍历出每一个元素值
/*for(String str : list) {
System.out.println(str);
}*/
System.out.println("-------------------");
for (String str : set) {
System.out.println(str);
}*/
// 3.迭代器
Iterator<String> iterator = list.iterator();
// iterator.hasNext() 判断是否有下一个元素
// iterator.next() 获取下一个元素
while(iterator.hasNext()) {
String value = iterator.next();
System.out.println(value);
}
System.out.println("---------------------");
Iterator<String> setIterator = set.iterator();
while(setIterator.hasNext()) {
String str = setIterator.next();
System.out.println(str)
}
}
}