10 Things Every Java Programmer Should Know about String
Strings are not null terminated in Java.
String are Object in Java and backed by character array. You can get the
character array used to represent String in Java by calling toCharArray() method of java.lang.String class of
JDK.
Strings are immutable and final in Java
content of String. If you modify it by using toLowerCase(), toUpperCase() or any
other method, It always result in new
String. Since String is final there is no way anyone can extend String or
override any of String functionality. Now if you are puzzled why
String is immutable or final in Java. checkout the link.
Strings are maintained in String Pool
e.g. "abc" (anything
which is inside double quotes are String literal in Java) are maintained in a
separate String pool, special memory location inside Java memory, more
precisely inside PermGen
Space. Any time you create a new String object using String literal, JVM
first checks String pool and if an object with similar content available, than
it returns that and doesn't create a new object. JVM doesn't perform String
pool check if you create object using new operator.
String name = "Scala"; // 1st String object
String name_1 = "Scala"; // same object referenced by name variable
String name_2 = new String("Scala"); // different String object
String name_3 = new String(name_1); // different String object
String name_4 = String.valueOf(name_1); // same object referenced by
// name variable // this will return true
if (name == name_1)
{
System.out.println("both name and name_1 is pointing to same string object");
} // this will return false
if (name == name_2)
{
System.out.println("both name and name_2 is pointing to same string object");
} // this will return true
if (name_3 == name_1)
{
System.out.println("both name3 and name_1 is pointing to same string object");
} // this will return true
if (name_4 == name)
{
System.out.println("both name4 and name is pointing to same string object");
}
if you compare name and name_1 using equality operator "==" it will return true because both are pointing to same object. While name==name_2 will return false because they are pointing to different string object. It's worth remembering that equality "==" operator compares object memory location and not characters of String. By default Java puts all string literal into string pool, but you can also put any string into pool by calling intern() method of java.lang.String class, like string created using new() operator.
Equals methods for comparing String in Java
which is based on characters, case and order. So if you want to compare two
String object, to check whether they are same or not, always use equals() method
instead of equality operator. Like in earlier example if we use equals
method to compare objects, they will be equal to each other because they
all contains same contents. Here is example of comparing String using equals
method.
You can also check my earlier post difference
between equals() method and == operator for more detail discussion on
consequences of comparing two string using == operator in Java.
indexOf() and lastIndexOf() or matches(String regex) method to search inside
String
convenient method to see if a character or sub-string or a pattern
exists in current String object. You can use indexOf() which will
return position of character or String, if that exist in current String object
or -1 if character doesn't exists in String. lastIndexOf is similar
but it searches from end. String.match(String regex) is even
more powerful, which allows you to search for a regular
expression pattern inside String. here is examples of indexOf, lastIndexOf and matches method
from java.lang.String class.
String str = "Java is best programming language";
if(str.indexOf("Java") != -1){
System.out.println("String contains Java at index :" + str.indexOf("Java"));
}
if(str.matches("J.*")){
System.out.println("String Starts with J");
}
str ="Do you like Java ME or Java EE";
if(str.lastIndexOf("Java") != -1){
System.out.println("String contains Java lastly at: " + str.lastIndexOf("Java"));
}
As expected indexOf will return 0 because characters
in String are indexed from zero. lastIndexOf returns
index of second “Java”, which starts at 23 and matches
will return true because J.* pattern is any String starting with character
J followed by any character because of dot(.) and any
number of time due to asterick (*).
non-intuitive. If you just put "Java" in matches
it will return false because String is not equals to
"Java" i.e. in case of plain text it behaves like equals method. See here
for more examples of String matches() method.
regex) String also has methods like startsWith() and endsWidth(), which can
be used to check an String if it starting or ending with certain character or
String.
SubString to get part of String in Java
be used to get parts of String. basically you specify start and end index and substring() method
returns character from that range. Index starts from 0 and goes till String.length()-1. By the
way String.length() returns you number of characters in String,
including white spaces like tab, space. One point which is worth remembering
here is that substring is also backed up by character array, which is used by
original String. This can be dangerous if original string object is very large
and substring is very small, because even a small fraction can hold reference
of complete array and prevents it from being garbage collected even if there is
no other reference for that particular String. Read How
Substring works in Java for more details. Here is an example of using SubString
in Java:
String str from index 0 to 12
"+" is overloaded for String concatenation
doesn't support Operator overloading but String is special and + operator
can be used to concatenate two Strings. It can even used to convert int, char, long or double to convert
into String by simply concatenating with empty
string "". internally + is implemented
using StringBuffer prior to Java 5 and StringBuilder from Java
5 onwards. This also brings point of using StringBuffer or StringBuilder for
manipulating String. Since both represent mutable object they can be used to
reduce string garbage created because of temporary String. Read more about StringBuffer
vs StringBuilder here.
trim() to remove white spaces from String
from both end of String. If trim() removes white spaces it
returns a new String otherwise it returns same String. Along with trim() String also provides replace() and replaceAll() method for
replacing characters from String. replaceAll method even
support regular expression. Read more about How to replace String in Java here.
split() for splitting String using Regular expression
take any String in form of regular expression and split the String based on
that. particularly useful if you dealing with comma separated file (CSV) and
wanted to have individual part in a String array. There are other methods also
available related to splitting String, see this Java
tutorial to split string for more details.
store sensitive data in String
passwords, SSN or any other sensitive information. Since String is immutable in
Java there is no way you can erase contents of String and since they are kept
in String pool (in case of String literal) they stay longer on Java heap ,which
exposes risk of being seen by anyone who has access to Java memory, like
reading from memory dump. Instead char[] should be
used to store password or sensitive information. See Why
char[] is more secure than String for storing passwords in Java for more
details.
11) Character Encoding and String
Apart from all these 10 facts about String in Java, the most critical thing to know is what encoding your String is using. It does not make sense to have a String without
knowing what encoding it uses. There is no way to interpret an String
if you don't know the encoding it used. You can not assume that "plain"
text is ASCII. If you have a String, in memory or stored in file, you
must know what encoding it is in, or you cannot display it correctly. By
default Java uses platform encoding i.e. character encoding of your
server, and believe me this can cause huge trouble if you are handling
Unicode data, especially if you are converting byte array to XML String.
I have faced instances where our program fail to interpret Strings from
European language e.g. German, French etc. because our server was not
using Unicode encodings like UTF-8 or UTF-16.
Thankfully, Java allows you to specify default character encoding for
your application using system property file.encoding. See hereto read more about character encoding in Java
Java, sometime even refer has God class. It has some unique feature like immutability, concatenation
support, caching etc, and to become a serious Java programmer,
detailed knowledge of String is quite important. Last but not the least don't
forget about character
encoding while converting a byte array into String in Java. Good knowledge of java.lang.String is must for good Java developers.
10 Things Every Java Programmer Should Know about String的更多相关文章
- Top 10 Methods for Java Arrays
作者:X Wang 出处:http://www.programcreek.com/2013/09/top-10-methods-for-java-arrays/ 转载文章,转载请注明作者和出处 The ...
- 10个使用Java最广泛的现实领域
10个使用Java最广泛的现实领域 如果你是一个初学者,刚刚开始学习Java,你可能会想Java有什么用呢?除了Minecraft貌似也看不到其他用Java写的游戏,像Adobe Acrobat和Mi ...
- 在 Ubuntu 13.10 中搭建Java开发环境 - 懒人版
本文记录我在Ubuntu 13.10中搭建Java开发环境. 本文环境: Ubuntu 13.10 x64运行在Win7下的VMware Workstation 10中. 1. 安装JDK与JRE s ...
- Yet Another 10 Common Mistakes Java Developers Make When Writing SQL (You Won’t BELIEVE the Last One)--reference
(Sorry for that click-bait heading. Couldn’t resist ;-) ) We’re on a mission. To teach you SQL. But ...
- macOs升级到10.13.1Beta || JAVA升级到最新版之后PhpStorm菜单栏问题
macOs升级到10.13.1Beta || JAVA升级到最新版之后PhpStorm菜单栏会消失,估计不止出现在PhpStorm,一系列jetbrains的产品可能都会有这个问题,包括eclipis ...
- 20172319 2018.10.19《Java程序设计教程》第7周课堂实践(补写博客)
20172319 2018.10.19 <Java程序设计教程>第7周课堂实践 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...
- 20172319 2018.10.12《Java程序设计教程》第6周课堂实践(补写博客)
20172319 2018.10.12 <Java程序设计教程>第6周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...
- 10个用Java谋生非常有趣的方式
令我惊讶的是,有些人觉得编程并不令人兴奋——只将它当作是一份枯燥的工作.不过,虽然可能的确有很多无聊的编程工作,但这并不意味着你不得不接受这些工作中的一个.程序员有各种各样的机会,运用他们的技能去做一 ...
- 【翻译】Java Array的排名前十方法(Top 10 Methods for Java Arrays)
这里列举了Java Array 的前十的方法.他们在stackoverflow最大投票的问题. The following are top 10 methods for Java Array. The ...
随机推荐
- 【代码笔记】iOS-传身份证号码可返回生日字符串
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. NS ...
- System.Drawing.Image在Save之后Type变了
前段时间发现asp.net MVC 3附带了一个相当方便的图片处理类WebImage,常用的图片处理功能全都包括进去了,用起来是相当的爽. 在项目中刚好有相关的图片处理需求,但由于实际项目是使用asp ...
- js自执行函数的几种不同写法的比较
经常需要一个函数自执行,可惜这一种写法是错的: function(){alert(1);}(); 原因是前半段“function(){alert(1);}”被当成了函数声明,而不是一个函数表达式,从 ...
- linux 学习随笔-磁盘管理
1:df 用于查看已挂载磁盘的容量信息 -i 查看inodes使用情况 -h 以合适的单位显示 -k -m 分别以k M单位显示 2:du 查看某个文件或者目录占用的空间 du [-abckmsh] ...
- 写在复习MVC后
MVC的一些 今天把MVC复习了下,包括官方文档以及各种中文博客. 官方文档里面最能说明的问题的图片,相对于传统的MVC,苹果分离了View和Model之间的通信,实现了更好的复用性.我觉得MVC更 ...
- Biee 迁移和刷新GUIDs
Biee11g迁移 与刷新 一.停止biee服务 二.备份文件 1. rpd文件夹路径: biee_home\instances\instance1\bifoundation\Oracle ...
- CSS之旅——第三站 强大的伪选择器
说到伪选择器,真的让我体会到了CSS的无比强大,强大到自己貌似都不认识CSS了,有点C# 6.0中一些语法糖带给我们的震撼...首先 我们可以在VS里面提前预览一下. 可以看到,上面的伪类有很多很多, ...
- MySQL 5.6 主从复制如何处理——触发器,函数,存储过程,调度事件
截图来自MySQL5.6的pdf版文档. 说明: 1)基于语句的复制时,trigger会在slave上执行,所以slave上也需要有trigger的定义,不然会导致主从数据不一致的: 2)基于行的 ...
- 【mysql】关于乐观锁
一.乐观锁介绍 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检,乐观锁适用于 ...
- no CONFIG_BQL
[PATCH] net: make CONFIG_BQL actually end user configurable Without the defining string or help text ...