一.集合(list,set,map)
1.定义:集合是用来存储数据的,也是数据的一种容器,集合只能存储对象 ,每个对象就是集合中的一个元素.
2.数组和集合之间的区别
- 数组 :长度固定,数组中只能存储同一种数据类型,但是数组是能存基本数据类型和引用数据类型,
引用数据类型: 引用(对象引用的地址) 数组,类,接口.
- 集合:集合的长度不是固定的,他不用声明具体的长度,集合地可以自动扩容的,集合只能去存储对象,集合可以存储多种数据类型list("hello" ,123,对象)注意:真实项目中通常只存同一种数据类型,除非有特殊要求;
思考:集合中能否存储数字? 答: 集合中存储的数字是int的包装类(Integer)
3.list集合的语法
集合(list(接口))是存储在java.until 包下的
集合(list)共同的接口:Collection 接口
Collection 接口的子接口常用的有:list接口, set接口,
list借口的实现类Arraylist实现类和linkedlist实现类
- 注意 如果list集合在不加泛型的情况下,默认为属性为object 类型
泛型:如果一个集合添加泛型,此集合就只能存储泛型中的数据类型
泛型语法 list<数据类型>
4.集合中add和addall方法的区别
- add 向集合中插入一个元素,如果此元素有多条数据,那么这条数据共享一个下标,
- addall方法 先将对象中的数据一个一个拿出来,分别存入集合中(传入的对象中有多少个元素,就占多少个下标)
注:addall只能添加对象;
public static void main(String[] args) {
//list集合中的Arraylist的语法
//创建集合
List list = new ArrayList();
ArrayList list1 = new ArrayList();
//集合list添加数据的方法
list.add("hello word");
list.add(122);
list.add(12.5);
list.add(true);
//如果但前位置有数据,则该数据向后移一位
list.add(3,182);
System.out.println(list);
//泛型的集合
List<Integer> list2 = new ArrayList<>();
list2.addAll(list);
System.out.println(list2);
//.size返回元素的数量
System.out.println(list2.size());
//判断是否存在某个元素list.contains(要判断的元素)
System.out.println(list2.contains(123));
}
5.集合的遍历
用什么方式遍历集合?为什么?
因为我们知道集合的长度所以用for循环,
思考:Arraylist的自动扩容是如何实现
list集合的底层是用数组来实现的
首先:当我们创建一个数组是,其长度是我们手动设置的,但是在list集合中,在创建一个集合时:默认开辟一个长度为十的一个空间List list - newArratLiat();如果此空间存放满了jvm虚拟机在原来的空间基础上*1.5倍的进行自动扩容.
list集合的特点:list集合是一种线性集合
- linkedlist:底层也是用数组来实现的,他的实现方式是使用链表来实现的
- Arraylist特点:访问快,插入删除慢
- LinkedList特点: 插入删除块访问慢
- Arraylist和Linkedlist用法相同
注:list集合是有序可重复的集合;
可重复:可以有重复的数据
序:按照存入的顺序进行排序
扩展类
//全球唯一id
UUID uuid = UUID.randomUUID();
6.set集合
set的特点:不能保存重复数据
set的实现类是Hashset();
Set<String> set = new HashSet<>();
除了以上特点其余用法和list相同
set和list继承同一个接口Collection
二.map接口集合(无序):
- map的特点:无序,key不可重复,如果重了些表示修改为后一个写的
- 也可以去存放数据,map集合存放数据的方式是通过键值对的方式来存储的
- 键: key 存放的一个地址
- 值:value
可以通过key键快速的查找到具体的vlaue值
map<key,value>
1.map可以看做是一个特殊的list,就像查字典
Entry=<key,value>
Map<Entry> = Map<key,value>
2.Map的实现类
public static void main(String[] args) {
//<key,value>key和value可以自定义类型
Map<Integer,String> map = new HashMap();
map.put(1,"小明");
map.put(2,"012538");
System.out.println(map.get(1));
//判断Map是否包含某个key或value的方法
map.containsKey(1);
map.containsValue("小明");
}
map的删除方法
- map.remove(key)
3.Map的遍历
先学一个方法map.keySet() :把key变成一个数组
3.1第一种遍历
for(String str:map.keySet() ){
System.out.println(map.get(str))
}
3.2第二种遍历
Entry 是一个接口
for (Map.Entry entry:map.entrySet()){
System.out.println(entry);
System.out.println(entry.getKey()+":"+entry.getValue());
}
练习题
- String strTmp = "this is dog that is a desk long long ago there is a girl";
要显示的单词的个数
* this-------------1
* is-------------3
* a-------------2
* 程序 = 数据结构 + 算法
public static void main(String[] args) {
String strTmp = "this is dog that is a desk long long ago there is a girl";
String[] strArrays =strTmp.split(" ");
Map<String,Integer> map = new HashMap<>();
for (String Str:strArrays){
//去map中考察,看map中的key是否包含该单词
//如果包含在子这个单词的原来的值上加1
if (map.containsKey(Str)){
map.put(Str,map.get(Str)+1);
}else{
//如果不包含,想map中添加一个元素,key是单词 值时1
map.put(Str,1);
}
}
for (Map.Entry entry:map.entrySet()){
System.out.println(entry.getKey()+"-----------"+entry.getValue());
}
}