Java基础知识:集合

Java 集合

1. Collection

Iterator接口:

2. List

  有序的 Collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

  正因为List是有序的,相对于Collection,其增加了以下几个方法:

  添加:

void  add(int index, E element)  //在列表的指定位置插入指定元素
void  addAll(int index, Collection<? extends E> c)  //将指定 collection 中的所有元素都插入到列表中的指定位置

  删除:

E  remove(int index, E element)  //移除列表指定位置的元素

  修改:

E  set(int index, E element)  //用指定元素替换列表中指定位置的元素

  判断索引:

int  indexOf(Object o)    //返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1
int  lastIndexOf(Object o)    //返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回 -1

  取子集:

 List<E>  subList(int fromIndex, int toIndex)      //返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分

  列表迭代器:

ListIterator<E>  listIterator()     //返回列表中元素的列表迭代器(以正确的顺序)
ListIterator<E>  listIterator(int index)      //返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始

ListIterator接口:(List独有的迭代器,是Iteartor的子接口。)

  注意:

    当使用“1”方法时,会出现 java.util.ConcurrentModificationException 异常。这是由于当集合在使用Iterator进行迭代时,不允许通过其他方法,即被其他线程修改。如果使用Iterator的方法“2”,就不会出现该问题。而ListIterator就是应对此需求出现的,它可以在迭代时进行添加、修改等操作。

 1 import java.util.ArrayList;
 2 import java.util.Iterator;
 3 import java.util.ListIterator;
 4
 5 public class IteratorTest {
 6     public static void main(String[] args){
 7         ArrayList arr = new ArrayList();
 8         arr.add("hello--1");
 9         arr.add("hello--2");
10         arr.add("hello--3");
11
12         Iterator it = arr.iterator();
13         while(it.hasNext()){
14             String str = (String)it.next();
15             if(str.equals("hello--2")){
16                 arr.add("ok");  //1
17                 //it.remove();  //2
18                 //it.add("ok");   //3
19             }
20         }
21         print(arr);
22     }
23
24     public static void print(ArrayList arr){
25         Iterator iterator = arr.iterator();
26         while(iterator.hasNext()){
27             System.out.println(iterator.next());
28         }
29     }
30 }

  List包括ArrayList、LinkedList、Vector。

  1)ArrayList和Vector都是基于存储元素的Object[] array实现的,支持用小标来访问元素,同时索引数据的速度比较快。但是在插入元素时需要移动容器中元素,执行的比较慢。两者都有一个初始化的容量大小,当存储的元素超过这个大小会动态扩容,Vector默认扩充为原来的2倍(每次扩充空间的大小可以设置),ArrayList为原来的1.5倍(没有提供方法设置空间扩充大小)。
  2)ArrayList和Vector最大的区别是sybchronization同步,没有一个ArrayList方法是同步的,而Vector的绝大多数方法都是直接或间接同步的(add,insert,remove,set,equals,hashcode等)。所以Vector是线程安全的,ArrayList不是。因此前者性能也略逊于后者。
  3)LinkedList是采用双向列表实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问比较慢,但是插入和删除效率比较高。

  LinkedList:由于是采用双向列表实现,在List的基础上,它还增加了以下几个方法:

  添加:

void  addFirst(E o)    //将给定元素插入此列表的开头
void  addLast(E o)    //将给定元素插入此列表的开头

  获取:

E  getFirst(E o)    //返回此列表的第一个元素
E  getLast(E o)    //返回此列表的最后一个元素

  删除:

E  removeFirst(E o)    //移除并返回此列表的第一个元素
E  removeLast(E o)    //移除并返回此列表的最后一个元素

  注意:

    由于getFirst/getLast和removeFirst/removeLast在列表没有该元素时,会抛出NoSuchElementException。此时我们可以使用peekFirst/peekLast和poolFirst/poolLast方法。

E  peekFirst()    //获取但不移除此列表的第一个元素;如果此列表为空,则返回 null
E  peekLast()    //获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null

E  poolFirst()    //获取并移除此列表的第一个元素;如果此列表为空,则返回 null
E  poolLast()    //获取并移除此列表的最后一个元素;如果此列表为空,则返回 null

3. Set(散列集)  

  Set是不包含重复元素的Collection,其方法大致与Collection一致。

  其元素是无序的(存入和取出的顺序不一致)。

  操作都是通过Iterator实现。

1)HashSet

  底层数据结构是哈希表。

  保证唯一性的方法是通过hashCode()和equals()方法:如果元素的hashCode值相同时,则通过equals()方法来判断相等。如果元素hashCode不想等,则不调用equals()方法。

  对于判断元素是否存在、以及删除元素也是通过hashCode()和equals()方法实现。

  注意:

    在将自定义对象添加到HashSet集合时,需要重写hashCode()和equals()方法。

2)TreeSet

  可以对Set集合中的元素进行排序,底层数据结构是二叉树。

  保证唯一性的方法是通过compareTo()方法,当返回0表示相等。

  TreeSet实现具有比较性有两种方式:

    1、一种是让对象本身实现Comparable接口,并重写compareTo()方法;

    2、还有一种是自定义一个比较器,但是该比较器需要实现Comparator接口,同时重写compare()方法,然后就可以在TreeSet初始化时添加该比较器;

    3、当两种比较都存在时,以比较器为准。

TreeSet  ts  =  new  TreeSet(new  MyComparator);

class  MyComparator  implements  Comparator
{
...
}

  

时间: 2024-10-12 02:10:41

Java基础知识:集合的相关文章

java基础知识---集合

集合框架面试题 1. Collection 和 Collections 的区别. 的区别. Collections 是个 java.util 下的类,它包含有各种有关集合操作的静态方法. Collection 是个 java.util 下的接口,它是各种集合结构的父接口 2. List, Set, Map 是否继承自 Collection 接口 接口? List,Set 是 Map 不是 3.ArrayList 和 Vector 的区别. . 的区别. 一.同步性: Vector 的大多数方法具

java基础知识——集合

public static void main(String[] args) { //创建ArrayList集合 ArrayList<Integer> list=new ArrayList<Integer>(); ArrayList<Phone> plist=new ArrayList<Phone>(); boolean flag=list.add(1);//添加元素 System.out.println(flag); list.add(2); list.a

JAVA 基础知识集合

ConcurrentHashMap https://mp.weixin.qq.com/s?__biz=MjM5NzMyMjAwMA==&mid=2651478868&idx=1&sn=1aa298b9ba67ab33ea8af9c7627a27da&chksm=bd25372b8a52be3d9806e688cade686e668a075273ec662e0889978c6003d5be2a5fb411c15c&scene=0&key=4b95006583a

java基础知识回顾之java集合类-Properties集合

/** java.lang.Object   |--java.util.Dictionary<K,V>      |--java.util.Hashtable<Object,Object>          |--java.util.Properties * @author Administrator *Properties集合:         * 特点:         * 1,该集合中的键和值都是字符串类型.         * 2,集合中的数据可以保存到流中,或者从流加载 

Java基础知识综合练习_使用集合存储_高级银行系统的搭建(注册、登录、存取款、本行转账、跨行转账、销户、特殊操作参数、多个客户对象存入到银行类的集合,多个银行对象存入总测试类集合)

Java基础知识综合练习_使用集合存储_高级银行系统的搭建(注册.登录.存取款.本行转账.跨行转账.销户.特殊操作参数.多个客户对象存入到银行类的集合,多个银行对象存入总测试类集合) 1) 定义bank类 属性有银行名称和存放客户的ArrayList集合, 有开户方法. 销户方法. 存钱方法. 取钱方法. 转账方法(本行转账.跨行转账) 2) 定义customer类 属性有账户名.密码.余额 3) 定义测试类创建一个银行集合用于存放bank对象创建几个bank对象:分别叫华夏银行.工商银行.招商

java基础知识(二)

1.关于static关键字总结: 1.不能在static修饰的方法中引用this变量,只能引用一些静态变量或方法,或new新的对象(可以定义局部变量). 简言之,静态方法或块中,只能引用静态的方法或变量. 2.类中的成员变量(static修饰)有缺省值,而类的定义的方法中的局部变量没有缺省值. 3.在类的构造器中,可以引用任何的静态或非静态的变量和方法,可以在非static方法中调用static方法. 4.static{}块中的代码在类装载中仅执行一次. 5.在7-7,A staticmetho

java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中

/** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中. *  * 思路:1.需要深度遍历.--递归 * 2.遍历的过程中过滤指定扩展名的文件--过滤器FileNameFilter,将文件存入容器中 * 3.将容器中的内容遍历,写入到指定文件中 * */ 代码:  FilenameFilter 过滤器: package com.lp.ecjtu.File.filter; import java.io.File; import java.i

java基础知识回顾之面向对象

一 . 抽象类 什么是抽象类?很简单,就是用abstract关键字修饰,并允许包含未实现方法的类. 什么时候定义抽象类?在有些情况下,可能有些方法无法确定要怎么实现,这时就可以定义抽象类,无法实现的方法定义成抽象方法. 抽象类的特性: 1. 不能实例化,即不能创建对象,只能作为父类被继承. 2. 子类继承一个抽象类后,必须实现父类的抽象方法. 3. 抽象类中可以有抽象方法,也可以不包含抽象方法,但如果包含抽象方法,就必须定义成抽象类. public abstract class Shaoe{ p

Java基础知识(二)

1,字符串 new String("abc")创建了几个对象? 一个或两个,如果常量池中原来有"abc",则只创建一个对象:如果常量池中原来没有字符串"abc",那么就会创建两个对象. String s="abc"; String s1="ab"+"c"; System.out.println(s==s1); 输出 true ,因为"ab"+"c"

Java基础知识:面向对象&类图

类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称.在系统中,每个类都具有一定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务.一个类可以有多种职责,设计得好的类一般只有一种职责.在定义类的时候,将类的职责分解成为类的属性和操作(即方法).类的属性即类的数据职责,类的操作即类的行为职责.设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分. 1.面向对象特性 1)抽象 2)继承 3)封装 4)多态 2.类图: 在软件系统