01-集合框架概述.
1.内存层面需要针对于多个数据进行存储。此时,可以考虑的容器有:数组、集合类
2.数组存储多个数据方面的特点:
- 数组一旦初始化,其长度就是确定的。
- 数组中的多个元素是依次紧密排列的,有序的,可重复的
- (优点)数组一旦初始化完成,其元素的类型就是确定的。不是此类型的元素,就不能添加到此数组中
- (优点)元素的类型既可以是基本数据类型,也可以是引用数据类型。
数组存储多个数据方面的弊端:
- 数组一旦初始化,其长度就不可变了。
- 数组中存储数据特点的单一性。对于无序的、不可重复的场景的多个数据就无能为力了。
- 数组中可用的方法、属性都极少。具体的需求,都需要自己来组织相关的代码逻辑。
- 针对于数组中元素的删除、插入操作,性能较差。
-
Java集合框架体系(java . util包下)
java. util. Collection:存储-一个-一个的数据
-
子接口: List:存储有序的、可重复的数据(”动态“数组)
|---- ArrayList(主要实现类)、LinkedList、Vector -
子接口: Set:存储无序的、不可重复的数据(类似于高中的集合)
|---- HashSet、LinkedHashSet、TreeSetjava.util.Map:存储一对—对的数据(key-value键值对,(x1,y1)、(x2,y2) --> y=f(x),类似于高中的函数)
-
HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
4.学习的程度把握:
-
层次1:针对于具体特点的多个数据,知道选择相应的适合的接口的主要实现类,会实例化,会调用常用的方法。
-
层次2:区分接口中不同的实现类的区别。
-
层次3:① 针对于常用的实现类,需要熟悉底层的源码熟悉常见的数据结构
ArrayList()
2.1添加
/*
2.1添加
(1) add(Object obj):添加元素对象到当前集合中
(2) addAll(Collection other):添加other集合中的所有元素对象到当前集合中,即this = this U other
*/
public void test1(){
Collection coll=new ArrayList();
//add()
coll.add("AA");
coll.add(123);//自动装箱
coll.add("性格");
coll.add(new Object());
coll.add(new Person("tom",12));
System.out.println(coll);//[AA, 123, 性格, java.lang.Object@4617c264, Person{name='tom', age=12}]
//addAll()
Collection coll1=new ArrayList();
coll1.add("www");
coll1.add(465);
System.out.println(coll.size());//5
coll.addAll(coll1);
System.out.println(coll);//[AA, 123, 性格, java.lang.Object@4617c264, Person{name='tom', age=12}, www, 465]
//size():元素个数
System.out.println(coll.size());//7
}
2.2判断
(3) int size():获取当前集合中实际存储的元素个数
(4) boolean isEmpty():判断当前集合是否为空集合
(5) boolean contains(Object obj):判断当前集合中是否存在一个与obj对象equals返回true的元素
(6) boolean containsAl(Collection coll):判断coll集合中的元素是否在当前集合中都存在。即coll集合是否是当前集合的“子集”
(7) boolean equals(Object obj):判断当前集合与obj是否相等
public void test2(){
Collection coll=new ArrayList();
//add()
coll.add("AA");
coll.add(123);//自动装箱
coll.add(new String("性格"));
coll.add(new Person("tom",12));
//isEmpty()
System.out.println(coll.isEmpty());
//contains(Object obj)
System.out.println(coll.contains("AA"));//true
System.out.println(coll.contains(123));//true
System.out.println(coll.contains(new String("性格")));//true,比的是内容equal
System.out.println(coll.contains(new Person("tom",12)));//false,equal没有重写.重写后为true
//containsAl(Collection coll)
Collection coll1=new ArrayList();
coll1.add("AA");
coll1.add(465);
System.out.println(coll.containsAll(coll1));//false
}
2.3删除
(8) void clear():清空集合元素
(9) boolean remove(Object obj)︰从当前集合中删除第一个找到的与obj对象equals返回true的元素。
(10) boolean removeAl(Collection coll):从当前集合中删除所有与coll集合中相同的元素。即this = this - this ∩coll //差集
(11) boolean retainAll(Collection coll):从当前集合中删除两个集合中不同的元素,使得当前集合仅保留与coll集合中的元素相同的元素,即当前集合中仅保留两个集合的交集,即this = this ∩ coll; //交集
public void test3(){
Collection coll=new ArrayList();
//add()
coll.add("AA");
coll.add(123);//自动装箱
coll.add(new String("性格"));
coll.add(new Person("tom",12));
//clear()
// coll.clear();
// System.out.println(coll);//[]
// System.out.println(coll.size());//0
//remove
System.out.println(coll);//[AA, 123, 性格, Person{name='tom', age=12}]
coll.remove(new String("性格"));//删的是内容
System.out.println(coll);//[AA, 123, Person{name='tom', age=12}]
}
2.4其它
(12) object[] toArray():返回包含当前集合中所有元素的数组
(13) hashCode():获取集合对象的哈希值
(14) iterator():返回迭代器对象,用于集合遍历
public void test4(){
Collection coll=new ArrayList();
//add()
coll.add("AA");
coll.add(123);//自动装箱
coll.add(new String("性格"));
coll.add(new Person("tom",12));
//集合---》数组 toArray()
Object[] array = coll.toArray();
System.out.println(Arrays.toString(array));//[AA, 123, 性格, Person{name='tom', age=12}]
}
2.集合与数组的相互转换:
- 集合--->数组:toArray(
- 数组--->集合:调用Arrays的静态方法asList(Object ... objs)
public void test5(){
String[] arr=new String[]{"aa","bb"};
List<String> list = Arrays.asList(arr);
System.out.println(list);//[aa, bb]
}
3.向Collection中添加元素的要求:
- 要求:元素所属的类一定要重写equals()!
- 原因:因为Collection中的相关方法(比如: contains() / remove())在使用时,要调用元素所在类的equals()。
03-迭代器的使用与增强for循环
1.迭代器(Iterator)的作用?用来遍历集合元素的。
2.如何获取迭代器(Iterator)对象?
Iterator iterator = coll.iterator();
3.如何实现遍历(代码实现)
while(iterator.hasNext()){
System.out.println(iterator.next());//next() :①指针下移②将下移以后集合位置上的元素返回
}
public void test6(){
Collection coll=new ArrayList();
coll.add("AA");
coll.add(123);//自动装箱
coll.add(new String("性格"));
coll.add(new Person("tom",12));
//获取迭代器对象
Iterator iterator = coll.iterator();
//方式1
// System.out.println(iterator.next());
// System.out.println(iterator.next());
// System.out.println(iterator.next());
// System.out.println(iterator.next());
//方式2
// for (int i = 0; i < coll.size(); i++) {
// System.out.println(iterator.next());
// }
//方式3 常用
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
4.增强for循环(foreach循环)的使用(jdk5.0新特性)
4.1 作用
用来遍历数组、集合。
4.2格式:
for(要遍历的集合或数组元素的类型临时变量︰要遍历的集合或数组变量){
操作临时变量的输出
}
public void test7(){
Collection coll=new ArrayList();
coll.add("AA");
coll.add(123);//自动装箱
coll.add(new String("性格"));
coll.add(new Person("tom",12));
for (Object o:coll) {
System.out.println(o);
}
}
4.3说明:
- 针对于集合来讲,增强for循环的底层仍然使用的是迭代器。
- 增强for循环的执行过程中,是将集合或数组中的元素依次赋值给临时变量,注意,循环体中对临时变量的修改,可能不会导致原有集合或数组中元素的修改。
04-List接口与实现类的使用.
1.List接口中存储数据的特点:用于存储有序的、可以重复的数据。--->使用List替代数组,"动态"数组
2.List中的常用方法:
第1波:Collection中声明的15个方法。
第2波:因为List是有序的,进而就有索引,进而就会增加一些针对索引操作的方法。-插入元素
- 'void add(int index,0bject ele)`:在index位置插入ele元素
- boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来-获取元素
0bject get(int index)
:获取指定index位置的元素- List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合-获取元素索引
- int index0f(Object obj):返回obj在集合中首次出现的位置
- int lastIndexOf(0bject obj):返回obj在当前集合中末次出现的位置-删除和替换元素
Object remove(int index)
:移除指定index位置的元素,并返回此元素-Object set(int index,0bject ele)
:设置指定index位置的元素为ele
小结:
增
add(Object obj)
addAll(Collection coll)
删
remove(0bject obj)
remove(int index)
改
set(int index, 0bject ele)
查
get(int index)
插
add(int index,0bject ele)
addAll(int index,Collection eles)
长度
size()
遍历
iterator() :使用迭代器进行遍历
增强for循环
一般的for循环
3. List及其实现类特点
java.util.Collection:存储一个一个的数据
l-----子接口:List:存储有序的、可重复的数据("动态"数组)
- ArrayList:List的主要实现类﹔线程不安全的、效率高﹔底层使用Object[]数组存储
在添加数据、查找数据时,效率较高;在插入、删除数据时,效率较低 - LinkedList:底层使用双向链表的方式进行存储;在对集合中的数据进行频繁的删除、插入操作时,建议使用此类
在插入、删除数据时,效率较高;在添加数据、查找数据时,效率较低; - Vector:List的古老实现类﹔线程安全的、效率低﹔底层使用0bject[]数组存储
案例:键盘录入学生信息,保存到集合List中。
(1)定义学生类,属性为姓名、年龄,提供必要的getter、setter方法,构造器, toString(),equals()方法。
(2)使用ArrayList集合,保存录入的多个学生对象。
(3)循环录入的方式,1:继续录入,0:结束录入。
(4)录入结束后,用foreach遍历集合。
package com.xin.kuangjia.demo02;
import java.util.Objects;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
}
============
package com.xin.kuangjia.demo02;
import java.util.ArrayList;
import java.util.Scanner;
public class StudentList {
public static void main(String[] args) {
ArrayList list=new ArrayList();
Scanner scanner = new Scanner(System.in);
System.out.println("请录入学生的信息");
int nextInt=1;
while (nextInt==1) {
System.out.println("1:继续录入,0:结束录入");
nextInt = scanner.nextInt();
if (nextInt==1){
Student student1 = new Student();
System.out.print("请输入学生姓名:");
student1.setName(scanner.next());
System.out.print("请输入学生年龄:");
student1.setAge(scanner.nextInt());
list.add(student1);
}
}
scanner.close();
System.out.println("遍历学生信息:");
for (Object s :
list) {
System.out.println(s);
}
}
}
案例:
定义方法public static int listTest(Collection list,String s)统计集合中指定元素出现的次数
(1)创建集合,集合存放随机生成的30个小写字母
(2)用listTest统计,a、b、c、x元素的出现次数
package com.xin.kuangjia.demo02;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Random;
public class Day90200 {
public static void main(String[] args) {
ArrayList list=new ArrayList();
Random random = new Random();
for (int i = 0; i < 30; i++) {
char c = (char) (random.nextInt(26) + 97);
list.add(c+"");//将char转换为String
}
System.out.println(list);
int a = listTest(list, "a");
System.out.println("a的次数:"+a);
int b = listTest(list, "b");
System.out.println("b的次数:"+b);
int c = listTest(list, "c");
System.out.println("c的次数:"+c);
int x = listTest(list, "x");
System.out.println("x的次数:"+x);
}
public static int listTest(Collection list ,String s){
int count=0;
for (Object o :
list) {
if (s.equals(o)){//String可以比,但是char不行
count++;
}
}
return count;
}
}
标签:01,add,System,println,coll,概述,集合,out
From: https://www.cnblogs.com/xin-zhi-suo-xiang/p/17673528.html