add和put的不同:
Set是单列集合,添加相同的元素,所以add方法只添加一个进去。Map的put方法如果添加了多个键相同的元素,则会用最后添加的值来覆盖之前的值,而这个键是最先添加的那个,并每天有被覆盖这一说。
凡是遇到hash,hashmap或者hashset,底层数据结构都是哈西表,存储数据的时候一样,都是先判断当前哈西值和已添加元素的哈希值是否相同,如果不相同,就存数据,不然就继续判断equals方法,若返回true就不存,返回false就存。所以元素都要复写一下hashCode()和equals()方法。
注意:判断元素是否存在以及删除 *** 作,依赖于这两个方法,这就是哈希表的特性。(ArrayList只依赖equals方法)
而遇到Tree开头的,TreeSet 和TreeMap,底层都是二叉树,存储数据遵循小的在左大的在右的原则,每个数下面最多只能有两个分支,新添加进去的数据依次往下比。若存的多了,会自动折中查找,所以这种数据结构的效率是比较高的。
Tree类型的查重:
比较器,对于不具有自然顺序的类型,比如一个Student类
(1)让这个类具备可比性
让Student类实现Comparable这个接口,然后重写里面的compareTo()方法, 返回值为0是保证唯一性的依据 :
(2)让将要添加这个类的对象的集合比如Set,具有可比性
自定义一个比较器MyCompare,实现Comparato这个接口,并把newMyCompare()当作参数传进Set这个类当中。
重写Comparator里面的compare()方法,这个方法里面有两个参数O1和O2,比较这两个对象的toString()值。比如下面:
public int compare(Object o1, Object o2) {
Book b1 = (Book)o1;
Book b2 = (Book)o2;
return b1getDate()toString() compareTo (b2getDate()toString());
}
两种比较器,重写的方法都是int类型。所以Tree类型存储数据只看相比的结果:正、负、0。0决定存不存,保证唯一性,正负决定存储的顺序。
注意: 在定义student这个类的时候,最好把hashCode()和equals()都重写一下(还有toString(),然后让这个类实现comparable接口或者自定一个比较器。这样一来,student既可以存进hashset里面又可以存进TreeSet里面。
TreeSet的方法:
E ceiling(E e) 返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null。
first() 返回此 set 中当前第一个(最低)元素
floor(E e) 返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null。
HashMap:
里面存的是键值对,一个键可以对应多个值,但一个值只可以对应一个键。那么hashmap可不可以存空键后面跟一个值?能!
直接返回值。
Map 集合没有迭代器,它的取出方式有两种:
第一种是KeySet()方法,把键存进Set集合中,然后用Set集合的迭代器遍历得到所有的键,再用Map集合的get()方法,参数传入键,取出值。
第二种是entrySet()方法,把键值对这种映射关系存进Set集合。调用entry(),返回值实际上包含了键和值两个数据,用getke'y()方法和 getvalue()两个方法,可以分别取出键和值。
TreeMap sets = new TreeMap(new MyCompare());
Set set = setsentrySet();
Iterator it = setiterator();
while (ithasNext()) {
/加了泛型的话,直接返回string key和string value,
然后用key和value调用getKey()和getValue()方法,不然。就用下面的强转/
Entry entry = (Entry)itnext();
Systemoutprintln(entrygetKey()+entrygetValue());XStream 用法详解 java 类与 XML 互换
现在 WEB数据交换的时代,传送XML目前是一个比较流行的方式,具有统一的规则约束,为实现后台接口提供了一个很方便的实现。
我编写了一个 接收XML并转换成所需要的Object类的 小例子,希望能够对做互联网数据传输、接口调用的朋友有所帮助。
首先要导入jar包xstream-143-sourcesjar 和 xmlpull-1131jar 两个包;
其次是预备一个 XML 事例
[html] view plain copy
<config>
<span style="white-space:pre"> </span><client type="8888" osversion="9999" version="123" oemtag="5555" area="areacode"/>
<span style="white-space:pre"> </span><protocol>110</protocol>
<span style="white-space:pre"> </span><sign value="asdfasdf"/>
<span style="white-space:pre"> </span><vientiance version="version"/>
</config>
其次 就是 按照 XML节点的顺序 从外 到内 编写 java PO类,此实例的目的是将上面的XML转换为 AllnewstateRQ 这个实体类,然后从里面打印出测试数据。
下面依次是 config节点 对应的 AllnewstateRQ类 ; client 节点 对应的 Client 类;sign 节点对应的 Sign类;vientiance 节点 对应的 Vientiance类。
[java] view plain copy
package comwgqtest09_xml;
import comthoughtworksxstreamannotationsXStreamAlias;
@XStreamAlias("config")
public class AllnewstateRQ {
//当节点下有独立属性的时候,需要创建一个独立的类用来保存节点内的属性
private Client client = new Client();
private Sign sign = new Sign();
private Vientiance vientiance = new Vientiance();
//当节点下没有属性,直接由StringValue的时候可直接创建String类型属性
private String protocol;
public Client getClient() {
return client;
}
public void setClient(Client client) {
thisclient = client;
}
public Sign getSign() {
return sign;
}
public void setSign(Sign sign) {
thissign = sign;
}
public Vientiance getVientiance() {
return vientiance;
}
public void setVientiance(Vientiance vientiance) {
thisvientiance = vientiance;
}
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
thisprotocol = protocol;
}
}
[java] view plain copy
package comwgqtest09_xml;
import comthoughtworksxstreamannotationsXStreamAlias;
import comthoughtworksxstreamannotationsXStreamAsAttribute;
@XStreamAlias("client")
public class Client {
@XStreamAsAttribute //对属性值进行注解
private String type;//此时类中的属性名要和xml内的属性名相对应
@XStreamAsAttribute
private String osversion;
@XStreamAsAttribute
private String version;
@XStreamAsAttribute
private String oemtag;
@XStreamAsAttribute
private String area;
public String getType() {
return type;
}
public void setType(String type) {
thistype = type;
}
public String getOsversion() {
return osversion;
}
public void setOsversion(String osversion) {
thisosversion = osversion;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
thisversion = version;
}
public String getOemtag() {
return oemtag;
}
public void setOemtag(String oemtag) {
thisoemtag = oemtag;
}
public String getArea() {
return area;
}
public void setArea(String area) {
thisarea = area;
}
}
[java] view plain copy
package comwgqtest09_xml;
import comthoughtworksxstreamannotationsXStreamAlias;
import comthoughtworksxstreamannotationsXStreamAsAttribute;
@XStreamAlias("sign") //此处要对应节点的名称
public class Sign {
@XStreamAsAttribute
private String value;//此处对应节点内属性名称
public String getValue() {
return value;
}
public void setValue(String value) {
thisvalue = value;
}
}
[java] view plain copy
package comwgqtest09_xml;
import comthoughtworksxstreamannotationsXStreamAlias;
import comthoughtworksxstreamannotationsXStreamAsAttribute;
@XStreamAlias("vientiance")
public class Vientiance {
@XStreamAsAttribute
private String version;
public String getVersion() {
return version;
}
public void setVersion(String version) {
thisversion = version;
}
}
测试main方法
[java] view plain copy
package comwgqtest09_xml;
import comthoughtworksxstreamXStream;
import comthoughtworksxstreamioxmlDomDriver;
public class TestStream {
public static void main(String[] args) {
String reqXml = getXml();
XStream xs = new XStream(new DomDriver());
xsprocessAnnotations(new Class[]{AllnewstateRQclass,Clientclass,Signclass,Vientianceclass});
Object obj = xsfromXML(reqXml);
AllnewstateRQ allnewstateRQ = (AllnewstateRQ) obj;
Systemoutprintln(allnewstateRQgetProtocol());
Systemoutprintln(allnewstateRQgetClient()getArea());
Systemoutprintln(reqXml);
}
static String getXml(){
StringBuilder str = new StringBuilder();
strappend("")
append("<config>")
append("<client type=\"8888\" osversion=\"9999\" version=\"123\" oemtag=\"5555\" area=\"areacode\" />")
append("<protocol>110</protocol>")
append("<sign value=\"asdfasdf\" />")
append("<vientiance version=\"version\" />")
append("</config>")
;
return strtoString();
}
}
输出结果:
[java] view plain copy
110
areacode
<config><client type="8888" osversion="9999" version="123" oemtag="5555" area="areacode" /><protocol>110</protocol><sign value="asdfasdf" /><vientiance version="version" /></config>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)