Java 数据结构
(1) Collection 接口是用于容纳元素的容器。而Iterator接口是用于遍历集合中每一个元素的数据结构,因此Iterator也被称为迭代器。
Iterator 通用方法简介
方法 | 简介 |
Boolean hasNext() | 可以判断是否到了集合的末尾,如果到集合的末尾,就返回false |
Object next() | 返回当前指针跳过的那个元素 |
Void remove() | 从集合中删除1个元素 |
代码如下:
public void test1_array() { Collection c = new ArrayList(); c.add("张三"); c.add("李四"); c.add("王五"); c.add("张三"); // for (Iterator it=c.iterator();it.hasNext();) { String s=(String)it.next(); System.out.println(s); } }
(2) List接口
List接口继承了Collection接口以定义一个允许重复项的有序集合,该接口不但能够对列表的一部分进行处理,还添加了对指定位置元素进行操作的功能。
public
void
test2_array()
{
List<Integer> lst=
new
ArrayList<Integer>();
BufferedReader br=
new
BufferedReader(
new
InputStreamReader(System.in));
while
(
true
)
{
System.out.println(
"请输入一个整数(按下q键)"
);
String input=
null
;
try
{
input=br.readLine();
}
catch
(IOException e)
{
e.printStackTrace();
}
if
(input.equals(
"q"
))
{
break
;
}
lst.add(
new
Integer(input));
}
Integer[] arr=
new
Integer[lst.size()];
arr=lst.toArray(arr);
System.out.println(Arrays.toString(arr));
}
|
Java的集合框架 中有2种常用的List实现类:ArrayList和LinkedList。如果随机访问可以使用ArrayList,如果顺序访问列表元素,使用LinkedList实现。
(3) Map接口
Map接口用于维护键-值对(key-value),按其定义,Map接口描述了从不重复的键到值的映射。
public
void
test3_array()
{
Map map1=
new
TreeMap();
//新增
map1.put(
"1"
,
"贾海天"
);
map1.put(
"2"
,
"李涛"
);
//key值重复,取最后的取值
map1.put(
"3"
,
"钟亮"
);
map1.put(
"3"
,
"吉连兵"
);
//遍历查询
Set set1=map1.keySet();
Iterator it1=set1.iterator();
while
(it1.hasNext())
{
String key=(String)it1.next();
String value=(String)map1.get(key);
System.out.println(
"key:="
+key+
",value :="
+value);
}
//删除
map1.remove(
"1"
);
map1.remove(
"4"
);
System.out.println(
"删除以后的结果:"
);
Set entitySet=map1.entrySet();
Iterator it2=entitySet.iterator();
while
(it2.hasNext())
{
Entry entry1=(Entry)it2.next();
System.out.println(
"key:"
+entry1.getKey()+
",value:"
+entry1.getValue());
}
}
|
Map常规的实现类有:HashMap 和TreeMap。在Map中插入、删除和定位元素。
(4) Set 接口
Set接口继承了Collection接口,并且不允许集合中存在重复项,每个具体的Set实现类依赖添加的对象的equals()方法来检查唯一性。
Set接口的主要实现类:HashMap 和TreeMap。
代码如下:
class
Person
implements
Comparable{
private
int
wage;
private
String name;
Person (
int
w,String n)
{
this
.wage=w;
this
.name=n;
}
public
void
setWage(
int
wage)
{
this
.wage=wage;
}
public
int
getWage()
{
return
this
.wage;
}
public
void
setName(String name)
{
this
.name=name;
}
public
String getName()
{
return
this
.name;
}
@Override
public
int
compareTo(Object obj)
{
Person p=(Person)obj;
if
(
this
.getWage()<p.getWage())
{
return
-
1
;
}
else
{
if
(
this
.getWage()==p.getWage())
{
return
0
;
}
}
return
1
;
}
}
|
调用Person class代码
public
void
test4_array()
{
TreeSet mytree=
new
TreeSet();
Person per1,per2,per3,per4,per5;
per1=
new
Person(
900
,
"贾海天"
);
per2=
new
Person(
800
,
"李涛"
);
per3=
new
Person(
600
,
"钟亮"
);
//per4=new Person(600,"吉连兵");
//per5=new Person(600,"吉连兵");
mytree.add(per1);
mytree.add(per2);
mytree.add(per3);
//mytree.add(per4);
//mytree.add(per5);
Iterator it=mytree.iterator();
while
(it.hasNext())
{
Person per=(Person)it.next();
System.out.println(
"员工:"
+per.getName()+
",工资:"
+per.getWage());
}
}
|
(5) 泛型
泛型的本质就是参数化类型,也就是将操作的数据类型指定为1个参数,java 语言引入泛型的好处是提高了程序的安全性。
定义一个泛型,使其可存放各种数据类型,并加以验证。代码如下:
public
class
Gen<T> {
private
T object1;
public
Gen(T object1)
{
this
.object1=object1;
}
public
T getObject()
{
return
this
.object1;
}
public
void
setObject(T object1)
{
this
.object1=object1;
}
public
void
showType()
{
System.out.println(
"T的实际类型是:"
+object1.getClass().getName());
}
}
|
调用代码:
public
void
test5_array()
{
//泛型
Gen<Integer> intOb=
new
Gen<Integer>(
123
);
intOb.showType();
int
i=intOb.getObject();
System.out.println(
"value="
+i);
Gen<String> strOb=
new
Gen<String> (
"Hello 贾海天"
);
strOb.showType();
String s=strOb.getObject();
System.out.println(
"value="
+s);
}
|
执行结果是:
T的实际类型是:java.lang.Integer
value=123
T的实际类型是:java.lang.String
value=Hello 贾海天