Easy to Learn Java: Programming Articles, Examples and Tips

Start with Java in a few days with Java Lessons or Lectures

Home

Code Examples

Java Tools

More Java Tools!

Java Forum

All Java Tips

Books

Submit News
Search the site here...
Search...
 
Search the JavaFAQ.nu
1000 Java Tips ebook

1000 Java Tips - Click here for the high resolution copy!1000 Java Tips - Click here for the high resolution copy!

Java Screensaver, take it here

Free "1000 Java Tips" eBook is here! It is huge collection of big and small Java programming articles and tips. Please take your copy here.

Take your copy of free "Java Technology Screensaver"!.

Easy Learn Java: Programming Articles, Examples and Tips - Page 476


Previous 1060 Stories (530 Pages, 2 Per Page) Next

Easy Java Lecture 6: Operators. Teach/learn online

Go to all tips in Java Lectures by Anatoliy Malyarenko

Operators

Abstract

  • Contents of the lecture.
  • Arithmetic operators.
  • Relational and conditional operators.
  • Shift and logical operators.
  • Assignment operators.
  • Other operators.

Operators

An operator performs a function on one, two, or three operands. An operator that requires one operand is called an unary operator. For example, ++ is a unary operator that increments the value of its operand by 1. An operator that requires two operands is a binary operator . For example, = is a binary operator that assigns the value from its right- hand operand to its left-hand operand. And finally, a ternary operator is one that requires three operands. The Java programming language has one ternary operator, ?:, which is a short-hand if-else statement.

The unary operators support either prefix or postfix notation. Prefix notation means that the operator appears before its operand:

operator op //prefix notation

Postfix notation means that the operator appears after its operand:

op operator //postfix notation

All of the binary operators use infix notation, which means that the operator appears between its operands:

op1 operator op2 //infix notation

The ternary operator is also infix; each component of the operator appears between operands:

op1 ? op2 : op3 //infix notation

In addition to performing the operation, an operator returns a value. The return value and its type depend on the operator and the type of its operands. For example, the arithmetic operators, which perform basic arithmetic operations such as addition and subtraction, return numbers -- the result of the arithmetic operation. The data type returned by an arithmetic operator depends on the type of its operands: If you add two integers, you get an integer back.

An operation is said to evaluate to its result.

Arithmetic operators

The Java programming language supports various arithmetic operators for all floating- point and integer numbers. These operators are + (addition), - (subtraction), * (multiplication), / (division), and % (modulo).

The following table summarises the binary arithmetic operations in the Java programming language.

Operator Use Description
+ op1 + op2 Adds op1 and op2
- op1 - op2 Subtracts op2 from op1
* op1 * op2 Multiplies op1 by op2
/ op1 / op2 Divides op1 by op2
% op1 % op2 Computes the reminder of dividing op1 by op2

Here's an example program, ArithmeticDemo, that defines two integers and two double-precision floating-point numbers and uses the five arithmetic operators to perform different arithmetic operations. This program also uses + to concatenate strings.

Code:

public class ArithmeticDemo {
   public static void main(String[] args) {
      //a few numbers
      int i = 37;
      int j = 42;
      double x = 27.475;
      double y = 7.22;
      System.out.println("Variable values...");
      System.out.println(" i = " + i);
      System.out.println(" j = " + j);
      System.out.println(" x = " + x);
      System.out.println(" y = " + y);

      //adding numbers
      System.out.println("Adding...");
      System.out.println(" i + j = " + (i + j));
      System.out.println(" x + y = " + (x + y));

      //subtracting numbers
      System.out.println("Subtracting...");
      System.out.println(" i - j = " + (i - j));
      System.out.println(" x - y = " + (x - y));
      
      //multiplying numbers
      System.out.println("Multiplying...");
      System.out.println(" i * j = " + (i * j));
      System.out.println(" x * y = " + (x * y));

      //dividing numbers
      System.out.println("Dividing...");
      System.out.println(" i / j = " + (i / j));
      System.out.println(" x / y = " + (x / y));

      //computing the remainder resulting from
      //dividing numbers
      System.out.println("Computing the remainder...");
      System.out.println(" i % j = " + (i % j));
      System.out.println(" x % y = " + (x % y));

      //mixing types
      System.out.println("Mixing types...");
      System.out.println(" j + y = " + (j + y));
      System.out.println(" i * x = " + (i * x));
   }
}

        The output from this program is:

    Variable values...
        i = 37
        j = 42
        x = 27.475
        y = 7.22
    Adding...
        i + j = 79
         x + y = 34.695
    Subtracting...
        i - j = -5
        x - y = 20.255
    Multiplying...
        i * j = 1554
        x * y = 198.37
    Dividing...
        i / j = 0
        x / y = 3.8054
    Computing the remainder...
        i % j = 37
        x % y = 5.815
    Mixing types...
        j + y = 49.22
        i * x = 1016.58

Note that when an integer and a floating-point number are used as operands to a single arithmetic operation, the result is floating point. The integer is implicitly converted to a floating-point number before the operation takes place. The following table summarises the data type returned by the arithmetic operators, based on the data type of the operands. The necessary conversions take place before the operation is performed.

Data type of result Data type of operands
long Neither operand is a float or a double (integer arithmetic); at least one operand is a long
int Neither operand is a float or a double (integer arithmetic); neither operand is a long
double At least one operand is a double
float At least one operand is a float: neither operand is a double

In addition to the binary forms of + and -, each of these operators has unary versions that perform the following operations:

Operator Use Description
+ +op Promotes op to int if it's a byte, short, or char
- -op Arithmetically negates op

Two shortcut arithmetic operators are ++, which increments its operand by 1, and --, which decrements its operand by 1. Either ++ or -- can appear before (prefix) or after (postfix) its operand. The prefix version, ++op/--op, evaluates to the value of the operand after the increment/decrement operation. The postfix version, op++/op--, evaluates the value of the operand before the increment/decrement operation.

The following program, called SortDemo, uses ++ twice and -- once.

Code:

public class SortDemo {
   public static void main(String[] args) {
      int[] arrayOfInts = 32, 87, 3, 589, 12, 1076,
                                 2000, 8, 622, 127 ;
      for (int i = arrayOfInts.length; --i >= 0; ) {
         for (int j = 0; j < i; j++) {
            if (arrayOfInts[j] > arrayOfInts[j+1]) {
               int temp = arrayOfInts[j];
               arrayOfInts[j] = arrayOfInts[j+1];
               arrayOfInts[j+1] = temp;
            }
         }
      }
      for (int i = 0; i < arrayOfInts.length; i++) {
         System.out.print(arrayOfInts[i] + " ");
      }
      System.out.println();
   }
}
This program puts 10 integer values into an array -- a fixed length structure that can hold multiple values of the same type -- then sorts them. The line of code in bold declares an array referred to by arrayOfInts, creates the array, and puts 10 integer values into it.

The program uses arrayOfInts.length to get the number of elements in the array. Individual elements are accessed with this notation: arrayOfInts[index], where index is an integer indicating the position of the element within the array. Note that indices begin at 0.

The output from this program is a list of numbers sorted from lowest to highest:

3 8 12 32 87 127 589 622 1076 2000

Let's look at how the SortDemo program uses -- to control the outer of its two nested sorting loops. Here's the statement that controls the outer loop:

Code:

for (int i = arrayOfInts.length; --i >= 0; ) {
   ...
}

The for statement is a looping construct, which you'll meet later in these lectures. What's important here is the code in bold, which continues the for loop as long as the value returned by --i is greater than or equal to 0. Using the prefix version of -- means that the
last iteration of this loop occurs when i is equal to 0. If we change the code to use the postfix version of --, the last iteration of this loop occurs when i is equal to -1, which is incorrect for this program because i is used as an array index and -1 is not a valid array index.

The other two loops in the program use the postfix version of ++. In both cases, the version used doesn't really matter, because the value returned by the operator isn't used for anything. When the return value of one of these shortcut operations isn't used for anything, convention prefers the postfix version.

The shortcut increment/decrement operators are summarised in the following table.

Operator Use Description
++ op++ Increments op by 1; evaluates to the value of op before it was incremented
++ ++op Increments op by 1; evaluates to the value of op after it was incremented
-- op-- Decrements op by 1; evaluates to the value of op before it was decremented
-- --op Decrements op by 1; evaluates to the value of op after it was decremented

Relational and conditional operators

A relational operator compares two values and determines the relationship between them. For example, != returns true if the two operands are unequal. This table summarises the relational operators:

Operator Use Returns true if
> op1>op2 op1 is greater than op2
>= op1>=op2 op1 is greater than or equal op2
< op1<op2 op1 is less than op2
<= op1<=op2 op1 is less than or equal op2
== op1==op2 op1 and op2 are equal
!= op1!=op2 op1 and op2 are not equal

Following is an example, RelationalDemo, that defines three integer numbers and uses the relational operators to compare them. The relational operations are shown in bold:

Code:

public class RelationalDemo {
   public static void main(String[] args) {

      //a few numbers
      int i = 37;
      int j = 42;
      int k = 42;
      System.out.println("Variable values...");
      System.out.println(" i = " + i);
      System.out.println(" j = " + j);
      System.out.println(" k = " + k);

      //greater than
      System.out.println("Greater than...");
      System.out.println(" i > j = " + (i > j));
      System.out.println(" j > i = " + (j > i));
      System.out.println(" k > j = " + (k > j));
      
      //greater than or equal to
      System.out.println("Greater than or equal to...");
      System.out.println(" i >= j = " + (i >= j));
      System.out.println(" j >= i = " + (j >= i));
      System.out.println(" k >= j = " + (k >= j));
      
      //less than
      System.out.println("Less than...");
      System.out.println(" i < j = " + (i < j));
      System.out.println(" j < i = " + (j < i));
      System.out.println(" k < j = " + (k < j));
      
      //less than or equal to
      System.out.println("Less than or equal to...");
      System.out.println(" i <= j = " + (i <= j));
      System.out.println(" j <= i = " + (j <= i));
      System.out.println(" k <= j = " + (k <= j));

      //equal to
      System.out.println("Equal to...");
      System.out.println(" i == j = " + (i == j));
      System.out.println(" k == j = " + (k == j));
      
      //not equal to
      System.out.println("Not equal to...");
      System.out.println(" i != j = " + (i != j));
      System.out.println(" k != j = " + (k != j));
   }
}

Here's the output from this program:
    Variable values...
        i = 37
        j = 42
        k = 42
    Greater than...
        i > j = false
        j > i = true
        k > j = false
    Greater than or equal to...
        i >= j = false
        j >= i = true
        k >= j = true
    Less than...
        i < j = true
        j < i = false
        k < j = false
    Less than or equal to...
        i <= j = true
        j <= i = false
        k <= j = true
    Equal to...
        i == j = false
        k == j = true
    Not equal to...
        i != j = true
        k != j = false

Relational operators often are used with conditional operators to construct more complex decision -- making expressions. The Java programming language supports six conditional operators -- five binary and one unary -- as shown in the following table.

Operator Use Returns true if
&& op1&&op2 op1 and op2 are both true, conditionally evaluates op2
|| op1||op2 either op1 or op2 is true, conditionally evaluates op2
! !op op is false
& op1&op2 op1 and op2 are both true, always evaluates op1 and op2
| op1|op2 either op1 or op2 is true, always evaluates op1 and op2
^ op1^op2 if op1 and op2 are different -- that is one or the other of the operands is true, but not both

One such operator is &&, which performs the conditional AND operation. You can use two different relational operators along with && to determine whether both relationships are true.

The following line of code uses this technique to determine whether an array index is between two boundaries. It determines whether the index is both greater than or equal to 0 and less than NUM_ENTRIES, which is a previously defined constant value.

0 <= index && index < NUM_ENTRIES

Note that in some instances, the second operand to a conditional operator may not be evaluated. Consider this code segment:

(numChars < LIMIT) && (...)

The && operator will return true only if both operands are true. So, if numChars is greater than or equal to LIMIT, the left-hand operand for && is false, and the return value of && can be determined without evaluating the right-hand operand. In such a case, the interpreter will not evaluate the right-hand operand. This has important implications if the right-hand operand has side effects, such as reading from a stream, updating a value, or making a calculation.

When both operands are boolean, the operator & performs the same operation as &&. However, & always evaluates both of its operands and returns true if both are true. Likewise, when the operands are boolean, | performs the same operation as ||. The | operator always evaluates both of its operands and returns true if at least one of its operands is true. When their operands are numbers, & and | perform bitwise manipulations.

Shift and logical operators

A shift operator performs bit manipulation on data by shifting the bits of its first operand right or left. This table summarises the shift operators available in the Java programming language.

Operator Use Operation
>> op1>>op2 shift bits of op1 right by distance op2
<< op1<<op2 shift bits of op1 left by distance op2
>>> op1>>>op2 shift bits of op1 right by distance op2 (unsigned)

Each operator shifts the bits of the left-hand operand over by the number of positions indicated by the right-hand operand. The shift occurs in the direction indicated by the operator itself. For example, the following statement shifts the bits of the integer 13 to the right by one position:

13 >> 1;

The binary representation of the number 13 is 1101. The result of the shift operation is 1101 shifted to the right by one position -- 110, or 6 in decimal. The left-hand bits are filled with 0s as needed.

The following table shows the four operators the Java programming language provides to perform bitwise functions on their operands:

Operator Use Operation
& op1&op2 bitwise and
| op1|op2 bitwise or
^ op1^op2 bitwise xor
~ ~op bitwise complement

When its operands are numbers, the & operation performs the bitwise AND function on each parallel pair of bits in each operand. The AND function sets the resulting bit to 1 if the corresponding bit in both operands is 1, as shown in the following table.

op1 op2 Result
0 0 0
0 1 0
1 0 0
1 1 1

Suppose that you were to AND the values 13 and 12, like this: 13 & 12. The result of this operation is 12 because the binary representation of 12 is 1100, and the binary representation of 13 is 1101.

      1101        //13
&   1100        //12
       ------
       1100       //12

If both operand bits are 1, the AND function sets the resulting bit to 1; otherwise, the resulting bit is 0. So, when you line up the two operands and perform the AND function, you can see that the two high-order bits (the two bits farthest to the left of each number) of each operand are 1. Thus, the resulting bit in the result is also 1. The low-order bits evaluate to 0 because either one or both bits in the operands are 0. When both of its operands are numbers, the | operator performs the inclusive or operation, and ^ performs the exclusive or (XOR) operation. Inclusive or means that if either of the two bits is 1, the result is 1. The following table shows the results of inclusive or operations:

op1 op2 Result
0 0 0
0 1 1
1 0 1
1 1 1

Exclusive or means that if the two operand bits are different the result is 1, otherwise the result is 0. The following table shows the results of an exclusive or operation.

op1 op2 Result
0 0 0
0 1 1
1 0 1
1 1 0

And finally, the complement operator inverts the value of each bit of the operand: if the operand bit is 1 the result is 0 and if the operand bit is 0 the result is 1.

Among other things, bitwise manipulations are useful for managing sets of boolean flags. Suppose, for example, that your program had several boolean flags that indicated the state of various components in your program: is it visible, is it draggable, and so on. Rather than define a separate boolean variable to hold each flag, you could define a single variable, flags, for all of the.

Each bit within flags would represent the current state of one of the flags. You would then use bit manipulations to set and to get each flag. First, set up constants that indicate the various flags for your program. These flags should each be a different power of 2 to ensure that each bit is used by only one flag. Define a variable, flags, whose bits would be set according to the current state of each flag. The following code sample initialises flags to 0, which means that all flags are false (none of the bits are set).

Code:

static final int VISIBLE = 1;
static final int DRAGGABLE = 2;
static final int SELECTABLE = 4;
static final int EDITABLE = 8;

int flags = 0;

    To set the "visible" flag when something became visible you would use this statement:

flags = flags | VISIBLE;
    To test for visibility, you could then write:

if ((flags & VISIBLE) == VISIBLE) {
    ...
}

     Here's the complete program, BitwiseDemo, that includes this code.

Code:

public class BitwiseDemo {
   static final int VISIBLE = 1;
   static final int DRAGGABLE = 2;
   static final int SELECTABLE = 4;
   static final int EDITABLE = 8;
   public static void main(String[] args) {
      int flags = 0;
      flags = flags | VISIBLE;
      flags = flags | DRAGGABLE;
      if ((flags & VISIBLE) == VISIBLE) {
         if ((flags & DRAGGABLE) == DRAGGABLE) {
            System.out.println("Flags are Visible and Draggable.");
         }
      }
      flags = flags | EDITABLE;
      if ((flags & EDITABLE) == EDITABLE) {
         System.out.println("Flags are now also Editable.");
      }
   }
}
// integers byte largestByte = Byte.MAX_VALUE; short largestShort = Short.MAX_VALUE; int largestInteger = Integer.MAX_VALUE; long largestLong = Long.MAX_VALUE; // real numbers float largestFloat = Float.MAX_VALUE; double largestDouble = Double.MAX_VALUE; // other primitive types char aChar = ā€™Sā€™; boolean aBoolean = true; [/code]

The Java programming language also provides several shortcut assignment operators that allow you to perform an arithmetic, shift, or bitwise operation and an assignment operation all with one operator. Suppose you wanted to add a number to a variable and assign the result
back into the variable, like this:

i = i + 2;

You can shorten this statement using the shortcut operator +=, like this:

i += 2;

The two previous lines of code are equivalent. The following table lists the shortcut assignment operators and their lengthy equivalents:

Operator Use Equivalent to
+= op1 += op2 op1 = op1 + op2
-= op1 -= op2 op1 = op1 - op2
*= op1 *= op2 op1 = op1 * op2
/= op1 /= op2 op1 = op1 / op2
%= op1 %= op2 op1 = op1 % op2
&= op1 &= op2 op1 = op1 & op2
|= op1 |= op2 op1 = op1 | op2
^= op1 ^= op2 op1 = op1 ^ op2
<<= op1 <<= op2 op1 = op1 << op2
>>= op1 >>= op2 op1 = op1 >> op2
>>>= op1 >>>= op2 op1 = op1 >>> op2

Other operators

The following table lists the other operators that the Java programming language supports.

Operator Description
?: Shortcut if-else statement
[] Used to declare arrays, create arrays, and access array elements
. Used to form qualified names
(params) Delimits comma-separated list of parameters
(type) Casts (converts) a value to the specified type
new Creates a new object or a new array
instanceof Determines whether its first operand is an instance of its second operand

The ?: operator is a conditional operator that is short-hand for an if-else statement:
op1 ? op2 : op3

The ?: operator returns op2 if op1 is true or returns op3 if op1 is false.

You use square brackets to declare arrays, to create arrays, and to access a particular element in an array. Here's an example of an array declaration:

float[] arrayOfFloats = new float[10];

The previous code declares an array that can hold ten floating point numbers. Here's how you would access the 7th item in that array:

arrayOfFloats[6];

Note that array indices begin at 0.

The dot (.) operator accesses instance members of an object or class members of a class.

The (type) operator casts (or "converts") a value to the specified type.

You use the new operator to create a new object or a new array. Here's an example of creating a new Integer object from the Integer class in the java.lang package:

Integer anInteger = new Integer(10);

The instanceof operator tests whether its first operand is an instance of its second.

op1 instanceof op2

op1 must be the name of an object and op2 must be the name of a class. An object is considered to be an instance of a class if that object directly or indirectly descends from that class.

by Anatoliy Malyarenko


31879 bytes more | comments? | Printer Friendly Page  Send to a Friend | Score: 0
Posted by Javaaddict on Wednesday, September 27, 2006 (17:00:00) (8169 reads)

Read how can I find out the same word in a text if it has different case (u

Go to all tips in Text processing

Question: How can I find out the same word in a text if it has different case (upper or lower ) in different places?

It can be written even like this "w o r d " instead of "word". I need t o write my dictionary function. The methods equals() or compareto() from String class do not help me much.. I need to get some "natural feeling" function of the same word in different cases..


Answer: To get natural language comparison of two strings (words) you need to use the Collator class (java.textCollator). This class lets to compare the words for all the cases described in your question.

With compare() function you can find who is first and who is second for two words. If they have the same position in natural row of words it means the they are the same:

Collator ourCollator = Collator.getInstance();
if( ourCollator.compare("abcdefgeeeee", "ABCDEFGEEEEE") < 0 )
    System.out.println("abcdefgeeeee is less than ABCDEFGEEEEE");
else if ( ourCollator.compare("abcdefgeeeee", "ABCDEFGEEEEE") > 0 )
    System.out.println("abcdefgeeeee is greater than or equal to ABCDEFGEEEEE");
else System.out.println("Words are equivalent");

The Collator class is good if you compare words one or few times... If you need to compare words many times for better performance the CollationKey class is better choice. It converts words into bits sequence and do comparison bitwise, which is significantly faster!


1323 bytes more | comments? | Printer Friendly Page  Send to a Friend | Score: 0
Posted by Javaaddict on Tuesday, September 26, 2006 (18:00:00) (3321 reads)

Previous 1060 Stories (530 Pages, 2 Per Page) Next

530| 529| 528| 527| 526| 525| 524| 523| 522| 521| 520| 519| 518| 517| 516| 515| 514| 513| 512| 511| 510| 509| 508| 507| 506| 505| 504| 503| 502| 501| 500| 499| 498| 497| 496| 495| 494| 493| 492| 491| 490| 489| 488| 487| 486| 485| 484| 483| 482| 481| 480| 479| 478| 477|
476
| 475| 474| 473| 472| 471| 470| 469| 468| 467| 466| 465| 464| 463| 462| 461| 460| 459| 458| 457| 456| 455| 454| 453| 452| 451| 450| 449| 448| 447| 446| 445| 444| 443| 442| 441| 440| 439| 438| 437| 436| 435| 434| 433| 432| 431| 430| 429| 428| 427| 426| 425| 424| 423| 422| 421| 420| 419| 418| 417| 416| 415| 414| 413| 412| 411| 410| 409| 408| 407| 406| 405| 404| 403| 402| 401| 400| 399| 398| 397| 396| 395| 394| 393| 392| 391| 390| 389| 388| 387| 386| 385| 384| 383| 382| 381| 380| 379| 378| 377| 376| 375| 374| 373| 372| 371| 370| 369| 368| 367| 366| 365| 364| 363| 362| 361| 360| 359| 358| 357| 356| 355| 354| 353| 352| 351| 350| 349| 348| 347| 346| 345| 344| 343| 342| 341| 340| 339| 338| 337| 336| 335| 334| 333| 332| 331| 330| 329| 328| 327| 326| 325| 324| 323| 322| 321| 320| 319| 318| 317| 316| 315| 314| 313| 312| 311| 310| 309| 308| 307| 306| 305| 304| 303| 302| 301| 300| 299| 298| 297| 296| 295| 294| 293| 292| 291| 290| 289| 288| 287| 286| 285| 284| 283| 282| 281| 280| 279| 278| 277| 276| 275| 274| 273| 272| 271| 270| 269| 268| 267| 266| 265| 264| 263| 262| 261| 260| 259| 258| 257| 256| 255| 254| 253| 252| 251| 250| 249| 248| 247| 246| 245| 244| 243| 242| 241| 240| 239| 238| 237| 236| 235| 234| 233| 232| 231| 230| 229| 228| 227| 226| 225| 224| 223| 222| 221| 220| 219| 218| 217| 216| 215| 214| 213| 212| 211| 210| 209| 208| 207| 206| 205| 204| 203| 202| 201| 200| 199| 198| 197| 196| 195| 194| 193| 192| 191| 190| 189| 188| 187| 186| 185| 184| 183| 182| 181| 180| 179| 178| 177| 176| 175| 174| 173| 172| 171| 170| 169| 168| 167| 166| 165| 164| 163| 162| 161| 160| 159| 158| 157| 156| 155| 154| 153| 152| 151| 150| 149| 148| 147| 146| 145| 144| 143| 142| 141| 140| 139| 138| 137| 136| 135| 134| 133| 132| 131| 130| 129| 128| 127| 126| 125| 124| 123| 122| 121| 120| 119| 118| 117| 116| 115| 114| 113| 112| 111| 110| 109| 108| 107| 106| 105| 104| 103| 102| 101| 100| 99| 98| 97| 96| 95| 94| 93| 92| 91| 90| 89| 88| 87| 86| 85| 84| 83| 82| 81| 80| 79| 78| 77| 76| 75| 74| 73| 72| 71| 70| 69| 68| 67| 66| 65| 64| 63| 62| 61| 60| 59| 58| 57| 56| 55| 54| 53| 52| 51| 50| 49| 48| 47| 46| 45| 44| 43| 42| 41| 40| 39| 38| 37| 36| 35| 34| 33| 32| 31| 30| 29| 28| 27| 26| 25| 24| 23| 22| 21| 20| 19| 18| 17| 16| 15| 14| 13| 12| 11| 10| 9| 8| 7| 6| 5| 4| 3| 2| 1|


Home Code Examples Java Forum All Java Tips Books Submit News, Code... Search... Offshore Software Tech Doodling

RSS feed Java FAQ RSS feed Java FAQ News     

    RSS feed Java Forums RSS feed Java Forums

All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest 1999-2006 by Java FAQs Daily Tips.

Interactive software released under GNU GPL, Code Credits, Privacy Policy