Why String class was declared as final.
Why String class was declared as final.
Thanks
Mohan
http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=d92720bd3ed4dffffffff95e59403ecf4db1:YfiG?bug_id=4095367
Similar Messages
-
Why String class is defined as immutable?
Why String class is defined as immutable? what can be the reason behind it?
Do try this at home. :)
public class Main {
public static void main(String... args) {
System.out.println("Greetings.");
System.out.println("Goodbye.");
static {
// translates into Japanese. NOT a good idea!
try {
final Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] chars = new char[8];
"Sayonara".getChars(0,8,chars,0);
field.set("Goodbye.", chars);
chars = new char[10];
"Konichi-wa".getChars(0,10,chars,0);
field.set("Greetings.", chars);
} catch (Exception e) {
throw new AssertionError(e);
} -
Please tell me why String class objects are immutable. Why it was designed like that?
Read Java tutorials.Thanks for your reply. But tutorial says thatString
objects are immutable but they dont say why
they
made
as immutable.Welcome swathi.reply #4 is the best answer Ithink.
But please look at my reply #8Please look at reply#2 in the other thread.But reply #2 was mine. I dont understand what you say? Please help me. -
Why I should declare a final object!
import java.util.*;
public class Problem {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("Exiting.");
timer.cancel();
5000);
System.out.println("In 5 seconds this
application will exit. ");
When I complie the program there is one error as follow:
Problem.java:11: local variable timer is accessed from within inner class; needs
to be declared final
timer.cancel();
1 error
I don't kown why I must declare the timer as "final"!
Help me!What you have is an anonymous inner class. For this class to be able to access local variables in the containing class they must be final. When the compiler compiles the code it will create the inner class with a reference to the variable. If you were able to change the variable the inner class would lose the reference.
-
Why should we not declare Class with protected modifier ?
Why should we not declare Class with protected modifier ?
jwenting wrote:
georgemc wrote:
Why we not research our endless questions?how else could you reach 14000 posts in under 3 years, a true achievement :) Congratulations.Ah, that reminds me. It was a long time ago since I posted some stats:
Posts:
jverd 46427 2972 0,06
DrClap 36310 5222 0,14
jschell 32357 2583 0,08
CeciNEstPasUnProgrammeur 31500 1438 0,05
camickr 29870 4783 0,16
yawmark 28729 1803 0,06
kajbj 24180 1829 0,08
BalusC 22857 2875 0,13
warnerja 21886 2188 0,10
ejp 19929 3247 0,16
sabre150 17537 1913 0,11
paulcw 16005 1724 0,11
DrLaszloJamf 14857 1840 0,12
georgemc 14000 889 0,06
prometheuzz 13466 1180 0,09
cotton.m 13409 1308 0,10
ChuckBing 12667 1735 0,14
JosAH 11926 842 0,07
flounder 11607 1201 0,10
mlk 10795 886 0,08
Darryl.Burke 10564 1787 0,17
Encephalopathic 10203 1508 0,15
tjacobs01 9540 1658 0,17
BigDaddyLoveHandles 8980 763 0,08
dcminter 8081 533 0,07
tsith 8049 704 0,09
jwenting 7831 249 0,03
malcolmmc 7539 819 0,11
Michael_Dunn 7392 2088 0,28
PhHein 7360 1207 0,16
morgalr 7081 703 0,10
pbrockway2 6471 1208 0,19
BIJ001 6179 322 0,05
JoachimSauer 5824 604 0,10
abillconsl 5777 943 0,16
corlettk 5671 544 0,10
TuringPest 5651 444 0,08
masijade. 5396 434 0,08
YoGee 4695 530 0,11
gimbal2 3642 315 0,09
uncle_alice 3496 1009 0,29
bshannon 3427 614 0,18
tschodt 3236 280 0,09
sjasja 3193 459 0,14
SoulTech2012 3005 109 0,04
Peter__Lawrey 2847 254 0,09
Torgil 2175 358 0,16
Navy_Coder 2119 648 0,31
rukbat 1951 252 0,13
java_2006 1913 1123 0,59
baftos 1808 665 0,37
es5f2000 1718 192 0,11
AndrewThompson64 1716 973 0,57
YAT_Archivist 1713 230 0,13
Aknibbs 1693 86 0,05
drvijayy2k2 1574 266 0,17
StanislavL 1396 1117 0,80
stefan.schulz 1159 208 0,18
JayDS 1100 410 0,37
dannyyates 1094 211 0,19
Joerg22 1046 48 0,05
uj_ 1033 49 0,05 -
Why we should not declare a business method as final in EJBs - THX
Why we should not declare a business method as final in EJBs - THX
'cause it makes no sense at all and doesn't boost performance.
regards
dan
scpj2 -
Why String need to be final?
Why String need to be final?
Final or immutable? Final so that you are not tempted to extend String. You are supposed to use String. Immutable for the salient reasons previously posted.
- Saish -
Did the Java Writers Get a Little Happy with Memory Use in String class?
I mean that question half jokingly.
Taking a look at the String class code, I saw the following (below).
Why is there an int for offset and an int for count?
String is immutable, why not just return value.length for the count?
And what is the offset for?
Thanks!
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0PS: a second look kinda verifies it too.
in the constructor ,count is even defined as value.length.
public String(char value[]) {
int size = value.length;
this.offset = 0;
this.count = size;
this.value = Arrays.copyOf(value, size);
}You don't get the choice. The arrays are shared
whenever you do substring.Yea, thats my point. I think most Strings are unique.
Id be very surprised if even 2% of all String use was
a result of a substring.The wrapper classes use it for parsing.
File uses it for getName and getParent.
String uses it for trim.
Class uses it for resolving names.
Regex uses it.
etc. ...
Now, I don't know what percentage of usage all that amounts to, but it IS heavily used.
So your desire to gain the 2 bytes back would cost enough byte every time substring is used that it might end up costing far more than the 8 bytes you save. -
Why no class CodePoint ?
I find the implementation of code point handling in the Character class quite cumbersome.
A class "CodePoint" that supercedes "Character" in the long run would look more logical and more convenient in usage to me.
What's the reason why this road was not taken?The current design allows to handle code points
correctly but encourages the average programmer to
just ignore them (and continue to use Characters)
because the code point API is so cumbersome and
supplementary characters are hardly ever needed.
If we had an additional CodePoint class that contains
all the methods of Character that take an "int
codePoint" we would surely see more programs that
handle all possible characters correcty. And it would
be type safe too (I hate to use int)In the design justification (given in the Index page of the JSR 204 final draft) they discuss not just the representation of characters using char/char32/int/CodePoint, but also Strings. I think this is the significant point. Presuming that we don't have a new type of String for supplementary characters, we need to expand String's API so it can be 'viewed' as comprising both chars and code points. But if the latter are represented as a new CodePoint class, it's hard to avoid a lot of slow boxing/unboxing to convert chars to CodePoints.
I agree though that the new methods aren't pretty, such as this one from String:
int offsetByCodePoints(int index, int codePointOffset); // in effect advances an index (measured in chars) by codePointOffset (measured in codePoints) to return another index (measured in chars).
This seems to be the only String method which 'knows' whether a codepoint in a String consists of 1 or 2 chars. So iteration code will look something like this:
String text = whatever;
int index = 0;
while (blah) {
int codePoint = text.codePointAt(index);
// ...process this character
index = text.offsetByCodePoints(index, 1); // skip a Unicode 4.0 character
Not very pretty. Alternatively you could use index += Character.charCount(codePoint), but doing iteration 'by hand' like this without using String methods is a bit unfortunate. Perhaps they should have provided a CodePointIterator for String (+Buffer/Builder) which returns ints (and thus can't be an instance of Iterator).
String text = whatever;
CodePointIterator it = text.codePointIterator();
while (it.hasNext()) {
int codePoint = it.next();
// ...process this character
Or even, if they added a CodePoint class, they could have made made String implement Iterable<CodePoint> and thus return a genuine Iterator<CodePoint> so you can write:
String text = whatever;
for (CodePoint c : text) {
// ...process this character
AFAIK this would work OK in terms of generics but would be quite slow. -
Problems with String[] Class Object
Hi guys,
I'm writing a web server who should invoke a method of a class when asked by a client.
My problem is that if the method that should be invoked has a String[] parameter the web server is unable to invoke it and throws a java.lang.IllegalArgumentException: argument type mismatch.
Useful pieces of code to understand are the following:
//create the Class[] to pass as parameter to the getMethod method
Class[] paramType = {String[].class};
//find the class "className" and create a new instance
Class c = Class.forName(className);
Object obj = c.newInstance();
//the getMethod should find in the class c the method called nameMeth
// having paramType (i.e. String[]) as parameter type...
Method theMethod = c.getMethod(nameMeth, paramType);
//here's the problematic call!!
theMethod.invoke(obj, params);I've noted that System.out.println(theMethod); prints the signature of the method with the parameter type java.lang.String[].
System.out.println(paramType[0]); instead prints [Ljava.lang.String;
I know that [L means that it is an array, so why do you think that I'm having an argument type mismatch?
Thank youI had no problems making that work.import java.lang.reflect.Method;
public final class StringArray {
public static final String CLASSNAME = "StringArray";
public static final String METHODNAME = "myMethod";
public static final String[] sa = { "a", "b"};
// automatic no-args constructor
public final void myMethod(String[] sa) {
for(int i=0;i<sa.length;++i) {
System.out.println(sa);
public static final void main(String[] arg) throws Exception {
//create the Class[] to pass as parameter to the getMethod method
Object[] params = { sa };
Class[] paramType = {sa.getClass()};
//find the class "className" and create a new instance
Class c = Class.forName(CLASSNAME);
Object obj = c.newInstance();
//the getMethod should find in the class c the method called nameMeth
// having paramType (i.e. String[]) as parameter type...
Method theMethod = c.getMethod(METHODNAME, paramType);
//here's the problematic call!!
theMethod.invoke(obj, params); -
How to change the cursor type when a TableView class was added to a Swing application?
We can resize column width by dragging the column divider in the table header. This is a built-in feature of the TableView class.
Normally, the cursor will become to east-resize (or west-resize) type with positioning the cursor just to the right of a column header.
However, I found that the cursor is remaining the default type at the same position if I integrate JavaFX into Swing Application. That is adding the TableView to a Scene, and then adding this Scene to a JFXPanel, finally, adding this JFXPanel to the JFrame.
The sample codes are listing below:
public class Run extends JFrame {
Run() {
setSize(600, 450);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
private void initComponents() {
final JFXPanel fxPanel = new JFXPanel();
this.getContentPane().add(fxPanel);
Platform.runLater(new Runnable() {
@Override
public void run() {
initFX(fxPanel);
private void initFX(JFXPanel fxPanel) {
Scene scene = null;
try {
scene = FXMLLoader.load(
new File("res/fxml_example.fxml").toURI().toURL()
} catch (Exception ex) {
ex.printStackTrace();
fxPanel.setScene(scene);
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Run().setVisible(true);
fxml_example.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.Scene?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<Scene xmlns:fx="http://javafx.com/fxml">
<TableView fx:id="tableView"
editable="true">
<columns>
<TableColumn text="COL1">
</TableColumn>
<TableColumn text="COL2">
</TableColumn>
<TableColumn text="COL3">
</TableColumn>
<TableColumn text="COL4">
</TableColumn>
<TableColumn text="COL5">
</TableColumn>
</columns>
</TableView>
</Scene>
So, are there anyone can advise how to fix these codes; make the cursor can change to east-resize (or west-resize) type when this TableView class was added to a Swing application?Thanks for the report. I've just filed a JIRA issue: https://javafx-jira.kenai.com/browse/RT-34009
//Anton. -
ok, i know extending the string class is illegal because it's final, but i want to make an advanced string class that basically "extends" the string class and i've seen online this can be done through wrapper classes and/or composition, but i'm lost
here is my sample code that is coming up with numerous compile time errors due to the fact that when i declare a new AdvString object, it doesn't inherit the basic string features (note: Add is a method that can add a character to a specified location in a string)
class AdvString
private String s;
public AdvString(String s)
this.s = s;
public void Add(int pos, char ch)
int this_len = (this.length()) + 1;
int i;
for(i=0;i<(this_len);i++)
if(pos == i)
this = this + ch;
else if(pos < i)
this = this + this.charAt(i-1);
else
this = this + this.charAt(i);
public static void main(String[] args)
AdvString s1;
s1 = new AdvString("hello");
char c = 'x';
int i = 3;
s1.Add(i,c);
//s2 = Add(s1,i,c);
//String s2_reversed = Reverse(s2);
System.out.println("s1 is: " + s1);
any tips?see REString at,
http://www.geocities.com/rmlchan/mt.html
you will have to replicate all the String methods you are interested in, and just forward it to the String instance stored in REString or the like. it is like a conduit class and just passes most processing to the 'real' string. maybe a facade pattern. -
What does the trim() method of the String class do in special cases?
Looking here ( String (Java Platform SE 7 ) ), I understand that the trim() method of the String class "returns a copy of the string, with leading and trailing whitespace omitted", but I don't understand what the last special case involving Unicode characters is exactly.
Looking here ( List of Unicode characters - Wikipedia, the free encyclopedia ), I see that U+0020 is a space character, and I also see the characters that follow the space character (such as the exclamation mark character).
So, I decided to write a small code sample to try and replicate the behaviour that I quoted (from the API documentation of the trim method) in the multi-line comment of this same code sample. Here is the code sample.:
public class TrimTester {
public static void main(String[] args) {
* "Otherwise, let k be the index of the first character in the string whose code
* is greater than '\u0020', and let m be the index of the last character in the
* string whose code is greater than '\u0020'. A new String object is created,
* representing the substring of this string that begins with the character at
* index k and ends with the character at index m-that is, the result of
* this.substring(k, m+1)."
String str = "aa!Hello$bb";
System.out.println(str.trim());
However, what is printed is "aa!Hello$bb" (without the quotes) instead of "!Hello$" (without the quotes).
Any input to help me better understand what is going on would be greatly appreciated!That's not what I was thinking; I was thinking about the special case where the are characters in the String whose Unicode codes are greater than \u0020.
In other words, I was trying to trigger what the following quote talks about.:
Otherwise, let k be the index of the first character in the string whose code is greater than '\u0020', and let m be the index of the last character in the string whose code is greater than '\u0020'. A new String object is created, representing the substring of this string that begins with the character at index k and ends with the character at index m-that is, the result of this.substring(k, m+1).
Basically, shouldn't the String returned be the String that is returned by the String class' substring(3,9+1) method (because the '!' and '$' characters have a Unicode code greater than \u0020)?
It seems to not be the case, but why? -
Where can I declare a final variable?
I'm wondering where excatly I can declare a final variable. I know I can declare them right after I start the class.
i.e.:
public class x {
public static final Scanner CONSOLE = new Scanner(System.in);
public static final Random GENERATOR = new Random();
}I would like to declare a final within the main method. i.e.:
public static void main(String[] args) {
System.out.print("Please type in your name and press return: ");
final String NAME = CONSOLE.next();
}Is this just not possible or am I just writing it wrong? Couldn't find an example using google. Any help?
fyi: I'm fairly new to using java so this may be obvious.public static void main(String[] args) {
System.out.print("Please type in your name and
nd press return: ");
final String NAME = CONSOLE.next();
}Is this just not possible or am I just writing it
wrong?No, you can declare a local variable final, which means that it's value can only be set once in or after the declaration. But be aware that a new variable is created each time the method is invoked.
About the only reason people do this is so it can be used in a local class declared further down the method. -
Why String Objects are immutable ?
From the JLS->
A String object is immutable, that is, its contents never change, while an array of char has mutable elements. The method toCharArray in class String returns an array of characters containing the same character sequence as a String. The class StringBuffer implements useful methods on mutable arrays of characters.
Why are String objects immutable ?I find these answers quite satisfying ...
Here's a concrete example: part of that safety is ensuring that an Applet can contact the server it was downloaded from (to download images, data files, etc) and not other machines (so that once you've downloaded it to your browser behind a firewall, it can't connect to your company's internal database server and suck out all your financial records.) Imagine that Strings are mutable. A rogue applet might ask for a connection to "evilserver.com", passing that server name in a String object. The JVM could check that this server name was OK, and get ready to connect to it. The applet, in another thread, could now change the contents of that String object to "databaseserver.yourcompany.com" at just the right moment; the JVM would then return a connection to the database!
You can think of hundreds of scenarios just like that if Strings are mutable; if they're immutable, all the problems go away. Immutable Strings also result in a substantial performance improvement (no copying Strings, ever!) and memory savings (can reuse them whenever you want.)
So immutable Strings are a good thing.
The main reason why String made immutable was security. Look at this example: We have a file open method with login check. We pass a String to this method to process authentication which is necessary before the call will be passed to OS. If String was mutable it was possible somehow to modify its content after the authentication check before OS gets request from program then it is possible to request any file. So if you have a right to open text file in user directory but then on the fly when somehow you manage to change the file name you can request to open "passwd" file or any other. Then a file can be modified and it will be possible to login directly to OS.
JVM internally maintains the "String Pool". To achive the memory efficiency, JVM will refer the String object from pool. It will not create the new String objects. So, whenever you create a new string literal, JVM will check in the pool whether it already exists or not. If already present in the pool, just give the reference to the same object or create the new object in the pool. There will be many references point to the same String objects, if someone changes the value, it will affect all the references. So, sun decided to make it immutable.
Maybe you are looking for
-
Can't take screenshots when using external monitor
I used to take screenshots of areas of my screen all the time using Cmd-Shift-4 but, on my new Macbook Pro, if I have my external LCD screen connected, then any screenshot I take comes out as just a bunch of diagonal shading. It doesn't make a differ
-
Version of EDI standard in control record of an IDOC
Hello All, I want to know from where the Version of EDI(in details tab of control record) is being picked from. Thanks, Rakesh.
-
"BUY" button in Istore is missing from the apps
I recently did a restore of my Itouch and now when I go into the app store to look up any app, the "Buy" button is gone from the top right side where it normally is. Why can't I buy any more apps? I have made sure that I am signed into my account and
-
ITunes 11.1.15 missing ringtone tab?
1. Cannot use iTunes > File > Add to Library to move/copy filename.m4r from desktop to iTunes 2. Comments from other iPhone users indicate that iTunes should have a ringtones tab. where is my ringtones tab?
-
I have a 5th generation iPod Touch and can't seem to have the product recover properly. iTunes is indicating that it is reading the iPod, but it has downloaded iOS 6.1 five times already. After each 2 hour download, it is saying it can't do anythin