> Java > java지도 시간 > Java 컬렉션 프레임워크 아키텍처 소개

Java 컬렉션 프레임워크 아키텍처 소개

零下一度
풀어 주다: 2017-07-23 10:24:53
원래의
2657명이 탐색했습니다.

1. 세트 개요<br>

1) 세트의 개념

실생활에서의 세트는 여러 가지가 함께 모이는 것입니다.

수학의 집합: 공통 속성을 가진 사물의 모음입니다.

Java의 컬렉션 클래스: 공통 속성을 가진 여러 객체를 저장하는 컨테이너와 같은 도구 클래스입니다.

2) 집합의 역할

클래스 내부에 동일한 유형의 속성이 여러 개 있고, 그 기능과 의미가 동일한 경우. 예를 들어, 학생은 여러 과목을 선택할 수 있습니다. 학생 수업의 경우 XX 과목은 해당 학생의 속성이며 일반적으로 하나 이상의 XX 과목이 있습니다. 이런 상황에서는 강좌별로 속성을 정의하는 것이 너무 번거로울 수 있습니다. 여기서는 집합이라는 개념을 사용해야 합니다.

요약하자면 sets의 기능은 다음과 같습니다.

  1. 클래스 내부에서 데이터를 정리합니다.

  2. 많은 양의 항목을 간단하고 빠르게 검색하세요.

  3. 일부 컬렉션 인터페이스는 일련의 정렬된 요소를 제공하며 관련 요소를 시퀀스 중간에 빠르게 삽입하거나 삭제할 수 있습니다.

  4. 일부 컬렉션 인터페이스는 매핑 관계를 제공하며 키를 통해 해당 고유 개체를 빠르게 찾을 수 있으며 이 키는 모든 유형이 될 수 있습니다.

3) 집합과 배열의 비교

집합과 배열은 모두 일련의 데이터를 컨테이너에 담는다는 것을 알 수 있는데 왜 Woolen에서는 배열 대신 집합을 사용할까요? 옷감?

  1. 배열의 길이는 고정되어 있고 컬렉션의 길이는 가변적입니다. 컬렉션의 장점은 내부 콘텐츠에 따라 컬렉션의 길이가 확장되는 반면 배열의 길이는 이미 정의되어 있다는 것입니다.

  2. 배열은 첨자를 통해서만 요소에 액세스할 수 있으며 유형은 고정되어 있습니다(배열 첨자는 정수만 가능). 반면 일부 세트는 모든 유형을 통해 매핑된 특정 개체를 찾을 수 있습니다(키 키워드는 모든 유형이 될 수 있음).


2. Java Collection Framework Architecture

Java Collection Framework에 대해 간략하게 살펴보겠습니다. (목록에 포함되지 않은 인터페이스와 클래스가 많으며 여기에는 일반적으로 사용되는 인터페이스와 클래스만 나열되어 있습니다.)

그림에 표시된 대로 JAVA 컬렉션 프레임워크 아키텍처: 컬렉션과 맵은 두 개의 루트 인터페이스입니다.

컬렉션 인터페이스: 내부 저장소는 독립적인 개체입니다. 포함:

1. 목록 인터페이스: sequence, 요소를 질서 있고 반복 가능한 방식으로 저장합니다. 구현 클래스: ArrayList, 배열 시퀀스; 구현 클래스: LinkedList, 연결된 목록.

2. 대기열 인터페이스:

Queue, 요소를 질서 있고 반복 가능한 방식으로 저장합니다. 구현 클래스: LinkedList, 연결된 목록. 3. 집합 인터페이스:

set

, 요소를 순서가 없고 반복할 수 없는 저장합니다. 구현 클래스: HashSet, 해시 세트.

Map 인터페이스:

내부적으로 (모든 유형) 매핑을 사용하여 데이터를 저장합니다. 이 매핑은 Entry 클래스(Map의 내부 클래스)의 인스턴스입니다. 포함 사항: 구현 클래스: HashMap, 해시 테이블. Collection 인터페이스는 List, Set 및 Queue 인터페이스의 상위 인터페이스입니다. Collection 인터페이스는 List, Set 및 Queue를 작동하는 데 사용할 수 있는 메서드(추가, 삭제, 수정 및 쿼리)를 정의합니다. (구체적인 Collection 인터페이스 메소드는 API를 통해 확인할 수 있으므로 여기에 나열하지 않겠습니다.)

그 중 ArrayList, HashSet, HashMap이 가장 일반적으로 사용되는 세 가지 구현 클래스입니다. 여기서는 이 세 가지 구현 클래스를 소개하겠습니다. 하나씩.

이 글에서는 먼저 ArrayList의 사용법을 소개하겠습니다.

3. ArrayList 구현 클래스

<br>

List 인터페이스 및 해당 구현 클래스 - ArrayList

List는 각 요소의 삽입 위치를 정확하게 제어하거나 특정 위치의 요소를 삭제할 수 있습니다. add() 삽입 메소드 및 get() 획득 메소드

ArrayList-배열 시퀀스는 List

의 중요한 구현 클래스입니다.

ArrayList의 하위 레이어는 이름의 유래이기도 한 array에 의해 구현됩니다.

그러면 이 컬렉션을 어떻게 사용하나요? 세트를 보다 직관적으로 사용하는 방법을 배우기 위해 작은 예를 사용하고 작은 프로그램을 작성해 보겠습니다. (다음 글의 예시도 이를 토대로 작성되었습니다)

>>>>>>>>>>>>>>>> > ;>>>>>>>>>>>>>>

프로그램 기능 - 학생 과목 선택 기능 시뮬레이션

  1. 과정 선택(컬렉션에 과정 추가)

  2. 선택한 과정 삭제(컬렉션에서 요소 삭제)

  3. 선택한 과정 보기

  4. 선택한 과정 수정

>> >>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>

다음은 테스트에 사용되는 프로그램 코드입니다. 컬렉션 사용 방법을 소개하므로 세부적인 내용은 걱정하지 마세요. 코드는 단계별로 개선될 예정입니다.

1) 학생 수업 및 강좌 수업 만들기
 1 /** 2  * 学生类 3  * @author hysum 4  * 5  */ 6 public class Student implements { 7     private String name;//学生姓名 8     private String id;//学生id 9     private Set courses;//所选课程的set集合10     11     public Student(){}12     public Student(String id,String name){13         this.id=id;14         this.name=name;15         this.courses=new HashSet();//初始化集合16     }17     public String getName() {18         return name;19     }20     public void setName(String name) {21         this.name = name;22     }23     public String getId() {24         return id;25     }26     public void setId(String id) {27         this.id = id;28     }29     public Set getCourses() {30         return courses;31     }32     public void setCourses(Set courses) {33         this.courses = courses;34     }
로그인 후 복사

 1 /** 2  * 课程类 3  * @author hysum 4  * 5  */ 6 public class Course { 7 private String id;//课程id 8     private String name;//课程名称 9     10     public Course(){11         12     }13     public Course(String name){14         this.name=name;15     }16     public String getId() {17         return id;18     }19     public void setId(String id) {20         this.id = id;21     }22     public String getName() {23         return name;24     }25     public void setName(String name) {26         this.name = name;27     }28     public Course(String id,String name){29         this.id=id;30         this.name=name;31     }32 }
로그인 후 복사

2) 대체 강좌 수업 만들기

 1 /** 2  * 备选课程类 3  * 
 4  * @author hysum 5  * 6  */ 7 public class ListCourse { 8 private List CoresesToSelect;// 备选课程 9     private Student stu;10     private static Scanner in;11     {12         in = new Scanner(System.in);13     }14     public ListCourse() {15         this.CoresesToSelect = new ArrayList();// 初始化List集合16     }17        public List getCoresesToSelect() {18         return CoresesToSelect;19     }20 21     public void setCoresesToSelect(List coresesToSelect) {22         CoresesToSelect = coresesToSelect;23     }   26 }
로그인 후 복사
참고:

List는 인터페이스이므로 생성자 메서드에서 직접 인스턴스화할 수 없습니다. , 그리고 ArrayList()를 통해 인스턴스화됩니다! ! !

예: public ListcourseToSelect = new ArrayList();

Set과 Map은 직접 인스턴스화할 수 없습니다. HashSet(), HashMap();

3과 같은 해당 인스턴스화 클래스를 사용해야 합니다. 대체 강좌에 강좌 추가

(요소 추가) 목록 아래의 목록에 요소를 삽입하는 방법은 총 4가지가 있습니다:

1.add(element);

2.add(index,element);

3 .addAll(Arrays.asList(객체 배열 이름));

4.addAll(index,Arrays.asList(객체 배열 이름));

다음 코드 예:
 1 /* 2  * 添加备选课程 3  */ 4 public void AddCourse() { 5         Course cr1=new Course("1","数据结构");//创建课程对象 6     this.CoresesToSelect.add(cr1);//用add(element)添加  7         Course temp=(Course)this.CoresesToSelect.get(0);//用get方法取出,注意类型转换 8     System.out.println("添加了课程:"+temp.getId()+" "+temp.getName()); 9         10         Course cr2=new Course("2","C语言");//创建课程对象11     this.CoresesToSelect.add(0,cr2);//用add(index,element)添加 12     temp=(Course)this.CoresesToSelect.get(0);13         System.out.println("添加了课程:"+temp.getId()+" "+temp.getName());  
14 }
로그인 후 복사

1 Course[] course = { new Course("1", "数据结构"), new Course("2", "C语言"), new Course("3", "汇编语言"),2                 new Course("4", "离散数学") };3         this.CoresesToSelect.addAll(Arrays.asList(course));//用addAll(Arrays.asList(对象数组名))添加
로그인 후 복사
참고 :

1. 객체가 컬렉션에 저장되면 객체 유형으로 꺼낼 때 유형 변환이 필요합니다. (

이 문제는 나중에 제네릭을 사용하여 해결하겠습니다

)

예: Course temp = (Course)coursesToSelect.get(0);

2 목록에 추가된 위치(색인)는 [0, length]; 0은 대기열의 선두에 삽입됨을 의미하고, 길이는 대기열의 끝에 삽입됨을 의미합니다.

3 목록에 추가된 길이가 현재 길이보다 길면 시스템에서 예외가 발생합니다. 즉, 배열 아래 테이블에 다음과 같은 범위를 벗어난 예외가 발생합니다.

4) 대체 강좌를 선택하고 아래에서

인쇄하세요. 세 가지 방법은 모두 목록에서 요소를 제거하는 데 사용됩니다.

-----for 루프------

1 Course cr2=new Course("2","C语言");//创建课程对象2 this.CoresesToSelect.add(2,cr2);//用add方法添加,超出集合现有长度 temp=(Course)
로그인 후 복사
-- ---Iterator----

Iterator는 컬렉션의 존재에 따라 인터페이스가 달라집니다.

1 public void testGet(){2 int size=CoursesToSelect.size();3 for(int i=0;i<size;i++){4 Course cr=(Course) CoursesToSelect.get(i);5 System.out.println("取出的课程:"+cr.getId()+":"+cr.getName());6 }7 }
로그인 후 복사
----각 (

사용 권장)------

1 Iterator it=CourseToSelect.iterator();2 while(it.hasNext()){3 Course cr=(Course) it.next();4 System.out.println("课程:" + cr.id + ":" + cr.name);5 }
로그인 후 복사
5) 대체 코스 수정

세트(인덱스, 개체 요소)를 사용하여 요소를 수정하고, index는 인덱스 위치를 의미하고, 요소는 새 객체를 나타냅니다.

1 for(Object obj:CoursesToSelect){//遍历集合中的每一个元素,作为每一个Object变量2 Course cr=(Course) obj;3 System.out.println("课程:" + cr.id + ":" + cr.name);4 }
로그인 후 복사
6) 대체 강좌 요소 삭제

List에는 컨테이너에 있는 요소의 값(사용 및 추가도 비슷합니다.)

Course는 ID 및 이름 속성이 있는 정보 강좌 클래스이고,courseToSelect는 목록의 시퀀스 컨테이너 개체입니다.

rreee

注意:

1.remove(index);删除位置要大于0并且小于List(序列容器)的长度。如果要删除全部可以用for循环嵌套此方法。

2.remove(object);先要获得删除的值,用法是先定义一个信息变量通过get()来存放要删除的值,然后用remove(删除的对象值);

3.removeAll(Arrays.asList());要删除指定的多个位置 Arrays.asLIst(对象数组名);作用是把数组转换为集合。用法是先创建信息对象数组存放删除元素的值,然后再用removeAll(Arrays.asList(对象数组名))方法,删除集合数组的元素。


四、应用泛型管理课程

在上面的几个例子中,小伙伴是否发现对于集合的取出和遍历都要将Object对象进行强制转换后才能使用,每次这样做不仅增加了编程难度还使代码特别繁琐,这里我们可以利用泛型来帮助我们更加方便地使用java集合。

首先,我们要知道没有使用泛型的话集合中的元素,可以是任意类型的对象(对象的引用),如果把某个对象放入集合,则会忽略他的类型把他当做Object处理。

那么我们就在刚才的例子里往备选课程类里的CoresesToSelect的List集合添加一些奇怪的东西会发什么有趣的事呢?

1    /*2      * 往List中添加一些奇怪的东西3      */4      public void testType(){5      System.out.println("能否往List中添加一些奇怪的东西呢?");6      this.CoresesToSelect.add("我不是课程,我是字符串!");7      }
로그인 후 복사

当调用取出课程方法取出该元素时,运行时出错:

这是因为取出该元素时String类型不能强制转换为Course类型,那有什么办法来避免集合中被添加不希望添加的类型呢?

泛型则是规定了某个集合只可以存放特定类型的对象,会在编译期间进行类型检查,可以直接指定类型获取的集合元素。

泛型:指规定了某个集合只能存放特定类型的对象。

语法:ArrayList<String> array=new ArrayList<String>();  //规定array中只能存放String类型的对象
로그인 후 복사

那么,了解了泛型之后,上面的例子里都可以加上泛型了,修改如下(只列出修改的部分):(自行对比)

1 private Set<Course> courses;//所选课程的set集合2 this.courses=new HashSet<Course>();//初始化集合3 public Set<Course> getCourses() {4         return courses;5     }6     public void setCourses(Set<Course> courses) {7         this.courses = courses;8     }
로그인 후 복사
 1 private List<Course> CoresesToSelect;// 备选课程 2 public ListCourse() { 3         this.CoresesToSelect = new ArrayList<Course>();// 初始化List集合 4     } 5 public List<Course> getCoresesToSelect() { 6         return CoresesToSelect; 7     } 8  9     public void setCoresesToSelect(List<Course> coresesToSelect) {10         CoresesToSelect = coresesToSelect;11     }
로그인 후 복사

foreach循环的修改:

1 for (Course obj : CoresesToSelect) {        
2     System.out.println("添加了课程:" + obj.getId() + " " + obj.getName());4 }
로그인 후 복사
<br>
로그인 후 복사

运用了泛型的话,用foreach语句时 存储变量应该为泛型的类型。for(Course a:courseToSelect),不必再用Object取出再强转,因为已经规定容器里装的都是Course类型。

使用泛型要注意

1.泛型集合中,不能添加泛型规定的类型和其子类以外的对象,否则会报错!

2.泛型中可以添加规定的类型的子类型的对象。如:

1 public void testChild() {2         ChildCourse ccr = new ChildCourse();3         ccr.id = "3";4         ccr.name = "我是子类型的课程对象实例~~";5         courses.add(ccr);6 }
로그인 후 복사

3.不能直接添加基本类型(int,float等)的对象,如果要添加,需要使用其包装类。如:

1 public void testBasicType() {2 List<Integer> list = new ArrayList<Integer>();3 list.add(1);4 System.out.println("基本类型必须使用包装类作为泛型!" + list.get(0));5 }
로그인 후 복사

五、通过Set集合管理课程

Set集合和List一样是Collection接口的子接口。它的方法跟List类似,但有稍许不同,因为Set集合是无序且不重复的。

1)添加学生选课的课程

add方法跟ArrayList一样

 1 li.stu=new Student("1","小明"); 2         System.out.println("欢迎"+li.stu.getName()+"同学选择课程"); 3         for(int i=0;i<3;i++){//循环三次添加选课 4             System.out.println("请选第"+(i+1)+"门课程:"); 5             String Id=in.next(); 6             for(Course c:li.getCoresesToSelect()){ 7                 if(c.getId().equals(Id)){ 8                     li.stu.getCourses().add(c); 9                 }10             }11             12         }
로그인 후 복사

注意:Set 中添加某个对象,无论添加多少次,最终只会保留一个该对象(的引用)。同时,保留的是第一次添加的那一个。Set集合是无序的不可重复的。

2)打印输出学生选的课程

1 //输出学生选的课程2         for(Course c:li.stu.getCourses()){3             System.out.println(c.getId()+" "+c.getName());4 5         }
로그인 후 복사

참고: foreach 또는 iterator만 사용하여 Set의 각 요소를 반복할 수 있으며 List와 같은 get() 메서드는 사용할 수 없습니다. 순서가 없기 때문에 출력 결과가 매번 조금씩 다를 수 있습니다.

>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Set은 List의 set() 메서드처럼 수정되지 않습니다. 왜냐하면 List는 순서가 지정되고 위치를 지정할 수 있는 반면 Set은 순서가 없고 루프 탐색으로 수정될 수 있기 때문입니다. 2. 쿼리 및 순회 시 장애에 인덱스 ID가 지정되지 않아 get() 메서드로 Set을 얻을 수 없지만 foreach 및 iterator를 사용하여 순회할 수 있지만 순서는 매번 다를 수 있습니다. 횡단했거나 장애가 발생했기 때문입니다.

3. Set의 size(), add(), addAll(), Remove(), RemoveAll()은 List와 유사합니다. 4. Set은 null을 추가할 수도 있습니다(단, 반복되지 않으므로 null은 하나만 추가할 수 있습니다).

위 내용은 Java 컬렉션 프레임워크 아키텍처 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿