目录
内容仅供学习交流,如有问题请留言或私信!!!!!
有空您就点点赞
1.集合框架
如果并不知道程序运行时会需要多少对象,或者需要 更复杂方式存储对象——可以使用Java集合框架。
包含的内容:
- Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。
- Collection 接口存储一组不唯一,无序的对象。
- List 接口存储一组不唯一,有序(插入顺序)的对象。
- Set 接口存储一组唯一,无序的对象。
- Map 接口存储一组键值对象,提供key到value的映射
list接口实现的类:
- ArrayList:实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高(内部使用数组实现,查询效率高,增删效率低)。
- LinkedList:采用链表存储方式,插入、删除元素时效率比较高(内部使用双向链表实现,增删效率高,查询效率低)。
-----------------------------------------------------------------------------------------------------------------------
ArrayList常用方法
方法名 | 说明 |
boolean add(Object o) | 在列表的末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
Collection接口常用通用方法还有:clear()、isEmpty()、iterator()、toArray()
import java.awt.List;
import java.util.ArrayList;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("a");//向后新增值
list.add("b");
list.add(1, "c");//指定位置插入
list.add(1, "d");
list.add("e");
list.add("f");
System.out.println(Arrays.toString(list.toArray()));
System.out.println("获得集合长度===="+list.size());
System.out.println("根据下标获得值===="+list.get(3));
boolean bool = list.contains("a");
System.out.println("判断列表中是否存在指定元素===="+bool);
System.out.println("根据内容删除元素===="+list.remove("a"));
System.out.println(Arrays.toString(list.toArray()));
System.out.println("根据下标删除元素===="+list.remove(1));
System.out.println(Arrays.toString(list.toArray()));
}
}
-----------------------------------------------------------------------------------------------------------------------
LinkedList常用方法
方法名 | 说明 |
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
使用方法同ArrayList。
-----------------------------------------------------------------------------------------------------------------------
Set接口
- Set接口存储一组唯一,无序的对象
- HashSet是Set接口常用的实现类
- Set中存放对象的引用
无序、唯一性测试:
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
//无序、唯一性测试
public class test {
public static void main(String[] args) {
Set sets = new HashSet();
// String s1 = "张三";
// String s2 = s1;
// String s3 = "王五";
//----------------------------
String s1 = new String("张三");
String s2 = new String("张三");
String s3 = "王五";
sets.add(s1);
sets.add(s2);
sets.add(s3);
System.out.println(Arrays.toString(sets.toArray()));
}
}
Set接口如何判断加入对象是否已经存在呢?
采用对象的equals()方法比较两个对象是否相等
Set set=new HashSet();
String s1=new String("java");
String s2=s1;
String s3=new String ("java");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());
HashSet是Set接口常用的实现类
Set newsTitleSet = new HashSet();
NewTitle car = new NewTitle(1, "汽车", "管理员");
//增加元素
newsTitleSet.add(car);
//获取元素个数
System.out.println("新闻标题数目为:" + newsTitleList.size() + "条");
Set接口不存在get()方法,通过迭代器和增强for循环来进行。
迭代器Iterator
当集合内容很大时使用迭代器(效率较高)
- 方法1:通过迭代器Iterator实现遍历
- 获取Iterator :Collection 接口的iterator()方法
- Iterator it = sets.iterator();
- Iterator的方法
- boolean hasNext(): 判断是否存在另一个可访问的元素
- Object next(): 返回要访问的下一个元素
- while (it.hasNext()) {
//判断下一个是否有值
System.out.println(it.next());
}
- while (it.hasNext()) {
- 方法2:增强型for循环
for( 元素的数据类型 变量名 : 数组名/集合名 ){
}
-----------------------------------------------------------------------------------------------------------------------
eg:
for(Object obj : sets) {
System.out.println(obj);
}
-----------------------------------------------------------------------------------------------------------------------
Map接口
存储一组键值对象,提供key到value的映射。
- Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作。
- 常用的是HashMap。
- put(key,value)//存放
- get(key) //获得键值
- size( ) //获取键值对对数
Map接口常用方法:
方法名 | 说明 |
Object put(Object key, Object val) | 以“键-值”对的方式进行存储 |
Object get(Object key) | 根据键返回相关联的值,如果不存在指定的键,返回null |
Object remove(Object key) | 删除由指定的键映射的“键-值对” |
int size() | 返回元素个数 |
Set keySet() | 返回键的集合 |
Collection values() | 返回值的集合 |
boolean containsKey(Object key) | 如果存在由指定的键映射的“键-值对”,返回true |
常用方法测试如下:
package dh02;
import java.util.HashMap;
import java.util.Map;
/*
* map
* 国家中英文名称信息对照
*
* 中国-China
* 美国-USA
* 日本-Japan
*
*/
public class CountriesInfo {
public static void main(String[] args) {
// 创建集合对象,并将国家信息键值放入集合
Map countries = new HashMap();
countries.put("China", "中国");
countries.put("USA", "美国");
countries.put("Japan", "日本");
// 获取集合中存储的元素个数(键值对对数)
System.out.println(countries.size());
// 获取结合中特定的key对应的value--object返回值类型,需要强制数据类型转换
String country = (String) countries.get("China");
System.out.println(country);
// 获取结合中特定的key对应的value,如果找不到,则返回null
String country1 = (String) countries.get("Australia");
System.out.println(country1);
//判断集合中是否存在某一个国家
System.out.println("国家列表中是否存在China:"+countries.containsKey("China"));
System.out.println("国家列表中是否存在Australia:"+countries.containsKey("Australia"));
//删除某个特定的key对应的键值对
System.out.println("国家列表中是否存在USA:"+countries.containsKey("USA"));
countries.remove("USA");
System.out.println("国家列表中是否存在USA:"+countries.containsKey("USA"));
System.out.println(countries.size());
//获取键的集合,值的集合,键值对的集合
System.out.println(countries.keySet());
System.out.println(countries.values());
System.out.println(countries);
}
}
遍历Map集合
- 方法一:遍历key,通过key > value
- 方法1:通过迭代器Iterator实现遍历
// 方法一:迭代器Iterator遍历key的集合(Set)
Iterator it = keys.iterator();
while (it.hasNext()) {
String key = (String) it.next();// 获取到了map中的每一个key
String value = (String) countries.get(key);// 根据map中的每个key去获取对应的value
System.out.println(key + "-----" + value);}
- 方法2:增强型for循环
// 遍历Map 思路一:遍历key(set),通过key > value
// 方法一:增强for遍历key的集合(set)Set keys = countries.keySet();// 获取到了Map中的所有key
for (Object obj : keys) {
String key = (String) obj;// 获取到了map中的每一个key
String value = (String) countries.get(key);// 根据map中的每个key去获取对应的value
System.out.println(key + "-----" + value);
}
- 方法1:通过迭代器Iterator实现遍历
- 方法二:遍历key-value对
// 遍历Map 思路二:获取map中的所有键值对,然后再键值对中分别获取key和value
Set set = countries.entrySet();// 获取map中的键值对
// 遍历键值对的集合,把每个键值对(obj)---Map.Entry(键值对的类型)拿出来
for (Object obj : set) {
Map.Entry me = (Map.Entry) obj;
String key = (String)me.getKey();// 获取键值对中的键
String value = (String)me.getValue();// 获取键值对中的值
System.out.println(key + "-----" + value);
}
练习:根据学生英文名查看是否在map中
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
//测试学生信息
public class TestStudent {
public static void main(String[] args) {
Student stu1 = new Student("张三", "男");
Student stu2 = new Student("李明", "男");
Student stu3 = new Student("王小华", "女");
Map stuMap = new HashMap();
stuMap.put("Buck",stu1);
stuMap.put("Jack",stu2);
stuMap.put("Jession",stu3);
//输出几名学生进入外企
System.out.println("一共有"+stuMap.size()+"名学生进入");
System.out.println("---------------他们是---------------");
Set set = stuMap.entrySet();
for (Object object : set) {
Map.Entry me = (Map.Entry)object;
String key = (String)me.getKey();
Student student = (Student)me.getValue();
System.out.println(key+"-"+student.getName()+"-"+student.getSex());
}
//实现特定英文名称对应的学生信息
System.out.println("*********************************");
Scanner sc = new Scanner(System.in);
System.out.print("请输入您要查询的学生英文名:");
String name = sc.next();
if (stuMap.containsKey(name)) {
//在map中找到了相应的key,则根据key去获取相应的value(学生对象)
Student student = (Student)stuMap.get(name);
System.out.println("该学生的全部信息如下:");
System.out.println(name+"-"+student.getName()+"-"+student.getSex());
}
else {
System.out.println("对不起,没有该名学生!!!!!");
}
}
}
-----------------------------------------------------------------------------------------------------------------------
泛型集合
- 如何解决以下强制类型转换时容易出现的异常问题?
- List的get(int index)方法获取元素
- Map的get(Object key)方法获取元素
- Iterator的next()方法获取元素
- 通过泛型
- JDK5.0使用泛型改写了集合框架中的所有接口和类
泛型:将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。
本质上是参数化类型(以数据类型作为参数进行传递)。
有了泛型,不再需要进行强制类型转换
泛型集合:
- 泛型集合可以约束集合内的元素类型
- 典型的泛型集合ArrayList<E>、HashMap<k,v>
- <E>、<K,V>表示该泛型集合中的元素类型
- 泛型集合中的数据不再转换为Object
- 除了指定了集合中的元素类型外,泛型集合和之前学习的集合的用法完全一样
-----------------------------------------------------------------------------------------------------------------------
Collections算法类
- Java集合框架将针对不同数据结构算法的实现都保存在工具类中
- Collections类定义了一系列用于操作集合的静态方法
Collections类常用方法:
- Collections和Collection不同,前者是集合的操作类,后者是集合接口
- Collections提供的常用静态方法
- sort():排序
- max()\min():查找最大\最小值
- reverse():反转元素顺序
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
//Collections的常用方法
public class CollectionsUseDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("ant");
list.add("bear");
list.add("pen");
list.add("zoo");
list.add("apple");
list.add("candy");
list.add("zookeeper");
System.out.println("**********************");
for (String s : list) {
System.out.println(s);
}
System.out.println("**********************");
//使用Collections对集合进行升序排列
Collections.sort(list);
for (String s : list) {
System.out.println(s);
}
//查找集合元素的最大、最小值
System.out.println("**********************");
System.out.println("集合中的最大元素:"+Collections.max(list));
System.out.println("集合中的最小元素:"+Collections.min(list));
//查找集合中的特定元素(必须进行排序)
System.out.println("**********************");
System.out.println(Collections.binarySearch(list, "candy"));
//反转集合元素的顺序
Collections.reverse(list);
System.out.println("**********************");
for (String s : list) {
System.out.println(s);
}
}
}
-----------------------------------------------------------------------------------------------------------------------
Collections排序:
- Collections类可以对集合进行排序、查找和替换操作
- 实现一个类的对象之间比较大小
- 第一步:该类要实现Comparable接口
- 第二步:重写compareTo()方法,自定义比较规则
eg:
第一步&第二步
package dh02;
//学员类
public class Student implements Comparable{
private int no;//学号
private String name;
private String sex;
public Student() {
}
public Student(String name, String sex) {
this.name = name;
this.sex = sex;
}
public Student(int no, String name, String sex) {
this.no = no;
this.name = name;
this.sex = sex;
}
//--------------------------
//重写方法:定义学生对象的比较规则
//比较规则:按学号比,大的往后排
//比较对象:当前学生对象(this)和Object o
public int compareTo(Object o) {
Student student = (Student)o;
if (this.no == student.no) {
return 0;//学号相同,两个学生对象一样大
}
else if (this.no > student.no) {
return 1;//当前学生对象学号大于比较的学生对象学号
}
else {
return -1;//当前学生对象学号小于比较的学生对象学号
}
}
//--------------------------
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
测试类
package dh02;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
//Collections的常用方法
public class CollectionsStudent {
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();
Student stu1 = new Student(1, "张三", "男");
Student stu2 = new Student(7, "李四", "男");
Student stu3 = new Student(3, "王小花", "女");
Student stu4 = new Student(9, "王五", "男");
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
System.out.println("**********************");
for (Student stu : list) {
System.out.println(stu.getNo()+"-"+stu.getName()+"-"+stu.getSex());
}
System.out.println("**********************");
// 使用Collections对集合进行升序排列
Collections.sort(list);
for (Student stu : list) {
System.out.println(stu.getNo()+"-"+stu.getName()+"-"+stu.getSex());
}
}
}
总结
练习题跳转链接:请点击这里!!!
补充:
- ArrayList数组初始容量为:0
- 如何进行扩容?通过copyof
- 每次扩容多少?1.5倍