[MNG-6630] - Make ComparableVersion faster

By not allocating the canonical representation for equals/hashcode,
but instead using the items we already have. This saves both time
and memory.

I left the canonical field around for testing purposes.
This commit is contained in:
Stefan Oehme 2019-04-09 15:35:07 +02:00 committed by Hervé Boutemy
parent baed5a294f
commit ebac165990
1 changed files with 100 additions and 4 deletions

View File

@ -148,6 +148,30 @@ public class ComparableVersion
} }
} }
@Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
IntItem intItem = (IntItem) o;
return value == intItem.value;
}
@Override
public int hashCode()
{
return value;
}
@Override @Override
public String toString() public String toString()
{ {
@ -209,6 +233,30 @@ public class ComparableVersion
} }
} }
@Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
LongItem longItem = (LongItem) o;
return value == longItem.value;
}
@Override
public int hashCode()
{
return (int) ( value ^ ( value >>> 32 ) );
}
@Override @Override
public String toString() public String toString()
{ {
@ -270,6 +318,29 @@ public class ComparableVersion
} }
@Override @Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
BigIntegerItem that = (BigIntegerItem) o;
return value.equals( that.value );
}
@Override
public int hashCode()
{
return value.hashCode();
}
public String toString() public String toString()
{ {
return value.toString(); return value.toString();
@ -382,6 +453,29 @@ public class ComparableVersion
} }
@Override @Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
StringItem that = (StringItem) o;
return value.equals( that.value );
}
@Override
public int hashCode()
{
return value.hashCode();
}
public String toString() public String toString()
{ {
return value; return value;
@ -581,8 +675,6 @@ public class ComparableVersion
list = (ListItem) stack.pop(); list = (ListItem) stack.pop();
list.normalize(); list.normalize();
} }
canonical = items.toString();
} }
private static Item parseItem( boolean isDigit, String buf ) private static Item parseItem( boolean isDigit, String buf )
@ -636,19 +728,23 @@ public class ComparableVersion
public String getCanonical() public String getCanonical()
{ {
if ( canonical == null )
{
canonical = items.toString();
}
return canonical; return canonical;
} }
@Override @Override
public boolean equals( Object o ) public boolean equals( Object o )
{ {
return ( o instanceof ComparableVersion ) && canonical.equals( ( (ComparableVersion) o ).canonical ); return ( o instanceof ComparableVersion ) && items.equals( ( (ComparableVersion) o ).items );
} }
@Override @Override
public int hashCode() public int hashCode()
{ {
return canonical.hashCode(); return items.hashCode();
} }
// CHECKSTYLE_OFF: LineLength // CHECKSTYLE_OFF: LineLength