集合框架1
程序是来源于或超脱于现实生活的。
程序是用于进行数据的计算处理的
→ 变量:可以储存单一的数据
→ 数组:可以存储相同类型的一组数据
- 类型必须形同
- 长度一经定义则无法改变
→ 多维数组:比一维数组存储数据方式更加灵活
→ 类和[对象]:对象可以用来存储有关联的数据(对象)
→ 对象数组:变相解决了数组的类型必须相同问题
→ 集合:解决数组的长度不可变问题(长度可变数组)
1.了解Java集合框架体系结构
Iterable ← Collection(Interface): 集合的顶级接口,可允许重复数据出现,数据存储相对无序。
-
List(Interface):可重复,有序
- ArrayList(Class)
- LinkedList(Class)
- Vector(Class)
-
Set(Interface):不可重复,无序
- HashSet(Class)
- TreeSet(Class)
Map: 键值对数据存储方式,一种特殊的数据存储,以后我们学习很多技术都大量采用了此种数据结构
-
HashMap(class)
-
HashTable(class)
-
Properties(class)
2.会使用ArrayList存取数据
ArrayList底层是数组
-
boolean add(Object obj); 向列表追加元素
-
void add(int index,Object obj); 向指定的索引添加元素,原有的元素依次后移
-
int size(); 获取集合的长度
-
Object get(int index); 根据索引获取元素
-
boolean remove(Object obj); 删除指定的元素
-
Object remove(int index); 根据索引删除元素
-
boolean contains(Object obj); 判断集合中是否有指定的元素
-
boolean isEmpty(); 判断集合是否为空(集合长度为0)
-
void clear(); 清空集合
-
List subList(int from,int end); 从指定索引开始到指定索引结束截取子集合(左闭右开)
List<任何类型> Arrays.asList(任何类型数据…);
public static void main(String[] args) {
List<News> list = new ArrayList<>();
News news1 = new News(1, "大新闻", "张三");
News news2 = new News(2, "新大闻", "李四");
News news3 = new News(3, "新闻大", "王五");
// 添加元素
list.add(news1);
list.add(news2);
list.add(news3);
// 向指定索引添加元素 原有元素会依次后移
News news4 = new News(4, "小新闻", "赵六");
list.add(0, news4);
// 集合的遍历
// int size() 获取集合的长度 元素的数量
for(int i = 0; i < list.size(); i++) {
// 根据索引获取指定的元素
News news = list.get(i);
System.out.println(news);
}
// 根据索引进行删除 可以返回被删除的元素
News remove = list.remove(0);
System.out.println("被删除的元素为:"+remove);
// 根据数据进行删除 返回值就是删除成功/失败
// list.remove(news2);
// 判断是否包含在集合中
System.out.println("新闻1是否在集合中:"+list.contains(news1));
list.clear(); // 清空集合
// 判断集合是不是空的
System.out.println("集合是不是空的:"+list.isEmpty());
}
3.会使用LinkedList存取数据
LinkedList底层是链表(特殊的数据结构)
省略List中的通用方法
- void addFirst(Object obj); 在最前添加元素
- void addLast(Object obj); 在最后添加元素
- Object removeFirst(); 删除最前的元素
- Object removeLast(); 删除最后的元素
- Object getFirst(); 获取最前面的元素
- Object getLast(); 获取最后面的元素
public static void main(String[] args){
// 创建对象 命名:newsList <Student> students
List<News> newsList = new LinkedList<>();
News news1 = new News(1, "大新闻", "张三");
News news2 = new News(2, "新大闻", "李四");
newsList.add(news1);
newsList.add(news2);
// 添加头条新闻
News news3 = new News(3, "新闻大", "王五");
newsList.addFirst(news3);
// 添加尾部数据 newsList.addLast(news3);
// 删除头部和尾部数据
// newsList.removeFirst();
// newsList.removeLast();
// 首尾获取数据
News first = newsList.getFirst();
News last = newsList.getLast();
// 遍历集合
/*for (News news : newsList) {
System.out.println(news);
}*/
for (int i = 0; i < newsList.size(); i++) {
News news = newsList.get(i);
System.out.println(news);
}
}
4.ArrayList和LinkedList的区别【面试题】
ArrayList底层是数组结构,因为是数组结构,所以在查询的时候比较快(有索引/下标),而添加/删除比较慢(创建新数组)
LinkedList底层是链表结构,因为是链表结构,所以添加/删除比较快(指针域切换),查询比较慢(没有索引/下标)
5.会使用Set存取数据
特点:无序、唯一
它的无序是相对的无序
如果Set存储引用数据类型,注意重写对应的equals()和hashCode()方法,否则无法实现去重效果
public void main(String[] args){
Set<News> newsSet = new HashSet<>();
News news1 = new News(1, "新闻1", "作者1");
News news2 = new News(2, "新闻2", "作者2");
News news3 = new News(1, "新闻1", "作者1");
newsSet.add(news1);
newsSet.add(news2);
newsSet.add(news3);
// 迭代器遍历
Iterator<News> itor = newsSet.iterator();
while(itor.hasNext()) {
News next = iterator.next();
System.out.println(next);
}
}
6.泛型
集合的泛型必须使用包装类/引用类型
byte -> Byte(包装类)
short -> Short(包装类)
[ int -> Integer(包装类) ]
long -> Long(包装类)
float -> Float(包装类)
double -> Double(包装类)
boolean -> Boolean(包装类)
[ char -> Character(包装类) ]
注:笔记思路来自查老师!!