reference:http://examples.javacodegeeks.com/core-java/lang/string/java-string-class-example/

1. Introduction

In this example we are going to discuss about the basic characteristics of Java String ClassString is probably one of the most used types in Java programs. That’s why Java provides a number of API methods that make String manipulation easy and efficient, straight out of the box. Strings are so important that even in the latest Java releases (including 7 and 8), several changes have been made to its class methods and its internal representation, improving it even further in terms of performance and security.

2. String Class basic methods

String is simply a sequence of characters. As a matter of fact, a String Object is backed by a char array. Consequently, it is not null terminated, like in C/C++.

Here is how you can create a String

1 String str= "Hello World";

"Hello World" is called a String literal. In a Java program, everything between two double quotes is a String literal. Literals are implemented as instances of String class. As you can see, you can conveniently initialize a String Object like a primitive type, e.g int i = 0;.

There is no need to do:

1 String str = new String("Hello World");

There is a difference between these two initialization methods, although the result is the same : A String with value “Hello World”. But more on that in just a bit.

For now, here is a simple main with the most important String API methods:

StringClassExample.java

001 package com.javacodegeeks.core.lang.string;
002  
003 public class StringClassExample {
004  
005     public static void main(String[]args){
006         //Initialization with literal
007         String str1 = "Hello World";
008         System.out.println("str1:"+str1);
009  
010         //Initialization with char array
011         char arr[] = {'H','e','l','l','o'};
012         String str2 = new String(arr);
013         System.out.println("str2:"+str2);
014  
015         //Concatenation using + operator
016         String str3 = "World";
017         str3 = str2 + " " + str3;
018         System.out.println("str3:"+str3);
019  
020         //find out the length of a string
021         System.out.println(str3.length());
022  
023         //You can even apply that to literals, as with all String API methods
024         //As we said. literals are implemented as String instances
025         System.out.println("Length: "+"abcdefg".length());
026  
027         //Substring from position 2 to position 10
028         String c = str1.substring(2,10);
029         System.out.println("Substring :"+c);
030  
031         //Substring from position 1 to position 4
032         System.out.println("Literal Substring :"+"abcdefghigklm".substring(1,4));
033  
034         // Get the charcter array of the string.
035         char[] chars = c.toCharArray();
036         System.out.println("Char array : ["+chars[0]+","+chars[1]+","+chars[2]+"]");
037  
038         //find the first index of a char inside a string
039         int i = str1.indexOf('W');
040         System.out.println("Index of 'W':"+i);
041  
042         //find the first index of a string inside another string after a certain position
043         i = str1.indexOf("orld",5);
044         System.out.println("Index of 'orld':"+i);
045  
046         //find the last index of a string inside another string
047         i = str1.lastIndexOf("l");
048         System.out.println("LAST Index of 'l':"+i);
049  
050         //find the last index of a string inside another string after a certain position
051         // - like scanning the string backwards
052         i = str1.lastIndexOf("l",7);
053         System.out.println("LAST Index of 'l':"+i);
054  
055         //find a character in a certain position
056         char cr = str1.charAt(5);
057         System.out.println("Character at position 5:"+cr);
058  
059         //Lower case
060         System.out.println("ABCEFAFA".toLowerCase());
061  
062         //Upper case
063         System.out.println("abcasipasc".toUpperCase());
064  
065         //replace occurrences of a character
066         str1 = str1.replace('o','0');
067         System.out.println(str1);
068  
069         //Trim white spaces from the end and the beginning
070         String str4 = "    Java";
071         System.out.println(str4);
072         System.out.println(str4.trim());
073  
074         //Split !!!
075         String str5= "Java is great";
076         String[] strArray = str5.split(" ");
077  
078         System.out.println(strArray[0]+","+strArray[1]+","+strArray[2]);
079  
080         str5= "Java-is-great";
081         strArray = str5.split("-");
082         System.out.println(strArray[0]+","+strArray[1]+","+strArray[2]);
083  
084         str5= "Java is great";
085         strArray = str5.split("/*");
086         System.out.println(strArray[0]+","+strArray[1]+","+strArray[2]+","+strArray[3]+","+strArray[4]+
087                 ","+strArray[5]+","+strArray[6]+","+strArray[7]+","+strArray[8]);
088  
089         //contains and equals
090         System.out.println("Contains :" "qwerty".contains("ert"));
091         System.out.println ("Equals :"+str5.equals("java is great"));
092         System.out.println ("Equals ignore case:"+str5.equalsIgnoreCase("java is great"));
093  
094         // Compare lexicographically two strings
095         System.out.println ("Compare:"+str5.compareTo("abc"));
096  
097         //comparison attempts
098         String s1 = "abc";
099         String s3 = new String("abc");
100  
101         System.out.println(s1==s3);
102         System.out.println(s1.equalsIgnoreCase(s3));
103  
104     }
105  
106 }

This is the output of the above program:

str1:Hello World
str2:Hello
str3:Hello World
11
Length: 7
Substring :llo Worl
Literal Substring :bcd
Char array : [l,l,o]
Index of 'W':6
Index of 'orld':7
LAST Index of 'l':9
LAST Index of 'l':3
Character at position 5:
abcefafa
ABCASIPASC
Hell0 W0rld
Java
Java
Java,is,great
Java,is,great
,J,a,v,a, ,i,s,
Contains :true
Equals :false
Equals ignore case:true
Compare:-23
false
true

From the above program is clear that Java designers decided to treat Strings somewhat differently from other Objects. For example you can initialize them like a primitive, e.g String a="abc" and you can concatenate two strings using + operator, like you would add twoints (looks like overloading + operator in C++).

The comparison attempts section of the code might seem a little fuzzy, but it will get clear in the next section. What you should take away from it now, is that you SHOULD NEVER try to compare the contents of Strings using == operator. You are only comparing reference equality, not content equality. You MUST use equals or equalsIgnoreCase.

3. Other characteristics of String objects

String objects are immutable. This means that once a String is created, its contents cannot be changed. In the above example, every time we attempt to change its contents, e.g when concatenating, a new String object is created representing the result. Additionally, String class is final, so you cannot override its behavior.

Immutability was mostly chosen for security reasons and for performance. It also means that two different thread can share the same String and manipulate it as they want, not having to synchronize anything, because every time they make a change in the original string, a new one is created, while the old one remains untouched.

Now let’s see this :

1 String s1 = "abc";
2 String s2= "abc";
3  
4 String s3 = new String("abc");
5  
6 System.out.println(s1==s2);
7 System.out.println(s1==s3);

This outputs:

true
false

Literals are stored in a special place in memory, called a String pool, of course in the form of String Objects. In that pool, a Stringobject with value “abc” is only created and stored once. Any other String that gets the value “abc” (statically – hard coded) will reference the same String object. So, every time you create a String using a literal, the system will search that pool and checks if the value of the literal exists in an object of the pool. If it does, it sends back the reference to that matching object, if not it creates a new Object and stores it in the pool. So, String references, initialized with the same literals, will point to the same String object. This technique was used to save precious memory, as it shares as much common data as possible.

Now, you can also see another reason why Strings are immutable. Imagine thread A creating a local string “abc” and then a second thread B creating his own local string “abc”. These two threads will share the same String object… If String was mutable, then if A changed the string, the change would affect thread B, but in a meaningless (put catastrophic) way.

When creating a String using new, you explicitly create a brand new object in the heap. This is also the case for non hard codedString initialization, for example, if you are reading input Strings from a source. These String Objects will not be stored in the pool. Imagine that you create an application that has to hold addresses for users living in Greece. There are four million people living in Athens, so consider the massive waste of space should you store four million String objects with value “Athens”. In order to pool those non hard coded Strings, there is an API method called intern, and can be used like so:

01 String s1 = "abc";
02 String s2= "abc";
03  
04 String s3 = new String("abc");
05  
06 System.out.println(s1==s2);
07 System.out.println(s1==s3);
08  
09 s3 = s3.intern();
10 System.out.println(s1==s3);

This will now output:

true
false
true

When calling intern, the system follows the same procedure as if we did s3 = "abc", but without using literals.

But be careful. Before Java 7, this pool was located in a special place in the Java Heap, called PermGen. PermGen is of fixed size, and can only hold a limited amount of string literals. So, interning should be used with ease. From Java 7 onward, the pool will be stored in the normal heap, like any other object (making them eligible for garbage collection), in a form of a hashmap and you can adjust its size using -XX:StringTableSize option. You could create your own String pool for that matter, but don’t bother.

This is only one of the aspects that Java creators changed in the String class. Even more radical changes ware made, including the internal String representation (it now has two less static fields).

Download the Eclipse Project

This was an example of Java String Class. You can download the Eclipse Project of this example here : StringClassExample.zip

Java String Class Example--reference的更多相关文章

  1. 自己挖坑自己跳 之JsonMappingException: (was java.lang.NullPointerException) (through reference chain:)

    在Web项目中,我们经常会设计一些与界面相对应的JavaBean作为Entity,而为了兼容前台传入的空值,有些字段我们会用包装类型而不是基本类型.可是往往我的Entity已经设计完成,很多时候我们会 ...

  2. 通过反编译深入理解Java String及intern(转)

    通过反编译深入理解Java String及intern 原文传送门:http://www.cnblogs.com/paddix/p/5326863.html 一.字符串问题 字符串在我们平时的编码工作 ...

  3. 通过反编译看Java String及intern内幕--费元星站长

    通过反编译看Java String及intern内幕   一.字符串问题 字符串在我们平时的编码工作中其实用的非常多,并且用起来也比较简单,所以很少有人对其做特别深入的研究.倒是面试或者笔试的时候,往 ...

  4. Java String 字符串类细节探秘

    一. 字符串基本知识要点 字符串类型String是Java中最常用的引用类型.我们在使用Java字符串的时候,通常会采用两种初始化的方式:1. String str = "Hello Wor ...

  5. Java String.replaceAll() 与后向引用(backreference)

    问题 昨天看到一篇博文,文中谈到一道 Java 面试题: 给定一字符串,若该字符串中间包含 "*",则删除该 "*":若该字符串首字符或尾字符为 "* ...

  6. 从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念

    转(http://www.codeceo.com/article/java-string-ansi-unicode-bmp-utf.html#0-tsina-1-10971-397232819ff9a ...

  7. Java String.split()小点

    java String.split(); 别的不说,单说其中一个问题,这个函数去切分空字符串时,得到的结果: public static void main(String[] args) {// St ...

  8. Java总结篇系列:Java String

    String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. 1 ...

  9. java String.split()函数的用法分析

    java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...

随机推荐

  1. emacs 操作集锦

    1.C-k 的功能并不是剪切当前行,而是剪切当前行从光标到行末的内容. Emacs 中的剪切不叫剪切(cut),叫kill,复制(copy)不叫copy ,叫kill-ring-save (这个可以理 ...

  2. 第二百零三天 how can I 坚持

    空虚的有点害怕. 日复一日. 今天做了什么?下班看了个搞笑段子. 上班和刘松聊了一下午,东扯西扯的. 下班玩了两局dota. 想租车去出去玩玩,确实没有什么想去的地方了. 莫巧菲. 哎,未来好可怕啊. ...

  3. Codeforces Round #368 (Div. 2) B. Bakery (模拟)

    Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...

  4. Linux coredump

    前面写过通过注册信号处理函数定位SEGV问题.其实Linux coredump机制也是比较好的debug手段. 进程由于某种异常或者bug导致在运行过程中异常退出或者中止,有时会产生一个叫做core的 ...

  5. 基于LDA对关注的微博用户进行聚类

    转自:http://www.datalab.sinaapp.com/?p=237 最近看了LDA以及文本聚类的一些方法,写在这里算是读书笔记.文章最后进行了一个小实验,通过爬取本人在微博上关注的人的微 ...

  6. java(2014)实现对mysql数据库分页的代码

    package util; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultS ...

  7. Unity3d:加载Gif格式图片

    unity里不支持Gif格式的图片,网上搜索也没有相关资料,殊不知我们已经太相信度娘了,而没有了自己的分析,我们知道Gif图是由多个静态图做成的,那我们就回归本土,第一步:把gif拆成n个静态图放在集 ...

  8. Android vector标签 PathData 画图超详解

    SVG是一种矢量图格式,是Scalable Vector Graphics三个单词的首字母缩写.在xml文件中的标签是<vector>,画出的图形可以像一般的图片资源使用,例子如下: &l ...

  9. 解决NDK开发中Eclipse报错“Unresolved inclusion jni.h”的最终方法

    http://blog.csdn.net/zhubin215130/article/details/39347873

  10. XHTML编码规范

    1.所有的标记都要有结束标记. 2.所有标记的名称和属性名称都必须使用小写 3.所有的的标记必须合理嵌套 4.属性值必须用引号包含起来 5.需要设置的属性都要给一个值 XHTML 规定所有属性都必须有 ...