67,513
社区成员
发帖
与我相关
我的任务
分享
public class nstring implements Comparable<nstring>{
public int i;
public nstring(int i){
this.i=i;
}
@Override
public int compareTo(nstring o) {
if(this.i>o.i)
return 1;
else if(this.i==o.i)
return 0;
else
return -1;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return String.valueOf(i);
}
public static void main(String[] args) {
Set<nstring> set=new TreeSet<nstring>();
set.add(new nstring(4));
set.add(new nstring(2));
set.add(new nstring(3));
set.add(new nstring(2));
System.out.println(set);
}
}
private static native Object newArray(Class componentType, int length)
这个方法使用了Native方法,也就是调用了本地的C代码,不能直接从JDK中的src文件中查找到源代码.不过通过结果来看,这个方法创建数组时使用的是动态初始化,因为String是一个类,是引用数据类型,它的默认初始化值就是null. 这里的初始化值与类中成员变量的默认初始化值是一样的.可以看这个链接http://blog.csdn.net/abc5382334/article/details/18254517
1、整数类型(byte、short、int、long)的基本类型变量的默认值为0。
2、单精度浮点型(float)的基本类型变量的默认值为0.0f。
3、双精度浮点型(double)的基本类型变量的默认值为0.0d。
4、字符型(char)的基本类型变量的默认为 “\u0000”。
5、布尔型的基本类型变量的默认值为 false。
6、引用类型的变量是默认值为 null。
7、数组引用类型的变量的默认值为 null。当数组变量的实例后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。
A {@link NavigableSet} implementation based on a {@link TreeMap}.
* The elements are ordered using their {@linkplain Comparable natural
* ordering}, or by a {@link Comparator} provided at set creation
* time, depending on which constructor is used.
[/quote]
public class ArrayMarker<T> {
private Class<T> kind;
public ArrayMarker(Class<T> ku) {
super();
this.kind = ku;
};
public T[] create(int size){
return (T[]) Array.newInstance(kind, size);
}
public static void main(String[] args) {
ArrayMarker<String> sm=new ArrayMarker<String>(String.class);
String[] strings=sm.create(5);
System.out.println(Arrays.toString(strings));
}
}
能帮帮看一下这个问题,解释一下为什么吗。这种类型擦除不会补偿?[/quote]
没有看明白你要问的最后一个问题.A {@link NavigableSet} implementation based on a {@link TreeMap}.
* The elements are ordered using their {@linkplain Comparable natural
* ordering}, or by a {@link Comparator} provided at set creation
* time, depending on which constructor is used.
[/quote]
为什么不是用equals 判断唯一性[/quote]
你可以查看TreeSet源代码知道TreeSet不是使用的equals()方法判断唯一性,而是使用的 compareTo(Object obj)和compare(T o1 , T o2)两种方法.源代码在JDK的安装路径下的src.zip文件里面.比如我已经解压了这个文件,文件路径就为D:\develop\Java\jdk1.7.0_72\src\java\util\TreeSet.java
里面有如下注释
A {@link NavigableSet} implementation based on a {@link TreeMap}.
* The elements are ordered using their {@linkplain Comparable natural
* ordering}, or by a {@link Comparator} provided at set creation
* time, depending on which constructor is used.
[/quote]
public class ArrayMarker<T> {
private Class<T> kind;
public ArrayMarker(Class<T> ku) {
super();
this.kind = ku;
};
public T[] create(int size){
return (T[]) Array.newInstance(kind, size);
}
public static void main(String[] args) {
ArrayMarker<String> sm=new ArrayMarker<String>(String.class);
String[] strings=sm.create(5);
System.out.println(Arrays.toString(strings));
}
}
能帮帮看一下这个问题,解释一下为什么吗。这种类型擦除不会补偿?A {@link NavigableSet} implementation based on a {@link TreeMap}.
* The elements are ordered using their {@linkplain Comparable natural
* ordering}, or by a {@link Comparator} provided at set creation
* time, depending on which constructor is used.
package com.test;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class nstring implements Comparable<nstring>{
public int i;
public nstring(int i){
this.i=i;
}
@Override
public int compareTo(nstring o) {
if(this.i>o.i)
return 1;
else if(this.i==o.i)
return 0;
else
return -1;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return String.valueOf(i);
}
public static void main(String[] args) {
Set<nstring> set=new TreeSet<nstring>(new Comparator<nstring>() {
@Override
public int compare(nstring n1, nstring n2) {
int num = n1.i - n2.i;
return num == 0 ? 1 : num; //这里的1也可以改成-1结果是一样的,因为就算你添加元素时有先后,但是结果都是有两个相同元素
}
} );
set.add(new nstring(4));
set.add(new nstring(2));
set.add(new nstring(3));
set.add(new nstring(2));
System.out.println(set);
}
}
输出结果为:[2, 2, 3, 4],这里有两个2.
先用这个例子说明以下你的第二个问题吧.你问为什么不能插入两个用compareTo()比较相等的对象,其实是可以的,看代码在创建TreeMap对象时使用了定制排序,也就是上面代码中的第29行,这里我传入了一个Comparator接口的匿名内部类,重写了比较方法,当添加的对象的i属性相同时,返回值num不是0而是1,这样就避免去掉用comparaTo()方法比较相同的对象.
[color=#FF6600]TreeSet只有两种排序方法:自然排序和定制排序.默认情况下使用自然排序,但是创建TreeSet对象时传入了Comparator的匿名内部类时就使用的定制排序,要不然我们把它传进去干什么?[/color]