2023年6月20日发(作者:)

【济南中心】JAVA编程阶梯:基础篇之第十五章

集合框架

集合的由来

数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少。

集合类的特点

集合只能存储对象,//jdk1.5版本后可以存基本数据类型,自动装箱为基本数据类型包装类。

集合的长度是可变的

集合可以存储不同类型的对象

数组和集合的区别

区别1 :

数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值

集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象

区别2:

数组长度是固定的,不能自动增长

黑马程序员济南中心 编著 集合的长度的是可变的,可以根据元素的增加而增长

数组和集合什么时候用

1,如果元素个数是固定的推荐用数组

2,如果元素个数不是固定的推荐用集合

集合继承体系图

Collection集合的基本功能

a)添加:

i. boolean add(E e) 添加元素e

黑马程序员济南中心 编著 j. boolean addAll(Collection c) 将集合c中的所有元素添加到当前集合

b)删除:

i. void clear():清空容器

j. boolean remove(Objec object): 移除一个元素

k. boolean removeAll(Collection c): 移除与c所有的相同元素//retainall(Collection c) 保留与c相同的元素

c)判断:

i. boolean contains(Object object):判断是否包含此元素

j. boolean containsAll(Collection c):判断是否包含一堆元素

k. boolean equals(Object object):比较此collection与指定对象是否相等

m. boolean isEmpty():判断是否集合为空

d)获取:

h. Iterator iterator():取出

i. int hashCode():返回此collection的哈希值

j. int size():返回此collection中元素的个数

k. boolean retainAll(Collection c):取交集

m. Object toArray():返回此collection中所有元素的数组

n. T[] toArray(T[] a):返回包含此collection中所有元素的数值

集合的遍历之集合转数组遍历

[Java] 纯文本查看 复制代码

?

黑马程序员济南中心 编著 01 package ;

02

03 import ist;

04 import tion;

05

06 /**

07 * toArray()遍历集合

08 *

09 * @author Somnus

10 *

11 */

12 public class Demo {

13

14 public static void main(String[] args) {

15

16 Collection coll = new ArrayList();

17

18 (new People("小明", 23)); // Object obj = new Student("张三",23);

19

20 (new People("小红", 24));

21

22 (new People("小王", 25));

黑马程序员济南中心 编著 23

24 (new People("小李", 26));

25

26 Object[] arr = y(); // 将集合转换成数组

27

28 for (int i = 0; i < ; i++) {

29

30 People s = (People) arr[i]; // 强转成Student

31

32 n(e() + "," + ());

33 }

34 }

35 }

36

37 class People {

38 private String name;

39 private int age;

40

41 public People() {

42 }

43

44 public People(String name, int age) {

黑马程序员济南中心 编著 45 super();

46 = name;

47 = age;

48 }

49

50 public String getName() {

51 return name;

52 }

53

54 public void setName(String name) {

55 = name;

56 }

57

58 public int getAge() {

59 return age;

60 }

61

62 public void setAge(int age) {

63 = age;

64 }

65 }

集合的遍历之迭代器遍历(集合的专用遍历方式)

黑马程序员济南中心 编著 [Java] 纯文本查看 复制代码

?

01 package ;

02

03 import ist;

04 import tion;

05 import or;

06

07 /**

08 * Iterator遍历集合

09 *

10 * @author Somnus

11 *

12 */

13 public class Demo {

14

15 public static void main(String[] args) {

16

17 Collection coll = new ArrayList();

18 (new People("小明", 23));

19 (new People("小红", 24));

20 (new People("小王", 25));

黑马程序员济南中心 编著 21 (new People("小李", 26));

22 n("-----------第一种使用方式---------------");

23 Iterator it = or(); // 获取迭代器

24 while (t()) { // 判断集合中是否有元素

25 People s = (People) (); // 向下转型

26 n(e() + "," + ()); // 获取对象中的姓名和年龄

27 }

28 n("-----------第二种使用方式---------------");

29 for (Iterator ite = or(); t();) {

30 People s = (People) (); // 向下转型

31 n(e() + "," + ()); // 获取对象中的姓名和年龄

32 }

33 }

34 }

35

36 class People {

37 private String name;

38 private int age;

39

40 public People() {

41 }

42

黑马程序员济南中心 编著 43 public People(String name, int age) {

44 super();

45 = name;

46 = age;

47 }

48

49 public String getName() {

50 return name;

51 }

52

53 public void setName(String name) {

54 = name;

55 }

56

57 public int getAge() {

58 return age;

59 }

60

61 public void setAge(int age) {

62 = age;

63 }

64 }

黑马程序员济南中心 编著 迭代器

(1)迭代器就是取出集合元素的方式

(2)迭代器的作用

因为每个集合中元素的取出方式都不一样,于是就把元素的取出方式进行抽取,并定义在集合内部,

这样取出方式就可以直接访问集合内部的元素;

而每个容器的数据结构不同,所以取出动作的细节也不一样,但是有共性内容:判断和取出。

那么就将共性内容进行抽取,从而形成了接口Iterater

(3)获取迭代器的方法:

Iterator iterator() 返回在此 collection 的元素上进行迭代的迭代器。

Iterator iterator() 返回在此 set 中的元素上进行迭代的迭代器。

(3)迭代器方法:

boolean hasNext() 如果仍有元素可以迭代,则返回 true。

E next() 返回迭代的下一个元素。

void remove() 从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)。

List集合概述

List接口是Collection接口的一个子接口。

List接口中的元素有如下特点(对角标的操作都是特有方法,因为有序:

A:元素有序(存储顺序和取出顺序一致)

黑马程序员济南中心 编著 B:元素可以重复

List接口中的特有方法

A:add(int index,Object obj):在指定位置加入元素

B:remove(int index):移除指定位置的元素

C:set(int index,Object obj):修改指定位置的元素

D:get(int index):获取指定位置的元素

E:indexOf(Object obj):获取指定元素的位置

F:subList(int start,int end):从一个大的List中截取一个小的List

G:listIterator():返回一个List接口特有的迭代器

List集合通过size()和get()方法结合遍历

[Java] 纯文本查看 复制代码

?

01 /**[/align] * 通过size()和get()方法结合遍历集合

02 *

03 * @author Somnus

04 *

05 */

06 public class Demo {

07

08 public static void main(String[] args) {

黑马程序员济南中心 编著 09

10 List list = new ArrayList<>();

11 (new People("张三", 18));

12 (new People("李四", 18));

13 (new People("王五", 18));

14 (new People("赵六", 18));

15 for (int i = 0; i < (); i++) {

16 People s = (People) (i);

17 n(e() + "," + ());

18 }

19 }

20 }

21

22 class People {

23 private String name;

24 private int age;

25

26 public People() {

27 }

28

29 public People(String name, int age) {

30 super();

黑马程序员济南中心 编著 31 = name;

32 = age;

33 }

34

35 public String getName() {

36 return name;

37 }

38

39 public void setName(String name) {

40 = name;

41 }

42

43 public int getAge() {

44 return age;

45 }

46

47 public void setAge(int age) {

48 = age;

49 }

50 }

集合框架并发修改异常产生的原因及解决方案

黑马程序员济南中心 编著 [Java] 纯文本查看 复制代码

?

01 /**[/align] * 需求:判断集合里面有没有"孙先生",如果有当找到"孙先生"的时候添加一个"吴女士",请写代02 实现。

03 *

04 * @author Somnus

05 */

06 public class Demo {

07

08 public static void main(String[] args) {

09

10 List list = new ArrayList();

11 (new People("赵先生", 19));

12 (new People("钱先生", 19));

13 (new People("孙先生", 19));

14 (new People("李先生", 19));

15 (new People("周先生", 19));

16 // Iterator it = or();

17 // while (t()) {

18 // People p = (People) ();

19 // if (e().equals("孙先生")) {

20 // (new People("吴女士", 19)); //

黑马程序员济南中心 编著 21 // 这里会抛出ConcurrentModificationException并发修改异常

22 // }

23 // }

24

25 // 在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生26 ConcurrentModificationException(当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常)

27 // 解决方案

28 // a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)

29 // b:集合遍历元素,集合修改元素

30 ListIterator lit = erator(); // 如果想在遍历的过程中添加元素,可以用ListIter31 中的add方法

32 while (t()) {

33 People p = (People) ();

34 if (e().equals("孙先生")) {

35 (new People("吴女士", 20));

36 }

37 }

38 }

39 }

40

41 class People {

42 private String name;

黑马程序员济南中心 编著 43 private int age;

44

45 public People() {

46 }

47

48 public People(String name, int age) {

49 super();

50 = name;

51 = age;

52 }

53

54 public String getName() {

55 return name;

56 }

57

58 public void setName(String name) {

59 = name;

60 }

61

62 public int getAge() {

63 return age;

64 }

黑马程序员济南中心 编著 65

66 public void setAge(int age) {

= age;

}

}

ListIterator:列表迭代器

Iterator方法有限,只能对元素进行判断、取出和删除的操作

ListIterator可以对元素进行添加和修改动作等。

获取列表迭代器方法:

ListIterator listIterator() 返回此列表元素的列表迭代器(按适当顺序)。

ListIterator listIterator(int index)

返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。

列表迭代器方法:

void add(E e) 将指定的元素插入列表(可选操作)。

boolean hasPrevious() 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。

int nextIndex() 返回对 next 的后续调用所返回元素的索引。

E previous() 返回列表中的前一个元素。

int previousIndex() 返回对 previous 的后续调用所返回元素的索引。 void set(E e)

用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。

Vector类概述

黑马程序员济南中心 编著 Vector(JDK1.0):底层数据结构是数组数据结构.特点是查询和增删速度都很慢。

默认长度是10,当超过长度时,按100%延长集合长度。

线程同步。

Vector功能跟ArrayList功能一模一样,已被ArrayList替代)

Vector类特有功能

public void addElement(E obj)

public E elementAt(int index)

public Enumeration elements()

Vector的迭代

[Java] 纯文本查看 复制代码

?

01 /**

02 * Vector迭代

03 *

04 * @author Somnus

05 */

06 public class Demo {

07

08 public static void main(String[] args) {

09

10 Vector v = new Vector(); // 创建集合对象,List的子类

黑马程序员济南中心 编著 11 ment("a");

12 ment("b");

13 ment("c");

14 ment("d");

15 // Vector迭代

16 Enumeration en = ts(); // 获取枚举

17 while (eElements()) { // 判断集合中是否有元素

18 n(ement());// 获取集合中的元素

19 }

20 }

21 }

数据结构之数组和链表

数组的特点:

1.查询快修改也快

2.增删慢

链表的特点:

1.查询慢,修改也慢

2.增删快

List的三个子类

ArrayList:

黑马程序员济南中心 编著 底层数据结构是数组,查询快,增删慢。

线程不安全,效率高。

Vector:

底层数据结构是数组,查询快,增删慢。

线程安全,效率低。

Vector相对ArrayList查询慢(线程安全的)

Vector相对LinkedList增删慢(数组结构)

LinkedList:

底层数据结构是链表,查询慢,增删快。

线程不安全,效率高。

Vector和ArrayList的区别

Vector是线程安全的,效率低

ArrayList是线程不安全的,效率高

共同点:都是数组实现的

ArrayList和LinkedList的区别

ArrayList底层是数组结果,查询和修改快

LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢

共同点:都是线程不安全的

List的三个子类分别都是什么时候用?

查询多用ArrayList

增删多用LinkedList

黑马程序员济南中心 编著 如果都多ArrayList

黑马程序员济南中心 编著

2023年6月20日发(作者:)

【济南中心】JAVA编程阶梯:基础篇之第十五章

集合框架

集合的由来

数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少。

集合类的特点

集合只能存储对象,//jdk1.5版本后可以存基本数据类型,自动装箱为基本数据类型包装类。

集合的长度是可变的

集合可以存储不同类型的对象

数组和集合的区别

区别1 :

数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值

集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象

区别2:

数组长度是固定的,不能自动增长

黑马程序员济南中心 编著 集合的长度的是可变的,可以根据元素的增加而增长

数组和集合什么时候用

1,如果元素个数是固定的推荐用数组

2,如果元素个数不是固定的推荐用集合

集合继承体系图

Collection集合的基本功能

a)添加:

i. boolean add(E e) 添加元素e

黑马程序员济南中心 编著 j. boolean addAll(Collection c) 将集合c中的所有元素添加到当前集合

b)删除:

i. void clear():清空容器

j. boolean remove(Objec object): 移除一个元素

k. boolean removeAll(Collection c): 移除与c所有的相同元素//retainall(Collection c) 保留与c相同的元素

c)判断:

i. boolean contains(Object object):判断是否包含此元素

j. boolean containsAll(Collection c):判断是否包含一堆元素

k. boolean equals(Object object):比较此collection与指定对象是否相等

m. boolean isEmpty():判断是否集合为空

d)获取:

h. Iterator iterator():取出

i. int hashCode():返回此collection的哈希值

j. int size():返回此collection中元素的个数

k. boolean retainAll(Collection c):取交集

m. Object toArray():返回此collection中所有元素的数组

n. T[] toArray(T[] a):返回包含此collection中所有元素的数值

集合的遍历之集合转数组遍历

[Java] 纯文本查看 复制代码

?

黑马程序员济南中心 编著 01 package ;

02

03 import ist;

04 import tion;

05

06 /**

07 * toArray()遍历集合

08 *

09 * @author Somnus

10 *

11 */

12 public class Demo {

13

14 public static void main(String[] args) {

15

16 Collection coll = new ArrayList();

17

18 (new People("小明", 23)); // Object obj = new Student("张三",23);

19

20 (new People("小红", 24));

21

22 (new People("小王", 25));

黑马程序员济南中心 编著 23

24 (new People("小李", 26));

25

26 Object[] arr = y(); // 将集合转换成数组

27

28 for (int i = 0; i < ; i++) {

29

30 People s = (People) arr[i]; // 强转成Student

31

32 n(e() + "," + ());

33 }

34 }

35 }

36

37 class People {

38 private String name;

39 private int age;

40

41 public People() {

42 }

43

44 public People(String name, int age) {

黑马程序员济南中心 编著 45 super();

46 = name;

47 = age;

48 }

49

50 public String getName() {

51 return name;

52 }

53

54 public void setName(String name) {

55 = name;

56 }

57

58 public int getAge() {

59 return age;

60 }

61

62 public void setAge(int age) {

63 = age;

64 }

65 }

集合的遍历之迭代器遍历(集合的专用遍历方式)

黑马程序员济南中心 编著 [Java] 纯文本查看 复制代码

?

01 package ;

02

03 import ist;

04 import tion;

05 import or;

06

07 /**

08 * Iterator遍历集合

09 *

10 * @author Somnus

11 *

12 */

13 public class Demo {

14

15 public static void main(String[] args) {

16

17 Collection coll = new ArrayList();

18 (new People("小明", 23));

19 (new People("小红", 24));

20 (new People("小王", 25));

黑马程序员济南中心 编著 21 (new People("小李", 26));

22 n("-----------第一种使用方式---------------");

23 Iterator it = or(); // 获取迭代器

24 while (t()) { // 判断集合中是否有元素

25 People s = (People) (); // 向下转型

26 n(e() + "," + ()); // 获取对象中的姓名和年龄

27 }

28 n("-----------第二种使用方式---------------");

29 for (Iterator ite = or(); t();) {

30 People s = (People) (); // 向下转型

31 n(e() + "," + ()); // 获取对象中的姓名和年龄

32 }

33 }

34 }

35

36 class People {

37 private String name;

38 private int age;

39

40 public People() {

41 }

42

黑马程序员济南中心 编著 43 public People(String name, int age) {

44 super();

45 = name;

46 = age;

47 }

48

49 public String getName() {

50 return name;

51 }

52

53 public void setName(String name) {

54 = name;

55 }

56

57 public int getAge() {

58 return age;

59 }

60

61 public void setAge(int age) {

62 = age;

63 }

64 }

黑马程序员济南中心 编著 迭代器

(1)迭代器就是取出集合元素的方式

(2)迭代器的作用

因为每个集合中元素的取出方式都不一样,于是就把元素的取出方式进行抽取,并定义在集合内部,

这样取出方式就可以直接访问集合内部的元素;

而每个容器的数据结构不同,所以取出动作的细节也不一样,但是有共性内容:判断和取出。

那么就将共性内容进行抽取,从而形成了接口Iterater

(3)获取迭代器的方法:

Iterator iterator() 返回在此 collection 的元素上进行迭代的迭代器。

Iterator iterator() 返回在此 set 中的元素上进行迭代的迭代器。

(3)迭代器方法:

boolean hasNext() 如果仍有元素可以迭代,则返回 true。

E next() 返回迭代的下一个元素。

void remove() 从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)。

List集合概述

List接口是Collection接口的一个子接口。

List接口中的元素有如下特点(对角标的操作都是特有方法,因为有序:

A:元素有序(存储顺序和取出顺序一致)

黑马程序员济南中心 编著 B:元素可以重复

List接口中的特有方法

A:add(int index,Object obj):在指定位置加入元素

B:remove(int index):移除指定位置的元素

C:set(int index,Object obj):修改指定位置的元素

D:get(int index):获取指定位置的元素

E:indexOf(Object obj):获取指定元素的位置

F:subList(int start,int end):从一个大的List中截取一个小的List

G:listIterator():返回一个List接口特有的迭代器

List集合通过size()和get()方法结合遍历

[Java] 纯文本查看 复制代码

?

01 /**[/align] * 通过size()和get()方法结合遍历集合

02 *

03 * @author Somnus

04 *

05 */

06 public class Demo {

07

08 public static void main(String[] args) {

黑马程序员济南中心 编著 09

10 List list = new ArrayList<>();

11 (new People("张三", 18));

12 (new People("李四", 18));

13 (new People("王五", 18));

14 (new People("赵六", 18));

15 for (int i = 0; i < (); i++) {

16 People s = (People) (i);

17 n(e() + "," + ());

18 }

19 }

20 }

21

22 class People {

23 private String name;

24 private int age;

25

26 public People() {

27 }

28

29 public People(String name, int age) {

30 super();

黑马程序员济南中心 编著 31 = name;

32 = age;

33 }

34

35 public String getName() {

36 return name;

37 }

38

39 public void setName(String name) {

40 = name;

41 }

42

43 public int getAge() {

44 return age;

45 }

46

47 public void setAge(int age) {

48 = age;

49 }

50 }

集合框架并发修改异常产生的原因及解决方案

黑马程序员济南中心 编著 [Java] 纯文本查看 复制代码

?

01 /**[/align] * 需求:判断集合里面有没有"孙先生",如果有当找到"孙先生"的时候添加一个"吴女士",请写代02 实现。

03 *

04 * @author Somnus

05 */

06 public class Demo {

07

08 public static void main(String[] args) {

09

10 List list = new ArrayList();

11 (new People("赵先生", 19));

12 (new People("钱先生", 19));

13 (new People("孙先生", 19));

14 (new People("李先生", 19));

15 (new People("周先生", 19));

16 // Iterator it = or();

17 // while (t()) {

18 // People p = (People) ();

19 // if (e().equals("孙先生")) {

20 // (new People("吴女士", 19)); //

黑马程序员济南中心 编著 21 // 这里会抛出ConcurrentModificationException并发修改异常

22 // }

23 // }

24

25 // 在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生26 ConcurrentModificationException(当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常)

27 // 解决方案

28 // a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)

29 // b:集合遍历元素,集合修改元素

30 ListIterator lit = erator(); // 如果想在遍历的过程中添加元素,可以用ListIter31 中的add方法

32 while (t()) {

33 People p = (People) ();

34 if (e().equals("孙先生")) {

35 (new People("吴女士", 20));

36 }

37 }

38 }

39 }

40

41 class People {

42 private String name;

黑马程序员济南中心 编著 43 private int age;

44

45 public People() {

46 }

47

48 public People(String name, int age) {

49 super();

50 = name;

51 = age;

52 }

53

54 public String getName() {

55 return name;

56 }

57

58 public void setName(String name) {

59 = name;

60 }

61

62 public int getAge() {

63 return age;

64 }

黑马程序员济南中心 编著 65

66 public void setAge(int age) {

= age;

}

}

ListIterator:列表迭代器

Iterator方法有限,只能对元素进行判断、取出和删除的操作

ListIterator可以对元素进行添加和修改动作等。

获取列表迭代器方法:

ListIterator listIterator() 返回此列表元素的列表迭代器(按适当顺序)。

ListIterator listIterator(int index)

返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始。

列表迭代器方法:

void add(E e) 将指定的元素插入列表(可选操作)。

boolean hasPrevious() 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。

int nextIndex() 返回对 next 的后续调用所返回元素的索引。

E previous() 返回列表中的前一个元素。

int previousIndex() 返回对 previous 的后续调用所返回元素的索引。 void set(E e)

用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。

Vector类概述

黑马程序员济南中心 编著 Vector(JDK1.0):底层数据结构是数组数据结构.特点是查询和增删速度都很慢。

默认长度是10,当超过长度时,按100%延长集合长度。

线程同步。

Vector功能跟ArrayList功能一模一样,已被ArrayList替代)

Vector类特有功能

public void addElement(E obj)

public E elementAt(int index)

public Enumeration elements()

Vector的迭代

[Java] 纯文本查看 复制代码

?

01 /**

02 * Vector迭代

03 *

04 * @author Somnus

05 */

06 public class Demo {

07

08 public static void main(String[] args) {

09

10 Vector v = new Vector(); // 创建集合对象,List的子类

黑马程序员济南中心 编著 11 ment("a");

12 ment("b");

13 ment("c");

14 ment("d");

15 // Vector迭代

16 Enumeration en = ts(); // 获取枚举

17 while (eElements()) { // 判断集合中是否有元素

18 n(ement());// 获取集合中的元素

19 }

20 }

21 }

数据结构之数组和链表

数组的特点:

1.查询快修改也快

2.增删慢

链表的特点:

1.查询慢,修改也慢

2.增删快

List的三个子类

ArrayList:

黑马程序员济南中心 编著 底层数据结构是数组,查询快,增删慢。

线程不安全,效率高。

Vector:

底层数据结构是数组,查询快,增删慢。

线程安全,效率低。

Vector相对ArrayList查询慢(线程安全的)

Vector相对LinkedList增删慢(数组结构)

LinkedList:

底层数据结构是链表,查询慢,增删快。

线程不安全,效率高。

Vector和ArrayList的区别

Vector是线程安全的,效率低

ArrayList是线程不安全的,效率高

共同点:都是数组实现的

ArrayList和LinkedList的区别

ArrayList底层是数组结果,查询和修改快

LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢

共同点:都是线程不安全的

List的三个子类分别都是什么时候用?

查询多用ArrayList

增删多用LinkedList

黑马程序员济南中心 编著 如果都多ArrayList

黑马程序员济南中心 编著