大家都知道,在JAVA中字符串一旦声明就不可改变,如果尝试修改字符串的内容,将会重新实例化一个新的字符串对象,这也是为了安全性和效率. 由于字符串在程序之中被大量使用,所以JAVA引入了一个字符串常量池,所有被声明的字符串都会保存在字符串常量池中,如果下次使用到同样的字符串,就会从常量池中获取.由于字符串可以用来表示很多重要的信息,例如用户名,密码,URL地址等,如果被引用的字符串可以随意修改,那么这些信息也会变得非常不安全. 但是,反射让这一切发生了变化,字符串并不是一种基本数据类型,他的底层…
0. 前言   如果一个对象,在它创建完成之后不能再改变它的状态,包括对象内的成员变量.基本数据类型的值等等.那么这个对象就是不可变的.众所周知String类就是不可变的.转载请注明出处为SEU_Calvin的博客. 1. String类为什么是不可变的  首先看一下String类的源码中: //JDK1.6 public final class String implements java.io.Serializable, Comparable<String>, CharSequence {…
java中,方法可以访问他的类对象的任何私有特性 读一本书(Core Java for the Impatient)时,发现这个注意,以前的时候没有在意,今天仔细想想发现记忆不深刻.记录一下 下面代码实现了Comparable接口 public class Employee implements Comparable<Employee> { private double salary; @Override public int compareTo(Employee o) { // TODO A…
最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型?不可变对象,顾名思义就是创建后不可以改变的对象,典型的例子就是Java中的String类. 答案一: 相对于可变对象,不可变对象有很多优势:1).不可变对象可以提高String Pool的效率和安全性.如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地…
String类为啥是final的? 我们找到string的jdk源码 1.看到String类被final修饰.这里你就要说出被final修饰的类不能被继承,方法不能被重写,变量不能被修改. 2.看到final修饰的char[]代表了被存储的数据不可更改性.但是:虽然final代表了不可变,但仅仅是引用地址不可变,并不代表了数组本身不会变,请看下面图片 上图说明:数组中的值发生了改变. 上图说明:无论如何修改,数组的地址值不会改变. 综上:所以在这里只有final修饰是不能确保string的不可变…
通过反射获得对象的方法 准备工作: 有一个User类如下 package o1; /** * Created by yesiming on 16-11-19. */ public class User { private int id; private String name // 无参构造方法 public User() { System.out.println("new Instance() 1"); } // 有参构造方法 public User(int id, String n…
--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877236.html "谢谢-- 1.String中的equals和==的区别 String是对象而非基本数据类型,不能使用"=="来判断两个字符串是否相当, 判断两个字符串内容是否相同用equals(); 判断两个字符串内存地址是否相同用"==" 2.startsWith(String str): 判断字符串是否以str为前缀 3.ends…
/// <summary> /// 解析xml字符串 转换为实体类列表数据 /// </summary> /// <param name="xmlStr">xml字符串</param> /// <returns></returns> /// xml字符串格式如下:(Item的节点客户有多对,每对代表一条数据) /// <?xml version="1.0" encoding="u…
第一种:直接赋值 String str =  "hello!" ; 在java中,有一个字符串常量池,对于这种直接赋值的,会直接写进常量池(常量池里面不存在其value,) 自JDK1.7后,常量池也属于堆内存: 所谓的直接赋值,描述的是将一个匿名对象设置一个具体的引用名字 第二种:构造方法 String str = new String("hello!"); 这样会开辟两块堆内存,第一块是由“hello!”这个匿名对象开辟,第二块是new开辟 首先会检查常量池里面…
import java.lang.String; import java.util.Scanner; public class Main { public static void main(String[] args) { //方式一:会创建两个字符串对象(会在字符串常量池中也存一份) String a = new String("dining1"); //[尽量使用这种方式]方式二:最多创建一个字符串对象.(在字符串常量池中找有没有,有则直接指过去,否则创建,然后指过去.) Stri…