集合
集合
同一类型放在一个容器,名叫集合(引用数据类型,这是和数组最大的区别),且长度可以变化。
集合是 实现Collection(接口) 父类是Iterable(接口:功能是集合的迭代遍历)
集合里的东西叫元素
主要是增删改查
Object: 是所有类的父类
List
有序可重复 常见的实现类:
- ArrayList(数组实现)
- LinkedList()
ArrayList
格式
ArrayList<String> list = new ArrayList<>();
<>:放的就是泛型,指的就是集合里面放入的数据类型。
指定数组的数据类型
省去了从集合中取出数据时的强制类型转换。
常见的应用
元素个数:size(); 数组的长度和size不是一回事,如果size()小于数组长度,直接将元素放入到数组里面。如果size()等于数组长度,会自动扩容。
System.out.println(list);
增(添加): add(元素);
list.add("乔治");
删(删除):
remove(元素): 删除第一次出现的元素
remove(索引): 删除指定索引位置的元素
list.remove(1);
改(修改): set(索引,元素)
list.set(0, "乔治");
查(查询): get(索引)
list.get(0);
ArrayList和LinkedList的区别:🎈
- 底层数据结构不一样 数组 链表
- ArrayList查询快,增删慢
- LinkedList查询慢,增删快
Set
无序(没有索引)不重复(可以去重)
HashSet
TreeSet
HashSet
格式
HashSet<Integer> set = new HashSet<>();
常见的应用
增(添加): add(元素);
set.add("乔治");
删(删除): remove(索引): 删除指定索引位置的元素
set.remove(1);
去重,HashSet开发时候用的比较少,一般集合都是用ArrayList
在某些场合下也需要ArrayList去重,可以使用HashSet
ArrayList<String> names = new ArrayList<>();
HashSet<String> set1 = new HashSet<>(names);
names = new ArrayList<>(set1);
HashSet和HashTable的区别:
- HashSet是线程不安全的,效率高,允许null值
- HashTable是线程安全的,效率低,不允许null值
Map
TreeMap
HashMap: 双列集合
键是唯一的,值可以重复
格式
HashMap<String, Integer> map = new HashMap<>();//new HashMap<K,V> K 键 V 值 键值对
增(添加): put(键, 值);
map.put("乔治", 18);
删(删除): remove(键);
map.remove("老马");
改(修改): put(键, 值);
map.put("老马", 38);
查(查询): get(键)
map.get("乔治");
jdk8 HashMap底层是: 数组+链表+红黑树
- HashMap负载因子: 0.75 元素个数超过数组长度的0.75倍,数组就会扩容。2倍
- 链表的长度超过8,链表就会转换成红黑树。如果红黑树的长度小于6,红黑树就会转换成链表。
- HashMap的初始容量: 16
for 和 foreach的区别:
- for可以操作索引,但是语法结构相对复杂
- foreach不可以操作索引,但是语法结构相对简单