容器和String、Date、Calendar

来源:互联网 发布:网络防诈骗小知识 编辑:程序博客网 时间:2024/06/08 05:34

容器是java中附带的集合工具类。Java集合用于存储数量不等的对象,还用于保存具有映射关系的关联数组。Java集合大致可以分为

Set、List、Map等体系。Java集合类主要有二个接口派生出来的:Collection和Map,其二者是java集合框架的根接口,

这两个接口又包含了一些接口和实现类。如图:



Collection接口是List、Set的父类口,定义了如下的基本用法:

boolean add(Object o):用于向集合了添加一个元素,如果集合对添加对象发生改变了,则返回True

void clear():清楚集合里的所有元素,该集合长度为0.

boolean contains(object o):返回集合里是否包含元素。

boolean remove():删除集合中指定元素o,成功删除返回True

首先介绍下Set集合,Set集合跟Collection基本相同,没有提供额外idea方法,但是Set集合通常不能记住元素的添加顺序,也不能包含

相同的元素,如果实体把相同的元素放入Set集合中,add()方法会返回false,相同元素不会加入。而Set集合中包括HashSet和TreeSet两个实现类

HashSet是Set接口的最常用用法,具有如下特点:

A:不能保证元素的排列顺序,可能跟添加的顺序不同。

B:集合元素的值可以是null。

当向HashSet集合存入元素时,HashSet会调用该对象的HashSet()方法来获取该对象的哈希值。当把一个对象存入集合中时,如果重写了equals()方法,

则也需要重写hashCode()方法,但是要保证这两个对象通过equals()方法比较返回true时,它们的hashCode的方法返回的值也要相等,才能添加成功。


除此以外,hashSet常用于来除掉其它集合的相同素,也用来求集合与集合之间的运算:




Set的另一个实现类TreeSet,TreeSet可以确保集合元素处于排序状态,与HashSet相比多了几个额外方法:

Co'm'pa'rator:如果TreeSet采用了自然排序,则返回null

Object first():返回集合中的第一个元素;

Object last():返回集合中的最后一个元素;

Sortedset subset(Ovject 开始的元素,Object 结尾的元素):返回Set的子集合,范围为开始的元素到结尾的元素(结尾元素不包括)

Sortedset headSet(Object toElement):返回Set的子集合,由小于toElement 的元素组成

Sortedest tailSet(Object fromElement):返回she的子集合,由大于fromElement的元素组成。

如图:


HashSet和TreeSet是Set两个基本实现类,HashSet的性能比TreeSe好,特别是最常用的添加、查询元素等操作)而TreeSet则需要

额外的红黑树算法来维护集合元素的次序,所以当需要一个有次序的Set集合,则用TreeSet集合,否则都用HashSet集合。


List集合,里面装的元素是有序、可重复的集合。List默认按元素的添加顺序添加索引,例如第一次添加的元素索引为0,第二次为1.。。

list作为Collerction接口的子接口,多了u一些特有的方法:

void add(int index,Object element):将元素element插入list的index处;

Object get(int index):返回集合index索引处的元素;

Object remove(int index)删除并返回index索引处的元素;

Object set(int index,Object element)将index索引处的元素替换成element对象,返回被替换的旧元素;

vide sort(Comparator c):根据Comparator参数对list集合元素排序;

ArrayList作为List的基本实现类,封装了一个动态的,允许再分配的Object[ ]数组。程序员想往里面分配多少对象,其数组的长度就会随之增加。

相当于一个特殊的数组,但有着比数组更好的性能,如:

1)支持自动改变大小的功能;
2)可以灵活的插入元素;
3)可以灵活的删除元素;

ArrayList也可用不用初始化容量ArrayList  l=new ArrayList()默认容量为零,当数组容量满时,会自动扩容到当前数组的两倍。


一些代码的用法:


输出结果为:



LinkedList类也是List接口的实现类,可以通过索引随机访问集合中的元素。可以被当成双端队列来使用,总是通个元素查找下一个元素,

通过链表结构存储元素的集合。如:


二者的区别:LinkedList与ArrayList的实现机制完成不同,ArrayList内部以数组的形式保存集合中的元素,在随机访问或下标访问元素是有较好的性能。

而LinkedList内部以链表的形式保存集合中的元素,由此随机访问元素比较差,但插入,删除元素时性能特别好(只需要该表指针所指的地址即可),

在查找某一特定元素时也比ArrayList出色。


Map是用于保存具有映射关系的数据,在存储元素是保存着两组值,一组值拥有保存Map里的key,另一组用于保存Map里的value,key和value都可以是

任何引用类型的数据。需注意的是Map中的key是不允许重复的。key和value存在单向一对一的关系,即能通过key找到唯一确定的value。如果把Map里

面所有的key拿出来组成的集合,可以看出是一个Set集合(无顺序且不能重复的集合)。如果把Map里的value放在一起,又类似于一个list集合(元素

与元素之间可以重复,每个元素可以根据索引来查找的),只是该索引可以是对象的索引。

Map接口定义的常用方法:

Object get(key):返回指定key对应的value值,如果不存在,则返回null

Set entrySet()返回Map中包含的key-value所组成的Set集合

boolean containsKey(Object key)查询Map中是否包含指定的key,如果包含返回true

Set keySet()返回该Map中所有key组成的Set集合

Object put(Object key,Object value)添加一个key-value对,如果当前Map中已经存在该key值,则新的k-v会覆盖旧的k-v

int size()返回Map里的key-value的个数

Collection values()返回Map中value组成的Collection

Map接口最常用的实现类就是HashMap

例子程序:


HashMap一般用于对应的查找功能。



迭代器Iterator ,主要用于遍历(即迭代访问)Cillection集合中的元素。该接口中定义4个方法:

boolean hasNext()如果被迭代的集合元素还没有被遍历完,则返回true;

Object next()返回集合里的下一个元素;

void remove()删除集合里上一次next方法返回的元素

vide forEachRemaining(Collection action),java8新增的方法,该方法可使用Lambda表达式来遍历集合元素;

如:



iterator遍历元素跟for循环的区别:Iterator对象在remove方法是在迭代过程中删除元素最安全的方法,比如在ArrayList中用for循环遍历元素并删除的话,

会产生数组的下标发生变化,对应的元素也会发生变化,可能会产生删除不成功。如:



此处的for循环并不会删除掉重复的元素。所以在for做遍历时,一定要小心元素的位置偷偷的改变了。所以最好用Iterator迭代器遍历元素

对于上程序中去掉List重复元素的方法,出了用迭代器也有其他方法:

1.迭代器:


此方法不会改变原来的顺序。

2.利用set集合


利用Set集合特性(不能重复),但是圆顺序会发生改变

二者比较是需调用hashCode()的方法。


String:在java.lang中的String类,由String创建的字符串变量是类类型变量,是一个对象。

可以类似于类一样声明和创建对象如:

String s =new String("hello");

也可以像基本型一样创建字符串:

String ss =“hello”;

虽然同为字符串,但是上面二种还是有区别的,如

String s1=“hello”;

String s2=“hello”;

这里s1==s2  判断是返回true的,没有声明对象,字符串存放在数据区里,可直接比较字符串。

String s1 =new String(“hello”);

String s2 =new String(“hello”);

这里s1==s2 判断返回flase,这里创建的是对象,对应的指针不同,肯定不相同。要判断需要调用equals方法。

String类的主要方法(方法很多,多查API文档):

public char charAt(int index)
返回字符串中第index个字符。
public int length()
返回字符串的长度
public int indexof(String str)
返回字符串中出现str的第一个位置
public interestingindexof(String str,int formIndex)
返回字符串中从fromIndex开始出现str的第一个位置
public boolean equalsIgnoreCase(String another)
比较字符串与another是否一样(不考虑大小写)
public String replace(char oldChar,char newChar)
在字符串中用newChar字符替换oldChar
public boolean startsWith(String prefix)
判断字符串是否以prefix字符串开头
public boolean endsWith(String suffix)
判断字符串是否以prefix字符串结尾
public String toUpperCase()
返回一个字符串为该字符串的大写形式
public String toLowerCase()
返回一个字符串为该字符串的消息形式
public String substring (int beginIndex)
返回该字符串从beginIndex开始到结尾的子字符串
public String substring(int beginIndex,int endIndex)
返回该字符串从beginIndex开始到endIndex结尾的子字符串(不包括end)
public String trim()
返回将该字符串去掉开头和结尾空格后的字符串

对String方法举例子:


还有如下判断数字位数的,比起for循环方便多了:


查找字符串是否带有另一元素,和区分开大小写的方法:



我们是知道String创建的字符串对象是不能修改的,固衍生出了StringBuffer类,该类可以创建可修改的字符串序列,即该类的对象的实体的

内存空间可以自动改变大小,便于存放一个可变的字符串。固要了解该类的方法:

1,append()将其他类型数据转化为字符串后,再加到StringBuffer后面

2,char charAt(int n)得到参数n指定的置上的单个字符

3,void setCharAt(int n,char ch) 将字符串n位置的字符替换为ch

4,StringBuffer insert(int index,String str)将字符串插入另一个字符串中,并返回当前对象的引用

5,public StringBuffer reverse()将当前对象字符串倒序,

6,StringBuffer delete(int startLndex,int endindex)删除这范围内的字符串,不包括结尾

7,StringBuffer replace(int start,int end,String str)将该范围内的字符串替换成str,不包括结尾

例子:


常用类Date:

Date类在java.util包中,使用Date类的无参数构造方法创建的对象可以获取本地的当前时间

boolean after(Date when)测试该日期是否在指定日期when之后

boolean before(Date when)测试该日期是否在指定日期when之前

long getTime()返回该时间对象的long型整数


Calendar类 日期类该类能更好的提更方法来处理时间和日期

static int DAY_OF_WEEK_IN_MONTH
get 和 set 的字段数字,指示当前月中的第几个星期。

static int DAY_OF_YEAR
get 和 set 的字段数字,指示当前年中的天数。

static int WEEK_OF_YEAR
get 和 set 的字段数字,指示当前年中的星期数。

rili.getActualMaximum(Calendar.DAY_OF_MONTH)

获取本月的天数,大、小、2月的月的区别

如:



总结:要掌握容器的常见方法,不会多查API文档。要区分各类容器的区别,和分别使用的位置。

掌握String和StringBuffer的用法,对于可变的记得用StringBuffer。

掌握日期和时间的输出就行了。

0 0
原创粉丝点击