Is String passed by reference or value?

as subject

The last four answers all say the same thing.
Unfortunately, there's a certain amount of argument
about the exact terminology.LOL! Yeah, there's also a certain amount of argument about whether the earth is flat or not, and whether we actually landed on the moon or if the Apollo missions were faked. There's always going to be "a certain amount of argument" by a clueless few.
The only people who don't agree that Java has only pass by value don't understand the correct use of the terminology.

Similar Messages

  • Arrays are passed by reference or value ?

    Hi peoples,
    I have something interesting here which I need to know. Look into the following classes :
         public class example1 {
         int i[] = {0};
         public static void main(String args[]) {
         int i[] = {1};
         change_i(i);
         System.out.println(i[0]);
         public static void change_i(int i[]) {
         i[0] = 2;
         i[0] *= 2;
         public class example2 {
         int i[] = {0};
         public static void main(String args[]) {
         int i[] = {1};
         change_i(i);
         System.out.println(i[0]);
         public static void change_i(int i[]) {
         int j[] = {2};
         i = j;
    Among the above classes, the class named 'example1' returns the value 4 whereas, the class named 'example2' returns the value 1.
    Any explanations to this one please....
    Cheers,
    Rasmeet

    minglu, you are not doing right.
    i just don't get it why you have i[] as instance variable but never use it ( i[] is declared in every method so each i you refer to in the method is a local varable not member variable that can be shared for the object ).
    your first solution work. but that i = j line is not needed because it has no effect you still cannot change the referrence of i to other int[]. your first soultion just need to be
    public static int[] change_i(int i[]) {
    int j[] = {2};
    return j;
    }anyway, using this solution, the method name will be misleading because the method didnot change i in anyway. i is changed because you assign the return array (j) to i.
    for that second solution also, you didn't use your member variable i at all. what you change is the content of i you pass so the result is correct. but then how is this method different from the first method the original poster posted?
    moreover, java never pass argument to the method by reference it ALWAYS pass by copy.i suppose you define passing by reference in the same way C++ does. all object variable in java is a refernce to Object so passing the variable to method is surely passing the reference to the method but that's not passing by reference. it's passing by copy because what is passed is the copy of the reference to the object, not the reference to the reference to Object. if it is really passing by refernce, then you will be able to change your reference to object to point anywhere because you have the access the address of the reference. but since you don't (you only know where the passed reference is pointing to (you have the COPY of value of reference) but you don't know where the refernce store its value) you can only change the content of the pointed object but not changing the pointed object.
    let me restate this, java always pass by reference.

  • Pass by reference and String

    public class Test {
        static void method(String str) {
            str = "String Changed";
        public static void main(String[] args) {
            String str = new String("My String");
            System.out.println(str);
            method(str);
            System.out.println(str);
    }The output is
    My String
    My String
    How this is possible when objects are passed by reference ?

    > How this is possible when objects are passed by reference ?
    All parameters to methods are passed "by value." In other words, values of parameter variables in a method are copies of the values the invoker specified as arguments. If you pass a double to a method, its parameter is a copy of whatever value was being passed as an argument, and the method can change its parameter's value without affecting values in the code that invoked the method. For example:
    class PassByValue {
        public static void main(String[] args) {
            double one = 1.0;
            System.out.println("before: one = " + one);
            halveIt(one);
            System.out.println("after: one = " + one);
        public static void halveIt(double arg) {
            arg /= 2.0;     // divide arg by two
            System.out.println("halved: arg = " + arg);
    }The following output illustrates that the value of arg inside halveIt is divided by two without affecting the value of the variable one in main:before: one = 1.0
    halved: arg = 0.5
    after: one = 1.0You should note that when the parameter is an object reference, the object reference -- not the object itself -- is what is passed "by value." Thus, you can change which object a parameter refers to inside the method without affecting the reference that was passed. But if you change any fields of the object or invoke methods that change the object's state, the object is changed for every part of the program that holds a reference to it. Here is an example to show the distinction:
    class PassRef {
        public static void main(String[] args) {
            Body sirius = new Body("Sirius", null);
            System.out.println("before: " + sirius);
            commonName(sirius);
            System.out.println("after:  " + sirius);
        public static void commonName(Body bodyRef) {
            bodyRef.name = "Dog Star";
            bodyRef = null;
    }This program produces the following output: before: 0 (Sirius)
    after:  0 (Dog Star)Notice that the contents of the object have been modified with a name change, while the variable sirius still refers to the Body object even though the method commonName changed the value of its bodyRef parameter variable to null. This requires some explanation.
    The following diagram shows the state of the variables just after main invokes commonName:
    main()            |              |
        sirius------->| idNum: 0     |
                      | name --------+------>"Sirius"       
    commonName()----->| orbits: null |
        bodyRef       |______________|At this point, the two variables sirius (in main) and bodyRef (in commonName) both refer to the same underlying object. When commonName changes the field bodyRef.name, the name is changed in the underlying object that the two variables share. When commonName changes the value of bodyRef to null, only the value of the bodyRef variable is changed; the value of sirius remains unchanged because the parameter bodyRef is a pass-by-value copy of sirius. Inside the method commonName, all you are changing is the value in the parameter variable bodyRef, just as all you changed in halveIt was the value in the parameter variable arg. If changing bodyRef affected the value of sirius in main, the "after" line would say "null". However, the variable bodyRef in commonName and the variable sirius in main both refer to the same underlying object, so the change made inside commonName is visible through the reference sirius.
    Some people will say incorrectly that objects are passed "by reference." In programming language design, the term pass by reference properly means that when an argument is passed to a function, the invoked function gets a reference to the original value, not a copy of its value. If the function modifies its parameter, the value in the calling code will be changed because the argument and parameter use the same slot in memory. If the Java programming language actually had pass-by-reference parameters, there would be a way to declare halveIt so that the preceding code would modify the value of one, or so that commonName could change the variable sirius to null. This is not possible. The Java programming language does not pass objects by reference; it passes object references by value. Because two copies of the same reference refer to the same actual object, changes made through one reference variable are visible through the other. There is exactly one parameter passing mode -- pass by value -- and that helps keep things simple.
    -- Arnold, K., Gosling J., Holmes D. (2006). The Java� Programming Language Fourth Edition. Boston: Addison-Wesley.
    ~

  • Confused about passing by reference and passing by valule

    Hi,
    I am confuse about passing by reference and passing by value. I though objects are always passed by reference. But I find out that its true for java.sql.PreparedStatement but not for java.lang.String. How come when both are objects?
    Thanks

    Hi,
    I am confuse about passing by reference and passing
    by value. I though objects are always passed by
    reference. But I find out that its true for
    java.sql.PreparedStatement but not for
    java.lang.String. How come when both are objects?
    ThanksPass by value implies that the actual parameter is copied and that copy is used as the formal parameter (that is, the method is operating on a copy of what was passed in)
    Pass by reference means that the actual parameter is the formal parameter (that is, the method is operating on the thing which is passed in).
    In Java, you never, ever deal with objects - only references to objects. And Java always, always makes a copy of the actual parameter and uses that as the formal parameter, so Java is always, always pass by value using the standard definition of the term. However, since manipulating an object's state via any reference that refers to that object produces the same effect, changes to the object's state via the copied reference are visible to the calling code, which is what leads some folk to think of java as passing objects by reference, even though a) java doesn't pass objects at all and b) java doesn't do pass by reference. It passes object references by value.
    I've no idea what you're talking about wrt PreparedStatement, but String is immutable, so you can't change its state at all, so maybe that's what's tripping you up?
    Good Luck
    Lee
    PS: I will venture a guess that this is the 3rd reply. Let's see...
    Ok, second. Close enough.
    Yeah, good on yer mlk, At least I beat Jos.
    Message was edited by:
    tsith

  • Recursive Function, Pass by "reference"

    I need to create a function and build an Arraylist.
    public void buildList (String s, Arraylist list) {
    ....//code specific to application
    list.add(something);
    buildList(somestring, list);
    public void anotherFunction(){
    buildList(str, myList);
    Will myList contain the values that are added? Is this only a copy of the list?

    Java always passes by value.
    (Now it gets confusing)
    In this case it passes a reference by value.
    The method gets its own variable for storing the reference to the list in.
    ie it is the equivalent of saying
    Arraylist list = myList;
    It doesn't copy the entire list, it just gets a reference to it.
    If you change the contents of the list by calling list.add() then original looks like it was updated, as they point to the same thing.
    If you execute
    list = new ArrayList();
    Then list becomes distinct and seperate from the myList variable in the calling procedure.
    If java was pass by reference, when you execute list = new ArrayList it would also change the value of the variable in the calling procedure. That doesn't happen.
    Hope that clears things up,
    evnafets

  • Calrification on Pass by reference

    Hi All,
    In java, if we are passing an object to a function actually we are passing the reference. So, if the function is doing any manipulation on the Object reference, it will affect the passing object.
    For example,
    class Ob1
         int i=0;
    public class Ref
         public static void main(String a[])
              Ob1 o=new Ob1();
              System.out.println("Before calling :"+o.i);
              call(o);
              System.out.println("After calling :"+o.i);
         static void call(Ob1 o)
              o.i++;
    Is it possible to get the original value of i(object Ob1) after calling call()?
    Thanks in advance
    +Sha                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

    > In java, if we are passing an object to a function
    actually we are[b] passing the reference.
    By value.
    Is it possible to get the original value of i(object
    Ob1) after calling call()?
    Store the original value in a local variable.
    And please note the following:
    All parameters to methods are passed "by value." In other words, values of parameter variables in a method are copies of the values the invoker specified as arguments. If you pass a double to a method, its parameter is a copy of whatever value was being passed as an argument, and the method can change its parameter's value without affecting values in the code that invoked the method. For example:
    class PassByValue {
        public static void main(String[] args) {
            double one = 1.0;
            System.out.println("before: one = " + one);
            halveIt(one);
            System.out.println("after: one = " + one);
        public static void halveIt(double arg) {
            arg /= 2.0;     // divide arg by two
            System.out.println("halved: arg = " + arg);
    }The following output illustrates that the value of arg inside halveIt is divided by two without affecting the value of the variable one in main:before: one = 1.0
    halved: arg = 0.5
    after: one = 1.0You should note that when the parameter is an object reference, the object reference -- not the object itself -- is what is passed "by value." Thus, you can change which object a parameter refers to inside the method without affecting the reference that was passed. But if you change any fields of the object or invoke methods that change the object's state, the object is changed for every part of the program that holds a reference to it. Here is an example to show the distinction:
    class PassRef {
        public static void main(String[] args) {
            Body sirius = new Body("Sirius", null);
            System.out.println("before: " + sirius);
            commonName(sirius);
            System.out.println("after:  " + sirius);
        public static void commonName(Body bodyRef) {
            bodyRef.name = "Dog Star";
            bodyRef = null;
    }This program produces the following output: before: 0 (Sirius)
    after:  0 (Dog Star)Notice that the contents of the object have been modified with a name change, while the variable sirius still refers to the Body object even though the method commonName changed the value of its bodyRef parameter variable to null. This requires some explanation.
    The following diagram shows the state of the variables just after main invokes commonName:
    main()            |              |
        sirius------->| idNum: 0     |
                      | name --------+------>"Sirius"       
    commonName()----->| orbits: null |
        bodyRef       |______________|At this point, the two variables sirius (in main) and bodyRef (in commonName) both refer to the same underlying object. When commonName changes the field bodyRef.name, the name is changed in the underlying object that the two variables share. When commonName changes the value of bodyRef to null, only the value of the bodyRef variable is changed; the value of sirius remains unchanged because the parameter bodyRef is a pass-by-value copy of sirius. Inside the method commonName, all you are changing is the value in the parameter variable bodyRef, just as all you changed in halveIt was the value in the parameter variable arg. If changing bodyRef affected the value of sirius in main, the "after" line would say "null". However, the variable bodyRef in commonName and the variable sirius in main both refer to the same underlying object, so the change made inside commonName is visible through the reference sirius.
    Some people will say incorrectly that objects are passed "by reference." In programming language design, the term pass by reference properly means that when an argument is passed to a function, the invoked function gets a reference to the original value, not a copy of its value. If the function modifies its parameter, the value in the calling code will be changed because the argument and parameter use the same slot in memory. If the Java programming language actually had pass-by-reference parameters, there would be a way to declare halveIt so that the preceding code would modify the value of one, or so that commonName could change the variable sirius to null. This is not possible. The Java programming language does not pass objects by reference; it passes object references by value. Because two copies of the same reference refer to the same actual object, changes made through one reference variable are visible through the other. There is exactly one parameter passing mode -- pass by value -- and that helps keep things simple.
    -- Arnold, K., Gosling J., Holmes D. (2006). The Java� Programming Language Fourth Edition. Boston: Addison-Wesley.

  • Pass-by-reference?

    Please tell me if I am wrong and explain how it actually works!
    But i think there is pass-by-reference..
    Part of Frame.java
    SplashPanel splashpanel = new SplashPanel(this);Part of SplashPanel.java
    public class SplashPanel extends JPanel{
         private Frame frame;
         public SplashPanel(final Frame frame) {
              this.frame = frame;I am newbie in Java and programming at all, so sorry if i am wrong.

    That's not pass by reference. That's passing a reference by value.
    Primitives are passed by value.
    References are passed by value.
    Objects are not passed at all--not by reference, not by value.
    Java is always pass-by-value. Always.
    Always. Always. Always.
    http://javadude.com/articles/passbyvalue.htm
    http://java.sun.com/developer/JDCTechTips/2001/tt1009.html#tip1
    http://www.javaranch.com/campfire/StoryPassBy.jsp
    http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
    http://www-106.ibm.com/developerworks/library/j-praxis/pr1.html
    http://www.cs.toronto.edu/~dianeh/tutorials/params/
    http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#38698
    http://radio.javaranch.com/channel/val/2004/05/21/1085125887000.html
    There is exactly one parameter passing mode in Java -- pass by value -- and that helps keep things simple.
    -- James Gosling, "The Java Programming Language, Second Edition"
    (James Gosling being the father of Java)

  • Subroutine Pass by Value, Pass by Reference using xstring

    Hi,
      I am trying to check the difference between pass by value, pass by reference, pass by return value to a subroutine. When I tried integers as parameters the following functionality worked. When I am using xstring as parameters I am not getting desired results.
      Some one please explain me how the xstring's are passed to a subroutine.
    Here I am giving the code and output of the code.
    data : s_passbyref    type xstring,
           s_passbyval    type xstring,
           s_passbyretval type xstring.
    * Pass by Value, Pass by Reference, Pass by return value - STRINGS
    s_passbyref     = 'ABCD'.
    s_passbyval     = 'ABCD'.
    s_passbyretval  = 'ABCD'.
    write : / 'ByRef :', s_passbyref, 20 'By Val :', s_passbyval, 40 'By Return Value : ', s_passbyretval.
    perform call_str_sub using s_passbyref s_passbyval changing s_passbyretval.
    write : / 'ByRef :', s_passbyref, 20 'By Val :', s_passbyval, 40 'By Return Value : ', s_passbyretval.
    form call_str_sub using ps_passbyref value(ps_passbyval) changing value(ps_passbyretval).
      ps_passbyretval = 'XYZ'.
      ps_passbyref    = 'XYZ'.
      ps_passbyval    = 'XYZ'.
    endform.
    OUTPUT
    ByRef  :  ABCD    By Val : ABCD    By Return Value : ABCD
    ByRef  :               By Val : ABCD    By Return Value :
    Thanks in advance
    Naveen

    try this
    write : / 'ByRef :', s_passbyref, 20 'By Val :', s_passbyval, 40 'By Return Value : ', ps_passbyretval.

  • Strings are passed by Reference

    Since strings are objects, they are passed by reference. I tested this out:
    1.in main(): String str="in main"; creates a new string "in main" and has str point to it.
    2.Passed str into changeStr(String str2)
    3.in changeStr: str2="in changeStr", since str2 is a reference, it should redirect str to point to the new string "changeStr".
    4.Back in main I print out str and get "in main".
    Why?

    (When you post source code, please put it in CODE tags; there's a button for that above the textarea.)
    Don't think of references as memory addresses; that makes them sound like C pointers, when in fact they're fundamentally different: a pointer points to a memory location, while a reference points to an Object. C lets you dereference a pointer and replace the data at that memory location with something else. Afterward, any existing variable that referred to the data in that section of memory, will see the new value.
    A Java reference lets you access the object to call its methods, examine its variables, and so on. If the object is mutable, you can change itss contents, and all existing variables that refer to that object will see those changes. But you can't replace the whole object with something else. Reassigning the variable that was passed into the method has no effect on the original object or on any other variables that pointed to it.
    So stop thinking of references as memory addresses. In fact, stop thinking about memory addresses, period. You never need that information in Java, and for that you should be eternally grateful. The absence of C pointers was one of Java's biggest selling points, way back when.
    Edited by: uncle_alice on Feb 27, 2008 7:55 AM
    Oh well. :-/ At least I may have done some good by asking the OP to use CODE tags.

  • Selecting multiple rows a table according to rows passed with a table valued parameter

    Ive got a table, which looks like this:
    CREATE TABLE MyTable (
    MyChars CHAR(3) NOT NULL,
    MyId INT NOT NULL,
    CONSTRAINT PK__MyTable_MyChars_MyId PRIMARY KEY (MyChars, MyId),
    CONSTRAINT FK__MyOtherTable_Id_MyTable_MyId FOREIGN KEY (MyId) REFERENCES MyOtherTable (Id)
    Records look like i.e.:
    Chars | Id
    'AAA' | 1
    'BBB' | 1
    'CCC' | 1
    'AAA' | 2
    'BBB' | 2
    'CCC' | 2
    'DDD' | 2
    'EEE' | 3
    'FFF' | 3
    'AAA' | 4
    'DDD' | 4
    'FFF' | 4
    Now I have a SP, which takes a table valued parameter like:
    CREATE TYPE dbo.MyTVP AS TABLE ( MyChars CHAR(3) )
    This SP should return a set of Ids, which match all the rows of the parameter.
    I.e.:
    if the TVP contains 'AAA', 'BBB' & 'CCC', i get as result 1 & 2
    if the TVP contains 'AAA' & 'FFF', i get as result 4
    if the TVP contains 'BBB' & 'EEE', i get an empty result
    What my SP is currently doing, is to build a query with string concatination, which is then executed with the EXEC statement. If we take my first example, the built query would look like this:
    SELECT DISTINCT t0.MyId
    FROM MyTable t0
    INNER JOIN MyTable t1 ON t0.MyId = t1.MyId
    INNER JOIN MyTable t2 ON t1.MyId = t2.MyId
    WHERE t0.MyChars = 'AAA' AND t1.MyChars = 'BBB' AND t2.MyChars = 'CCC'
    It works, but I'm not very fond of building the query. Maintaining such things is always a pain. And it also might not be the most efficient and elegant way to do this.
    Since I can't think of any other way of doing this, I wanted to ask, if someone of you got an idea, if there is a better way to accomplish this.

    Let me give you a "cut and paste" I use in the SQL Server groups:
    1) The dangerous, slow kludge is to use dynamic SQL and admit that any random future user is a better programmer than you are. It is used by Newbies who do not understand SQL or even what a compiled language is. A string is a string; it is a scalar value like
    any other parameter; it is not code. Again, this is not just an SQL problem; this is a basic misunderstanding  of programming principles. 
    2) Passing a list of parameters to a stored procedure can be done by putting them into a string with a separator. I like to use the traditional comma. Let's assume that you have a whole table full of such parameter lists:
    CREATE TABLE InputStrings
    (keycol CHAR(10) NOT NULL PRIMARY KEY,
     input_string VARCHAR(255) NOT NULL);
    INSERT INTO InputStrings 
    VALUES ('first', '12,34,567,896'), 
     ('second', '312,534,997,896'),
     etc.
    This will be the table that gets the outputs, in the form of the original key column and one parameter per row.
    It makes life easier if the lists in the input strings start and end with a comma. You will need a table of sequential numbers -- a standard SQL programming trick, Now, the query, 
    CREATE VIEW ParmList (keycol, place, parm)
    AS
    SELECT keycol, 
           COUNT(S2.seq), -- reverse order
           CAST (SUBSTRING (I1.input_string
                            FROM S1.seq 
                             FOR MIN(S2.seq) - S1.seq -1) 
             AS INTEGER)
      FROM InputStrings AS I1, Series AS S1, Series AS S2 
     WHERE SUBSTRING (',' + I1.input_string + ',', S1.seq, 1) = ','
       AND SUBSTRING (',' + I1.input_string + ',', S2.seq, 1) = ','
       AND S1.seq < S2.seq
     GROUP BY I1.keycol, I1.input_string, S1.seq;
    The S1 and S2 copies of Series are used to locate bracketing pairs of commas, and the entire set of substrings located between them is extracted and cast as integers in one non-procedural step. The trick is to be sure that the right hand comma of the bracketing
    pair is the closest one to the first comma. The relative position of each element in the list is given by the value of "place", but it does a count down so you can plan horizontal placement in columns. 
    This might be faster now:
    WITH Commas(keycol, comma_seq, comma_place)
    AS
    (SELECT I1.keycol, S1.seq,
    ROW_NUMBER() OVER (PARTITION BY I1.keycol ORDER BY S1.seq)
    FROM InputStrings AS I1, Series AS S1
    WHERE SUBSTRING (',' || I1.input_string || ',' 
    FROM S1.seq 
    FOR 1) = ',' 
    AND S1.seq <= CHARLENGTH (I1.input_string))
    SELECT SUBSTRING(',' || I1.input_string || ','
    FROM C1.comma_place +1
    FOR C2.comma_place - C1.comma_place - 1)
    FROM Commas AS C1, Commas AS C2
    WHERE C2.comma_seq = C1.comma_seq + 1 
    AND C1.keycol = C2.keycol;
    The idea is to get all the positions of the commas in the CTE and then use (n, n+1) pairs of positions to locate substrings. The hope is that the ROW_NUMBER() is faster than the GROUP BY in the first attempt. Since it is materialized before the body of
    the query (in theory), there are opportunities for parallelism indexing and other things to speed up the works. 
    Hey, I can write kludges with the best of them, but I don't. You need to at the very least write a routine to clean out blanks, handle double commas and non-numerics in the strings, take care of floating point and decimal notation, etc. Basically, you must
    write part of a compiler in SQL. Yeeeech!  Or decide that you do not want to have data integrity, which is what most Newbies do in practice altho they do not know it. 
    A procedural loop is even worse. You have no error checking, no ability to pass local variables or expressions, etc. 
    CREATE PROCEDURE HomemadeParser(@input_string VARCHAR(8000))
    AS
    BEGIN
    DECLARE @comma_position INTEGER;
    CREATE TABLE #Slices
    (slice_value INTEGER);
    SET @input_string = @input_string + ','; --add sentinel comma
    SET @comma_position = CHARINDEX(',', @input_string); 
    WHILE @comma_position > 1
      BEGIN
      INSERT INTO #Slices (slice_value)
      VALUES(CAST(LEFT(@input_string, (@comma_position - 1)) AS INTEGER)); 
      SET @input_string = RIGHT(@input_string, LEN(@input_string)-@comma_position)
      SET @comma_position = CHARINDEX(',', @input_string)
      END;
    END;
    Better answer:
    http://www.simple-talk.com/sql/learn-sql-server/values()-and-long-parameter-lists/
    http://www.simple-talk.com/sql/learn-sql-server/values()-and-long-parameter-lists---part-ii/
    Do this with a long parameter list. You can pass up to 2000+ parameters in T-SQL, which is more than you probably will ever need. The compiler will do all that error checking that the query version and the procedural code simply do not have unless you write
    a full parser with the standard error codes. You can now pass local variables to your procedure; you can pass other data types and get automatic conversions, etc. In short, this is just good software engineering. 
    CREATE PROCEDURE LongList
    (@p1 INTEGER = NULL,
     @p2 INTEGER = NULL,
     @p3 INTEGER = NULL,
     @p4 INTEGER = NULL,
     @p5 INTEGER = NULL)
      x IN (SELECT parm
              FROM (VALUES (@p1), (@p2), (@p3), (@p4), (@p5)) AS X(parm)
            WHERE parm IS NOT NULL;
    You get all the advantages of the real compiler and can do all kinds of things with the values. 
    --CELKO-- Books in Celko Series for Morgan-Kaufmann Publishing: Analytics and OLAP in SQL / Data and Databases: Concepts in Practice Data / Measurements and Standards in SQL SQL for Smarties / SQL Programming Style / SQL Puzzles and Answers / Thinking
    in Sets / Trees and Hierarchies in SQL

  • Is it possible to pass an array by value?

    I am trying to create a list of String arrays holding all the different possible combinations for a little problem I was working on. the function Solve takes a String array argument that is passed by reference and so when I add a value to it all of the previous String array values for str get that value when I want each of them to have their own values. Can I pass the string array by value? or do I just need to change my code....and if it is the latter, any tips on structuring my code?
    Thanks
    import java.util.ArrayList;
    public class Solution
         Solution()
         public ArrayList<String[]> solve = new ArrayList<String[]>();
         public String[] Direction = {"LEFT","RIGHT","TOP","BOTTOM","C_LEFT","C_RIGHT","C_TOP","C_BOTTOM","FSLASH","BSLASH"};
         public boolean isNextTo(String a, String b)
              return true;
         public boolean notUsed(String[] s, String a)
              for(int i=0;i<s.length;i++)
                   if(s[i] == a)
                        return false;
              return true;
         public String[] Solve(String[] str, int element)
              //solve.add(str);
              int index = solve.size()-1;
              for(int dir=0;dir<10;dir++)
                   System.out.println("\nchecking " + Direction[dir] + " for element " + element);
                   printList();
                   //if(isNextTo(str[element], Direction[dir]));
                        if(notUsed(str, Direction[dir]))
                             System.out.println("\nadding " + Direction[dir] + " to the list ");
                             str[element+1] = Direction[dir];
                             solve.add(Solve(str,element+1));
              return str;          
         public void printList()
              for(int i=0;i<solve.size();i++)
                   System.out.println("\nSolution " + i + ":");
                   for(int j=0;j<10;j++)
                        System.out.print(solve.get(i)[j] + ", ");
         public static void main(String args[])
              Solution s = new Solution();
              String[] a = new String[10];
              a[0] = "LEFT";
              s.solve.add(a);
              s.Solve(a, 0);
              s.printList();
    }Edited by: newms86 on May 19, 2008 2:10 AM

    I tried adding in a clone array like this:
    public String[] Solve(String[] str, int element)
              //solve.add(str);
              String[] a = str;
              for(int dir=0;dir<10;dir++)
                   System.out.println("\nchecking " + Direction[dir] + " for element " + element);
                   printList();
                   if(isNextTo(str[element], Direction[dir]));
                        if(notUsed(str, Direction[dir]))
                             System.out.println("\nadding " + Direction[dir] + " to the list ");
                             a[element+1] = Direction[dir];
                             solve.add(Solve(a,element+1));
              return str;          
         }but all the elements in the ArrayList are the same. What do I need to change?
    Edited by: newms86 on May 19, 2008 2:23 AM

  • Is possible pass class reference into function by reference ?

    Hello, here is one example.
    class MyClass
    public int i;
    public static void Change(MyClass param1, MyClass param2)
    MyClass temp;
    temp = param1;
    param1 = param2;
    param2 = temp;
    public static void main(String[] args)
    MyClass param1 = new Main();
    param1.i = 100;
    MyClass param2 = new Main();
    param2.i = 200;
    Change(param1,param2);
    System.out.println(param1.i);
         System.out.println(param2.i);
    Is clear the result will be :
    100
    200
    Well, is possible in java pass into function object reference by reference? (for example in C# exist keyword ref, which solve this problem.) Other question is if this is something what is really needed in daily programming life, but I'm curious.
    Thanks for response

    iaragorn wrote:
    Well, is possible in java pass into function object reference by reference? No. Java only passes by value.
    Other question is if this is something what is really needed in daily programming lifeNope. Java has done just fine without pass by reference for about 12 or 14 years now.

  • How to reference the value of items in a generic report

    Hello
    I have created a generic report. The source is a PL/SQL-Function returning a query stored in a package of the parsing schema, using the apex_item package. I set the p_item_id values depending on p_idx and rownum. In the browser I can see the unique (id="...") of the items. The report works well.
    One column is an analytical funtion and shows for every row the same value. The column is hidden. Depending on that value I want to show or hide buttons.
    How can I get the value of this column. Apex_application.g_fxx don't work. Apex_application.g_fxx.COUNT =0 for all possible columns.
    So how can I reference the value in the report.
    Any suggestions?
    Thanks

    Hallo varad
    Should I do really?
    The SQL is a function in a package returning a sql-string. It's a join over five tables (one outer join) refrences some other package variables. For testing purposes I put in into the region, but nothing changed. SQL is ok.
    So here is the region source:
    declare
    v_mdt_id pkg_typ_lagerplatzbelegungen.mdt_id_coltype;
    v_laplstat_frei pkg_typ_lagerplatzbelegungen.laplstat_id_coltype;
    v_laplstat_leermeldung pkg_typ_lagerplatzbelegungen.laplstat_id_coltype:=1;
    v_sql VARCHAR2(10000);
    BEGIN
    v_mdt_id :=:g_mdt_id;
    v_laplstat_frei:=pkg_konst_lagerplatzstati.fkt_laplstat_frei;
    v_sql:= ' WITH lapl_lagepos
    AS
    (SELECT (rownum ) zeile
    ,laplbe1.mdt_id
    ,laplbe1.lapl_koor1
    ,laplbe1.lapl_koor2
    ,laplbe1.lapl_koor3
    ,laplbe1.lapl_koor4
    ,laplbe1.lapl_koor5
    ,lagepos.lage_id
    ,lagepos.lagepos_id
    ,pkg_sel_lagerplaetze.fkt_get_lapl_kurzbez_display( laplbe1.lapl_koor1
    ,laplbe1.lapl_koor2
    ,laplbe1.lapl_koor3
    ,laplbe1.lapl_koor4
    ,laplbe1.lapl_koor5
    , laplbe1.mdt_id) lapl_kurzbez
    ,laplbe1.lavo_id
    ,mat.mat_id
    ,mat.mat_id mat_id_neu
    ,mat.matart_id
    ,mat.matart_id matart_id_neu
    ,mat.mdt_id_mat
    ,mat.mdt_id_mat mdt_id_mat_neu
    ,mat.mat_name1
    ,mat.mat_name2
    ,lagepos.lagepos_menge
    ,lagepos.meschl_id
    ,NULL zumenge
    ,NVL(SUM(lagepos.lagepos_menge) OVER (PARTITION BY lagepos.lage_id),0)
    ,CASE
    WHEN NVL(SUM(lagepos.lagepos_menge) OVER (PARTITION BY lagepos.lage_id),0) = 0
    AND (laplbe1.laplstat_id < '||v_laplstat_frei||' OR NVL(laplbe1.lage_id,0) > 0) THEN 0
    ELSE
    NVL(SUM(lagepos.lagepos_menge) OVER (PARTITION BY lagepos.lage_id),0)+1
    END leerkennung
    FROM (SELECT laplbe.mdt_id
    ,laplbe.lapl_koor1
    ,laplbe.lapl_koor2
    ,laplbe.lapl_koor3
    ,laplbe.lapl_koor4
    ,laplbe.lapl_koor5
    ,laplbe.lage_id
    ,laplbe.laplstat_id
    ,lapl.lapl_kurzbez
    ,lapl.lavo_id
    FROM lagerplaetze lapl
    ,lagerplatzbelegungen laplbe
    WHERE lapl.lapl_kurzbez ='||'''77B04B1'''||'
    AND lapl.mdt_id ='||v_mdt_id||'
    AND laplbe.mdt_id ='||v_mdt_id||'
    AND laplbe.lapl_koor1 = lapl.lapl_koor1
    AND laplbe.lapl_koor2 = lapl.lapl_koor2
    AND laplbe.lapl_koor3 = lapl.lapl_koor3
    AND laplbe.lapl_koor4 = lapl.lapl_koor4
    AND laplbe.lapl_koor5 = lapl.lapl_koor5
    AND laplbe.mdt_id = lapl.mdt_id) laplbe1
    , (SELECT lage_id
    ,lagepos_id
    ,mdt_id
    ,mat_id
    ,matart_id
    ,mdt_id_mat
    ,meschl_id
    ,lagepos_mengeneinheit
    ,lagepos_menge
    FROM lagergebindepositionen
    WHERE NVL(lagepos_archiviert,0) =0
    AND mdt_id = '||v_mdt_id||') lagepos
    ,(SELECT mat_id
    ,matart_id
    ,mdt_id_mat
    ,mat_name1
    ,mat_name2
    FROM materialien
    WHERE mat_archiviert= 0
    AND NVL(mdt_id_mat,'||v_mdt_id||')='||v_mdt_id||') mat
    WHERE laplbe1.lage_id = lagepos.lage_id(+)
    AND lagepos.mat_id =mat.mat_id(+)
    AND lagepos.matart_id = mat.matart_id(+)
    AND lagepos.mdt_id_mat=mat.mdt_id_mat(+))
    SELECT APEX_ITEM.hidden (31, zeile,'''',''P95801_f31_''||zeile ) zeile
    ,APEX_ITEM.text (32, leerkennung,10,10,''P95801_f32_''||zeile ) "Leerkennung "
    ,APEX_ITEM.hidden (33,mdt_id ,'''' ,''P95801_f33_''||zeile ) mdt_id
    ,APEX_ITEM.hidden (34,lapl_koor1 ,'''' ,''P95801_f34_''||zeile) lapl_koor1
    ,APEX_ITEM.hidden (35,lapl_koor2 ,'''' ,''P95801_f35_''||zeile ) lapl_koor2
    ,APEX_ITEM.hidden (36,lapl_koor3 ,'''' ,''P95801_f36_''||zeile) lapl_koor3
    ,APEX_ITEM.hidden (37,lapl_koor4 ,'''' ,''P95801_f37_''||zeile) lapl_koor4
    ,APEX_ITEM.hidden (38,lapl_koor5 ,'''' ,''P95801_f38_''||zeile ) lapl_koor5
    ,APEX_ITEM.hidden (39,lage_id ,'''',''P95801_f39_''||zeile ) lage_id
    ,APEX_ITEM.hidden (40,lagepos_id ,'''' ,''P95801_f40_''||zeile) lagepos_id
    ,APEX_ITEM.display_and_save(41,lapl_kurzbez,''P95801_f41_''||zeile) "Lagerplatz"
    ,APEX_ITEM.display_and_save(42,lavo_id ,''P95801_f42_''||zeile) "Fachtyp"
    ,DECODE(mat_id ,NULL, APEX_ITEM.popup_from_lov (43,'''',''MATLAVO'','''','''',0,'''',''''
    ,''onFocus="fkt_set_bordercolor(this)" onBlur="fkt_reset_bordercolor(this)" onkeydown="fkt_submit_tab(event,this)" ''
    ,''YES'',''P95801_f43_''||zeile)
    ,APEX_ITEM.display_and_save(43,mat_id,''P95801_f43_''||zeile)) "Material-Id"
    ,DECODE(matart_id,NULL, APEX_ITEM.hidden(44,matart_id ,'''' ,''P95801_f44_''||zeile)
    , APEX_ITEM.hidden(44,matart_id ,'''' ,''P95801_f44_''||zeile)) matart_id
    ,DECODE( mdt_id_mat,NULL, APEX_ITEM.hidden (45,mdt_id_mat ,'''' ,''P95801_f45_''||zeile )
    ,APEX_ITEM.hidden (45,mdt_id_mat ,'''' ,''P95801_f45_''||zeile )) mdt_id_mat
    ,APEX_ITEM.display_and_save(46,mat_name1 ,''P95801_f46_''||zeile) "Materialname"
    ,APEX_ITEM.display_and_save(47,mat_name2 ,''P95801_f47_''||zeile) "Materialbezeichnung"
    ,APEX_ITEM.display_and_save(48,lagepos_menge ,''P95801_f48_''||zeile) "Lagernde Menge"
    ,APEX_ITEM.display_and_save(49,meschl_id ,''P95801_f49_''||zeile) "Mengenschlüssel"
    ,APEX_ITEM.text(50,zumenge,10,10,'' style="width:120px" onFocus="fkt_set_bordercolor(this)" onBlur="fkt_reset_bordercolor(this)" onkeydown="fkt_submit_tab(event,this)" '',''P95801_f50_''||zeile ) "Einzulagernde Menge"
    FROM lapl_lagepos';
    RETURN v_sql;
    end;
    Thank you for help

  • How do you pass vi references from one event to another

    I have a vi which gets vi references (thereby loading the vi's into memory) for all the vi's in a given directory when a user clicks a button on the front panel. To do this I use an event structure. My question is whether it is possible to have another event (user button on the front panel) which unloads the vi's from memory. I have tried passing the vi references that are initially generated to the close reference function but whenever I do I get a 'vi reference invalid' error. Does this have to do with trying to pass the vi references between one event and another? If I use a local variable simply pass a reference to another indicator and then probe it, the originally-generated refnum and the local vari
    able refnum match up. However once I try to wire that same indicator to the close reference function I get the 'vi reference invalid' error. Is there a different/better way to unload the vi's from memory based on a user button click? Any suggestions would be welcome.
    Jason
    Attachments:
    Load_Directory_of_vi's.vi ‏57 KB

    Several problems with your code:
    1... Bad idea to use lights as buttons. Yes it can be done, but it's not "natural".
    2... If you've gotta do that, set their mechanical action to "LATCH WHEN RELEASED"
    3... Because of #2, you are getting TWO copies of every array when you click the LOAD VIs light (er... button).
    4... No need for the conversion from path to string and back - use BUILD PATH to append each file name to he folder path.
    5... Set the BROWSE OPTIONS on your PATH control to EXISTING DIRECTORY to allow browsing of directories, not files.
    6... Your code doesn't care whether the file is a .VI file, or a .ZIP file, or a .TXT file, or what. Use the PATTERN input on the LIST function to discriminate.
    7... Your code is only storing the latest refer
    ence, not the array of references.
    8... An ERROR DIALOG on the OPEN REFERENCE function will tell you that you're getting an error. Why? You are asking to prepare a non-reentrant VI for reentrant execution (why use options = 8?)
    9... Because of #8, the latest VI reference is invalid.
    Steve Bird
    Culverson Software - Elegant software that is a pleasure to use.
    Culverson.com
    Blog for (mostly LabVIEW) programmers: Tips And Tricks

  • URGENT: passing more than one value at the same parameter

    Hello friends at www.oracle.com,
    if I have a Forms program that sends some parameters to a Report, how can I send more than one value at the same parameter that is being sent?
    For example: the Reports parameter P_CODE should receive (from Forms) and print the values 1, 2, 3 and 4, each one in a different page. But, only 4 is being printed, and these values aren't saved at a database, so I have to pass the other three values too. How can I solve this problem?
    This is quite urgent and I need help on this.
    Best regards,
    Franklin Gongalves Jr.
    [email protected]

    Thanks to Oracle Reports Team for answering! I'm sure this will work.
    Best regards,
    Franklin Gongalves Jr.
    [email protected]
    hello,
    on the forms side, you will have to build the list for this parameter by e.g. string concat.
    on the reports side you will have to "decode" this parameter according to how you built it in forms.
    e.g. if you pass the list like this "10~20~30" you might use a where-clause in the query
    ... where instr(myCol, :myParam) >0
    regards,
    the oracle reports team --pw                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

Maybe you are looking for

  • Is there any way to open a map to the location specified in a calendar event?

    Besides opening the event, copying the location, and pasting it into google\bing\etc mapping tools I do not see this rather common functionality available in Lightning. Ideally, right clicking on the event in the calendar (without opening the event)

  • Captivate and Macbook Pro Retina display support. When?

    Hi there. Having just purchased a new MBP with retina display I was disappointed to find that Captivate 7 appeared not to support the display settings. It looks blocky and ill-defined compared to all the other programs, Powerpoint included. My web-se

  • Need urgent help in creating report

    i have two facts number of open bugs number of closed bugs i have a status column (status of bug) now i have to create a report (chart) which shows me number of open bugs and number of close bugs. The main problem here is i want to filter open bugs a

  • How do I transfer Outlook mail archive files to iMail?

    I am migrating from a PC desktop to a new iMac to fully integrate our family devices. I have several thousand archived Outlook emails as well as current emails that I need to migrate to iMail.  I have installed Parallels 8 to run several PC only prog

  • Store Images Wont Showup in Firefox

    hey everyone... this may be a firefox bug im not sure but i'm having trouble with some webstores in firefox... in some stores (apple store online, american eagle's site/store) the images of products will not show up. they show up fine in safari but n