昨天学习了java中的集合框架,通过集合的学习,不但了解了java中的集合框架,而且对之前的数组、自定义队列有了更深刻的理解。
java中存储数据的有以下几种:
数组:是存放同一类型的数据的集合
链表:有单向链表和双向链表
单向链表中存储子节点的地址
双向链表既存储子节点的地址,也存储父节点的地址
集合:跟数组一样是存储同一类型的数据,但是又有不同,常用的集合有三种List、Set、Map
java中的所有集合都是Collection的子类,在Collection定义了如下方法,它是Set、List、Map的顶层接口,里面的方法 它的实现类都可以直接使用Collection的方法:
boolean add(E e) :
向集合中加入一个对象,如果集中己有这个对象,则返回false;
boolean addAll(Collection<? extends E> c)
将另外一个集合中的所有对象加入这个集合
void clear()
清除集合中的所有对象,执行过后,集合中不在装有对象
boolean contains(Object o)
判断集合是是否存在某个对象
boolean containsAll(Collection<?> c)
判断集合中是否全部存在另外一个集合中的对象
boolean equals(Object o)
比较指定的对象与列表是否相等
int hashCode()
可重写的来自父类的方法
boolean isEmpty()
判断集合是否为空,在执行clear()后调用这个方法,返回true
Iterator<E> iterator()
得到这个集合的一个迭代对象
boolean remove(Object o)
从集合中移除掉一个对象
int size()
返回集合内元素的个数
Object[] toArray()
将集合转变一个数组对象
1、List:是一个接口
List是集合框架中跟数组最相似的,它跟数组一样是一个有序的集合,并且里面存储的元素允许出现重复
List接口实现的子类常见的有:
java.util.ArrayList,
java.util.LinkedList,
java.util.Vector
除从Collection中继承来的方法,ArrayList还增加了一些方法:
boolean addAll(int index, Collection<? extends E> c)
向一个List列表中插入一个对象 ,index必须小与getSize()返回的值。
E get(int index)
取得list列表中指定位置的一个对象,如果index值大于getSize()返回的值,调用将抛出异常。
List的简单测试:
package cn.netjava.testMap;
import java.util.ArrayList;
/**
* 对List进行测试,并且利用List进行除重排序
*
*/
public class testList {
public static void main(String[] args) {
//主函数
ArrayList<Student> al = createArrayList(10);
printList(al);
}
//创建一个List集合,并初始化
public static ArrayList<Student> createArrayList(int length){
ArrayList<Student> al = new ArrayList<Student>();
java.util.Random random = new java.util.Random();
for(int i=0;i<length;i++){
int value = random.nextInt(15)+6;
Student st = new Student("学生"+i,value);
al.add(st);
}
return al;
}
//打印List集合
public static void printList(ArrayList<Student> al){
for(int i=0;i<al.size();i++){
Student st = al.get(i);
System.out.println(st.getName()+"\t"+st.getAge());
}
}
}
运行结果:
学生0 7
学生1 16
学生2 8
学生3 6
学生4 6
学生5 9
学生6 10
学生7 15
学生8 20
学生9 15
2、Set:是一个接口
Set是一个无序的集合,它就像一个箱子一样,把东西放进去,再取出来时无法按照放入的顺序去取,即取出是无序的,
它与List一个不同的地方是:Set里存放的元素不允许重复,若新加入的元素Set中已存在,则已存在的元素将会被新加入的覆盖
由于Set是无序的,取出时不能用for循环一次取出,要利用迭代器iterator()方法,具体实现见代码
Set接口实现的子类常见的有:
java.util.HashSet、
java.util.TreeSet、
java.util.Iterator
java.util.HashSet实现的方法常用的有:
boolean add(E e)
如果此 set 中尚未包含指定元素,则添加指定元素。
void clear()
从此 set 中移除所有元素。
Object clone()
返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。
boolean contains(Object o)
如果此 set 包含指定元素,则返回 true。
boolean isEmpty()
如果此 set 不包含任何元素,则返回 true。
Iterator<E> iterator()
返回对此 set 中元素进行迭代的迭代器。
boolean remove(Object o)
如果指定元素存在于此 set 中,则将其移除。
int size()
返回此 set 中的元素的数量(set 的容量)。
Set的简单实现:
package cn.netjava.testMap;
import java.util.HashSet;
public class testSet {
/**
* 测试Set集合,并用Set实现除重排序
* @param
* @author 谢云
*/
public static void main(String[] args) {
HashSet<Student> hs = createHashSet(10); printSet(hs);
}
//创建一个学生类的集合对象,并初始化
public static HashSet<Student> createHashSet(int length){
HashSet<Student> hs = new HashSet<Student>();
java.util.Random random = new java.util.Random();
for(int i=0;i<length;i++){
int value = random.nextInt(15)+6;
Student st = new Student("学生"+i,value);
hs.add(st);
}
return hs;
}
//打印哈希集合,利用迭代器
public static void printSet(HashSet<Student> hs){
java.util.Iterator<Student> iterator = hs.iterator();
while(iterator.hasNext()){
Student st = (Student) iterator.next();
System.out.println(st.getName()+"\t"+st.getAge());
}
}
}
运行结果:
学生5 13
学生3 14
学生8 11
学生9 11
学生0 11
学生4 16
学生2 19
学生7 14
学生6 15
学生1 15
3、Map:是一个接口
Map是存储键值对(映射)的集合,即key(名、键)和value(key相应的值)是一一对应的关系
key好比是身份证号码,value则是身份证对应的人名
key又好比是IP地址,value则是相应的计算机
Map中的key(键)是唯一的,不可重复的,我们的身份证也是唯一的,
但是value(值)是可以重复的,因为人是可以重名的
Set接口实现的子类常见的有:
java.util.HashMap
java.util.Hashtable
java.util.HashMap中实现的常用的方法
void clear()
从此映射中移除所有映射关系。
Object clone()
返回此 HashMap 实例的浅表副本:并不复制键和值本身。
boolean containsKey(Object key)
如果此映射包含对于指定键的映射关系,则返回 true。
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry<K,V>> entrySet()
返回此映射所包含的映射关系的 Set 视图。
V get(Object key)
返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。
boolean isEmpty()
如果此映射不包含键-值映射关系,则返回 true。
Set<K> keySet()
返回此映射中所包含的键的 Set 视图。
V put(K key, V value)
在此映射中关联指定值与指定键。
void putAll(Map<? extends K,? extends V> m)
将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。
V remove(Object key)
从此映射中移除指定键的映射关系(如果存在)。
int size()
返回此映射中的键-值映射关系数。
Collection<V> values()
返回此映射所包含的值的 Collection 视图。
Map的具体实现:
package cn.netjava.testMap;
import java.util.HashMap;
import java.util.Iterator;
public class testMap {
/**
* @param args
*/
public static void main(String[] args) {
HashMap<String, Student> hs = createHashMap( );
print(hs);
}
//创建Map集合,并初始化
public static HashMap<String,Student> createHashMap( ){
HashMap<String,Student> map = new HashMap<String,Student>();
//向map中添加数据
for(int i=0;i<10;i++){
Student st = new Student("学生"+i, 10+i);
map.put("a"+i, st);
}
return map;
}
//打印集合
public static void print(HashMap<String,Student> map){
Iterator<String> iterator= map.keySet().iterator();
while(iterator.hasNext()){
//得到集合中的key值
String key = iterator.next();
// 通过Map提供的get方法来获取对应的value
Student stu = map.get(key);
System.out.println("Key:" + key + " Value:" + stu.getName()
+ "\t" + stu.getAge());
}
}
}
运行结果:
Key:a9 Value:学生9 19
Key:a0 Value:学生0 10
Key:a1 Value:学生1 11
Key:a2 Value:学生2 12
Key:a3 Value:学生3 13
Key:a4 Value:学生4 14
Key:a5 Value:学生5 15
Key:a6 Value:学生6 16
Key:a7 Value:学生7 17
Key:a8 Value:学生8 18
我觉得学习集合框架主要是搞清Set、List、Map三者的区别,千万不要弄混淆了,使用时想想之前的数组和自定义队列,注意区别
还有就是熟悉它们实现的接口中常用的方法,这个就要多看看JDK API包了
由于这三种集合没有一种同时实现了元素即不能重复又能排序的功能,我用List和Map分别实现了除重排序的功能,以下是具体实现:
package cn.netjava.testMap;
import java.util.ArrayList;
/**
* 对List进行测试,并且利用List进行除重排序
*/
public class testList {
public static void main(String[] args) {
//主函数
ArrayList<Student> al = createArrayList(10);
//新创建学生对象,并添加入集合中
for(int i=3;i<5;i++){
Student st = new Student("学生"+i,i+20);
al.add(st);
}
System.out.println("除重排序前:-----------------");
printList(al);
System.out.println("除重排序后:-----------------");
print(al);
}
//创建一个List集合,并初始化
public static ArrayList<Student> createArrayList(int length){
ArrayList<Student> al = new ArrayList<Student>();
java.util.Random random = new java.util.Random();
for(int i=0;i<length;i++){
int value = random.nextInt(15)+6;
Student st = new Student("学生"+i,value);
al.add(st);
}
return al;
}
//打印List集合
public static void printList(ArrayList<Student> al){
for(int i=0;i<al.size();i++){
Student st = al.get(i);
System.out.println(st.getName()+"\t"+st.getAge());
}
}
//对List集合进行除重排序
public static void print(ArrayList<Student> al){
//将集合转换为数组
Object[] integer = al.toArray();
for(int i=0;i<integer.length;i++){
for(int j=i+1;j<integer.length;j++){
Student st1 = (Student) integer[i];
Student st2 = (Student) integer[j];
//比较名字时不可用==
if(st1.getName().equals(st2.getName()) || st1.getAge()== st2.getAge()){
al.remove(st1);
}
}
}
integer = al.toArray();
//对新数组按年龄属性进行排序
for(int i=0;i<integer.length;i++){
for(int j=i+1;j<integer.length;j++){
Student st1 = (Student) integer[i];
Student st2 = (Student) integer[j];
if(st1.getAge() > st2.getAge() ){
Student temp = (Student) integer[i];
integer[i] = (Student) integer[j];
integer[j] = temp;
}
}
}
//打印排序后的数组
for(int i=0;i<al.size();i++){
Student st =(Student) integer[i];
System.out.println("姓名:"+ st.getName()+"\t"+st.getAge());
}
}
}
运行结果是:
除重排序前:-----------------
学生0 14
学生1 15
学生2 19
学生3 20
学生4 8
学生5 7
学生6 16
学生7 15
学生8 8
学生9 15
学生3 23
学生4 24
除重排序后:-----------------
姓名:学生5 7
姓名:学生8 8
姓名:学生0 14
姓名:学生9 15
姓名:学生6 16
姓名:学生2 19
姓名:学生3 23
姓名:学生4 24
分享到:
相关推荐
Java 集合概览小结 Java 集合概览是 Java 语言中的一种重要组件,提供了多种类和接口来帮助我们存储和管理对象集合。Java Collection API 中的集合类主要位于 java.util 包中,同时也有一些与并发相关的集合类位于 ...
### 集合小结 Collection #### Java集合概述 Java中的集合是一组对象的组合,类似于C++标准模板库中的容器。但是与C++不同的是,Java集合不仅可以存储单一类型的数据,还可以存储不同类型的对象。这使得Java集合...
《Java基础小结》 Java,作为一种广泛应用的编程语言,以其跨平台、面向对象的特点深受开发者喜爱。这篇博文和随附的PDF笔记旨在总结Java的基础知识,帮助初学者巩固理解,同时也为有经验的开发者提供回顾参考。 1...
这个“java课程小结.rar_北京理工大学JAVA课程”压缩包中包含的“课程小结”文件,很可能是教授精心编写的教学精华,旨在帮助学生巩固所学知识并为后续学习打下坚实基础。 在Java课程中,有几个核心概念和技术是必...
### Java基础知识小结 #### 1.1 `getPath()`、`getAbsolutePath()`、`getCanonicalPath()`的区别 在Java中,处理文件路径时经常会用到`getPath()`、`getAbsolutePath()`以及`getCanonicalPath()`这三个方法。它们...
例如,在使用集合框架时,我们可以声明一个`List`类型的变量,然后将其赋值为`ArrayList`、`LinkedList`等不同实现的具体实例,而无需关心具体是哪一种实现,因为所有实现都遵循相同的接口规范。 此外,多态也是...
### Java多线程小结 #### 一、多线程的概念与意义 多线程是Java编程中的一个重要概念,指的是程序在运行时可以同时执行多个线程的能力。它能够提高程序的性能,尤其是在多核处理器的环境下。多线程使得程序能够更...
小结 本节课我们学习了Java程序设计中的数组和集合,了解了数组和集合的区别和联系,并学习了List、Set、Map接口的特点和应用场景。同时我们还学习了如何实现集合的基本方法。 思考考 1. 什么是数组?数组的特点...
为了全面理解Java基础知识,本小结将按照给定的文件名,逐一解析关键知识点。 1. **Java基础知识** 这一部分通常包括Java语言的基础语法,如变量、数据类型、运算符、流程控制(if语句、switch、for、while循环等...
- **Collection接口**:这是Java集合框架的基础接口,所有的集合类都需要直接或间接地实现此接口。它提供了基本的操作方法,如添加(add)、移除(remove)、判断是否包含某些元素(contains)等。 #### 二、List接口与...
### 关于static的小结(Java内存溢出) #### 标题和描述中的知识点 在《关于static的小结(Java内存溢出)》这篇文章中,作者主要探讨了与Java中的`static`关键字相关的知识点,以及如何可能导致内存溢出的情况。...
Java使用Iterator迭代器遍历集合数据的方法小结 Java语言中,使用Iterator迭代器遍历集合数据是一种常见的操作。本文主要介绍了Java使用Iterator迭代器遍历集合数据的方法,并结合实例形式分析了Java迭代器进行集合...
**小结**: - `int` 适用于数值计算和频繁的操作。 - `Integer` 更适合用于集合处理和可能为空的场景。 #### 四、String与StringBuffer的区别 **String**:表示不可变的字符序列,一旦创建后无法修改。 **...
如果一个方法或类过于庞大,应考虑拆分为多个小方法或类,以增加复用性和可维护性。 3. **避免在生产环境中使用System.out.println()**:在调试期间,可以使用System.out.println(),但在部署时,应替换为日志框架...
### Java笔试题小结 #### 1. Java 字符串(String) **问题**: String 类的特点是什么?与 StringBuffer 的区别? **分析与解答**: `String` 类在 Java 中是不可变的,即一旦创建了一个字符串对象,其内容就不能...
Java 集合框架 Java 集合框架是一个强大的框架,提供了...小结 Java 集合框架是一个强大且灵活的框架,提供了丰富的集合类和接口,以方便开发者处理数据。它是 Java 语言的核心组件之一,广泛应用于各种应用程序中。
在Java编程语言中,`java.util....总之,`Vector`是Java集合框架的一部分,提供了一种线程安全的方式来管理动态数组。理解其特性和用法对于编写多线程Java程序至关重要,但同时也要权衡其性能和线程安全之间的平衡。