java中关于字符串的陷阱

1.一般面试题都会出关于String  java = new String("I love java");这条语句创建了几个字符串对象?我在最开始时一直认为是只创建了一个字符串对象,但其实是创建了两个字符串对象,第一个是构造函数中作为形参的直接量对象,第二个则是构造函数返回的字符串对象。

而在 java中创建对象一般有四种方法:1.通过new调用构造函数来创建。2.通过Class对象的newInstance()方法调用构造函数来创建。3.通过java的反序列化机制从io流中恢复java对象。4.通过java对象的clone()方法复制一个新的java对象。

2.通过直接量的形式来创建java对象。如:String str1 = "hello java"; 此时创建的对象(字符直接量)会被JVM存放在字符串缓存池中。一般情况下,字符串池中的字符串对象不会被垃圾回收,当再次使用该字符串时,无须重新创建一个新的字符串对象了。

3.String str1 = "aaa的长度为:3";  String str2 = "aaa" + "长度为:" + "3";   system.out.println(str1 == str2);   输出的是 true

String str3 = "bbb的长度为:3";  String str4 = "bbb" + "长度为:" + "bbb".length();   system.out.println(str3 == str4);   输出的是 false

注:字符串对象是由字符直接量、整数直接量,没有变量的参与,没有方法调用即jvm可以在编译时就确定该字符串连接表达式的值,可以让该字符串变量直接指向字符串缓存池中的对应变量。而如果使用了变量或调用了方法,则无法使用字符串缓存池。

4.字符串可以通过compareTo()方法来进行性比较,如:“abc”.compareTo("ac"); 此时该表达式小于0,因为该方法是通过从左往右对比每个字符的ascii码。因为c>b,所以ac>abc

5.表达式类型的自动提升:整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。

byte,short,char ——》int ——》long ——》 float ——》 double

如: short sv = 5;   sv = sv - 2; 在第二步时代码会报错,因为右边的表达式结果类型会自动提升为int类型,此时无法赋值给short型的sv。而如果将sv = sv - 2 ;改为 sv -= 2;则不会报错。因为复核赋值运算符中包含隐式类型装换。即sv -= 2;等价于sv = (short)(sv - 2);因此,如果使用复核赋值运算符时,右侧运算结果超出左侧类型的取值范围则会出现溢出现象导致高位截断。

原文地址:https://www.cnblogs.com/zhlblogs/p/9241311.html

时间: 2024-08-03 23:58:49

java中关于字符串的陷阱的相关文章

Java中的字符串常量池

最近做到一个题目: 问题:String str = new String("abc"),"abc"在内存中是怎么分配的?    答案是:堆,字符串常量区. 题目考查的为Java中的字符串常量池和JVM运行时数据区的相关概念."abc"为字面量对象,其存储在堆内存中.而字符串常量池则存储的是字符串对象的一个引用. Java中的字符串常量池 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid&qu

protobuf在java中的字符串化

最近由于项目需要,大致研究了一下protobuf的java使用.说实话,习惯了C++的protobuf,java用起来真别扭. 由于需要将protobuf序列化后,存入redis,而且redis没法直接存储非字符串的数据,所以我只能想办法将protobuf序列化成字符串. protobuf的java实现里,并没有直接序列化成String类型变量的方法,但是提供了toByteArray()方法,可以序列化成byte[]. 于是乎很容易想到可以这么做: byte[] raw_bytes = prot

Android学习笔记----Java中的字符串比较

用习惯了C#.C++,在做字符串比较时想当然地使用如下语句: 1 string str1 = "abcd", str2 = "abcd"; 2 if(str1==str2) 3 { 4 return true; 5 } 6 else 7 { 8 return false; 9 } 殊不知在Java中,两个String类型的变量,尽管字符相同,使用”==“进行比较,也会返回false. Java中进行字符串比较需采用String类型的equals方法: 1 Strin

JAVA中创建字符串的两种方式的区别

我们知道,通常在Java中创建一个字符串会有两种方式,通过双引号直接赋值和通过构造器来创建. String x = "abcd"; String y = new String("abcd"); 然而,这两种方式之间的区别是什么?分别应用于哪些情况,之前还不是很懂. 1.双引号的方式 String x = "abcd"; String y = "abcd"; System.out.println(x==y);//true Sys

Java中的字符串比较,按照使用习惯进行比较

java中的字符串比较一般可以采用compareTo函数,如果a.compareTo(b)返回的是小于0的数,那么说明a的unicode编码值小于b的unicode编码值. 但是很多情况下,我们开发一款app需要结合“国情”,比如在电话本中,我们希望“李四”排在“zhangsan”的前面,但是如果采用普通的compareTo函数的字符串比较的方式,那么“zhangsan”小于“李四”,由此造成了“zhangsan”的排序先于“李四”. 解决方式是采用java提供的 Collator类. 一.原理

java中判断字符串是否为数字的方法的几种方法

Java中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); i++){ System.out.println(str.charAt(i)); if (!Character.isDigit(str.charAt(i))){ return false; } } return true; } 2.用正则表达式 首先要import java.

java中String字符串的替换函数:replace与replaceAll的区别

例如有如下x的字符串 String x = "[kllkklk\\kk\\kllkk]";要将里面的“kk”替换为++,可以使用两种方法得到相同的结果 replace(CharSequence target, CharSequence replacement)       ——          x.replace("kk", "++") replaceAll(String regex, String replacement)       —— 

为什么Java中的字符串是不可变的?

原文链接:https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ java字符串是不可变的.不可变类只是一个不能修改实例的类.实例创建时所有的信息都被初始化,并且信息不能被修改.不可变类有许多优点.本文总结了字符串为什么被设计成不可变的原因.这说明在记忆的角度不变性的概念,同步和数据结构. 1.字符串池的要求: 字符串池(字符串特定池)是方法区域中的一个特殊存储区域.当创建字符串时,如果字符串已经存在于池中,则将

转载:Java中的字符串常量池详细介绍

引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池,需要的朋友可以参考下 Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new Stri