文章目录
1.List 集合:
- List 集合: 存储的元素,有序的,可重复的。
- ArrayList 内部的存储原理是数组。 默认构建的容量是10.
- **List集合为列表类型,列表的主要特征是存放其中的对象以线性方式存储,没有特定的顺序,只有一个开头和结尾,当然,它与根本没有顺序的集类型时不同的。 **
下面展示一些 内联代码片
。
public class ArrayListDemo {
public static void main(String[] args) {
// 创建数组
ArrayList<String> list = new ArrayList<>();
// 向集合内部追加元素。
list.add("a");
list.add("c");
list.add("d");
list.add(null);
list.add("b");
list.add("f");
list.add("g");
list.add("g");
list.add(0, "[");
list.add(null);
list.add(null);
list.add(null);
list.add(null);
// add 方法有返回值,是否添加成功。
boolean add = list.add("]");
// list集合的浅表复制。 克隆副本。
ArrayList clone = (ArrayList) list.clone();
// remove 移除元素
String remove2 = list.remove(0);// 通过下标移除某个元素,返回值删除的元素
boolean remove = list.remove("a");// 通过元素本身,删除。 返回值是boolean.
// get 方法。
System.out.println(list.get(1));
// indexof
System.out.println(list.indexOf("b"));// 返回元素的下标位置。
// isEmpty
System.out.println(list.isEmpty());
// set 替换,更新。
list.set(0, "cc");
System.out.println(list.toString());
// size 集合长度
System.out.println(list.size());
// toArray
Object[] array = list.toArray();
System.out.println("**************************");
// 遍历集合 1。
for(int i=0;i<list.size();i++){
System.out.print(list.get(i)+" ");
}
System.out.println("\n**************************");
// 遍历集合 2
for (String str : list) {
System.out.print(str+" ");
}
// 遍历集合 2
System.out.println("\n**************************");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){// 下一位是否还有值
System.out.print(iterator.next()+" ");
}
}
}
1.1 LinkedList 链表集合
- LinkedList 链表集合链表集合。 内部存储是按照链表顺序排列的。 双向链表。
1.2 ArrayList linkedList 区别?
简易的区分:
- ArrayList 内部存储使用的是数组。 遍历速度快。
- LinkedList 内部存储使用的是链表。 遍历速度慢。 插入删除性能优越。
详细:
- ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
下面展示一些 内联代码片
。
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("hello");
list.add("java");
list.add("jack");
list.add("tom");
list.add("roice");
list.add("object");
// 链表提供了添加的方法。addFirse addLast
list.addFirst("{");
list.addLast("}");
list.removeFirst();
list.removeLast();
// 获取元素
System.out.println(list.get(0));
System.out.println(list.element());
System.out.println(list.toString());
}
}
1.3 线程安全的集合 Vector
- 线程安全的集合 Vector
- Vector 保证线程同步。
public class VectorDemo {
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
vector.add("hello");
vector.add("world");
vector.add("smish");
vector.add("fode");
vector.add("jack");
System.out.println(vector.toString());
}
}
2.Map
2.1 Map 集合
- Map集合:一个包含键值对映射的对象集合。
- Key:键。
- Value: 值。
- 一个键只能有一个值。 键不能重复,无序的。 值可以重复。
- HashMap
2.1.1 HashMap阐述
- HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的映射操作, 并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
————————————————————————
2.1.2 HashMap的数据结构
1.Map 接口: 定义将键值映射到值的对象,Map规定不能包含重复的键值,每个键最多可以映射一个值,这个接口是用来替换Dictionary类。
2.AbstractMap 类: 提供了一个Map骨架的实现,尽量减少了实现Map接口所需要的工作量
3.Cloneable 接口: 实现了该接口的类可以显示的调用Object.clone()方法,合法的对该类实例进行字段复制,如果没有实现Cloneable接口的实例上调用Obejct.clone()方法,会抛出CloneNotSupportException异常。正常情况下,实现了Cloneable接口的类会以公共方法重写Object.clone()
4.Serializable 接口: 实现了该接口标示了类可以被序列化和反序列化
————————————————————————
-
在 java 编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引 用),所有的数据结构都可以用这两个基本结构来构造的,HashMap 也不例外。HashMap 实际上是一个“链表散列”的数据结构,即数组和链表的结合体
———————————————————————— -
ArrayList(查询快)
-
数组实现
-
LinkedList(插入和删除快)
-
链表
-
Hash函数计算得到一个理想的——插入位置
下面展示一些 内联代码片
。
public class HashMapDemo {
public static void main(String[] args) {
// key value
HashMap<String,Integer> map = new HashMap<>();
// map是键值对映射集合。 “a” 表示key 97 表示value。
map.put("a", 97); // put 表示向集合内部添加。
map.put("男", 3985);
map.put("张", 197);
map.put("b", 198);
map.put("c", 198);
// 获取map集合中的值。
System.out.println(map.get("a"));// get 获取集合中的值,通过键获取值。
System.out.println(map.get("男"));
System.out.println(map.get("女"));
// containsKey 是否包含某个key
System.out.println(map.containsKey("a"));
System.out.println(map.containsValue(198));
// 遍历HashMap集合。 遍历所有的key.
Set<String> set = map.keySet();
for(String str : set){
// 遍历所有的key
System.out.println("key: "+str+"\tvalue:"+map.get(str));
}
System.out.println("************************************");
// 遍历HashMap集合。
Collection<Integer> values = map.values();
for(Integer integer : values){
System.out.println(integer);
}
System.out.println("************************************");
// 遍历HashMap集合。
// 视图,副本,克隆。
for (Entry<String, Integer> entry :map.entrySet()) {
System.out.println(entry.getKey()+"\t"+entry.getValue());
}
System.out.println("************************************");
// 1.集合中要注意的地方。
map.put("a", 997);// 重复的key覆盖原来的value
System.out.println(map.get("a"));
// 1.集合中要注意的地方。 put 方法将返回原来的旧值。 新值替换旧值。
System.out.println(map.put("a", 1000));
System.out.println(map.get("a"));
// 1.集合中要注意的地方。
System.out.println(map.put("hello", 885));
// Set add(object); 返回boolean类型。
// List add(object); 返回boolean类型。
// Map put(Key,value); 返回value旧值。
// Set remove(object); 返回boolean类型。
// List remove(object); 返回被删除的元素。
// Map remove(Key); 返回value旧值。
//1.集合中要注意的地方。
Integer remove = map.remove("a");
System.out.println(remove);// 删除的返回值是a的value.
System.out.println(map.toString());
}
}
注意:
// Set add(object); 返回boolean类型。
// List add(object); 返回boolean类型。
// Map put(Key,value); 返回value旧值。
// Set remove(object); 返回boolean类型。
// List remove(object); 返回被删除的元素。
// Map remove(Key); 返回value旧值。
——————————————————————
2.2.1 key
一个key 只能对应一个值。
一个key,对应多个值,可以使用List集合。
举个小例子:
- “河北省” 石家庄,保定,秦皇岛,衡水,廊坊
- “河南省” 郑州,南阳,新乡,开封,平顶山,鹤壁。
- “山西省” 临汾,太原,大同,阳泉,平遥,运城。
下面展示一些 内联代码片
。
public class HashMapDemo02 {
public static void main(String[] args) {
List<String> hb = new ArrayList<>();
hb.add("石家庄");
hb.add("保定");
hb.add("秦皇岛");
hb.add("衡水");
List<String> hn = new ArrayList<>();
hn.add("郑州");
hn.add("南阳");
hn.add("新乡");
hn.add("开封");
List<String> sx = new ArrayList<>();
sx.add("临汾");
sx.add("太原");
sx.add("大同");
sx.add("阳泉");
HashMap<String, List<String>> map = new HashMap<>();
map.put("河北省",hb );
map.put("河南省",hn );
map.put("山西省",sx);
// 如何遍历
Set<String> keySet = map.keySet();
for(String province : keySet){
System.out.println("省份:"+province+"\n城市:");
List<String> list = map.get(province);
for(String city : list){
System.out.print(""+city+" ");
}
System.out.println();
}
}
}