Java里的String类为什么是final的】的更多相关文章

今天在看<图解设计模式>,里面出了一个问题“String类用final修饰,导致它无法被继承(扩展),这样做违反了开闭原则,这么做有什么正当理由?” 答案是效率和安全性  首先是效率,由于String类它基本上是最频繁使用的几个类之一,如果使用的不好,会出现很明显的性能问题.所以干脆做成final类的.可以在JVM里做很多优化(比如放在栈中重用),类似的还有StringBuilder,虽然都是操作字符串,但是存放机制和使用场景都不同. 另外再说安全性,引用网上一段段“Java并不是操作系统本地…
一.理解final 望文生义,final意为“最终的,最后的”,我理解为“不能被改变的”,它可以修饰类.变量和方法. 所以我是否可以理解为被它所修饰的类.变量和方法都不能被改变呢?答案是”是“,因为有以下约束条件的存在: 1.final修饰类 被final修饰的类不能被继承,即它不能拥有自己的子类,否在会在编译期间报错.且看下面的例子: 第一步:创建一个用final修饰的父类Father 第二步:创建一个子类Son继承Father 如图所示,我们看到了报警信息,点进去一看,如下图所示: 意思就是…
今天看到一篇名为<Java开发岗位面试题归类汇总>的博客,戳进去看了一下题目,觉得有必要夯实一下基本功了,所以打算边学边以博客的形式归纳总结,每天一道题, 并将该计划称为java问题解读系列,今天的题目是:String类为什么是final的? 在回答这个问题之前,我觉得有必要搞清楚final到底是个什么? 一.理解final 望文生义,final意为“最终的,最后的”,我理解为“不能被改变的”,它可以修饰类.变量和方法. 所以我是否可以理解为被它所修饰的类.变量和方法都不能被改变呢?答案是”是…
String String 被声明为 final,因此不能被继承.(Integer 等包装类也不能被继承) 在 java8 中,String 内部使用 char 数组 来存储数据 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final cha…
Java中的String类知识点 前言 在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 如何创建字符串 最简单的方式 String str = "hello"; 因为字符串属于对象,所以和其它对象一样,可以使用关键字和构造方法来创建 String 对象. String s2 = new String("hello"); 储存位置 String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上. 特性 String…
首先我们使用new创建一个String对象的时候比如: String str=new String("123"); 这句话里面创建了两个对象,第一个在系统中创建了一个"abc"这个字符串: 然后在创一个Str对象,然后在让"123"这个字符串的引用: 创一个String对象相当于创了两个. 在说说为啥String类设置为final类型. fianl类型,是一种不能被修改的类型. 试想,如果我对 str=str.toUpperCase(); 为啥这…
Java常用API(String类) 概述: java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例 1. 字符串不变:字符串的值在创建后不能被更改 String s1 = "abc"; s1 += "d"; System.out.println(s1); // "abcd" // 内存中有"abc","abcd"…
test1: package StringTest; public class test1 { /** * @param args */ public static void main(String[] args){ String a = "a1"; String b = "a"+ 1; System.out.println(a==b); }//true } test2: package StringTest; public class test2 { /** *…
String 类(被final修饰) 字符串是一种特殊的对象,一旦字符串被初始化就不可以被改变了.(内容不变) 例如: String  s = “abc”; String  s1 = new String(“abc”); s在内存中有一个对象, s代表的是一个类类型变量,”abc”是一个对象. s1在内存中有两个对象,分别是new出来的和:  “abc” . s == s1;的结果是false.   因为s和s1它们所对应的地址不同,比较的两个地址,s和s1中存储的地址数值是不同的.因此是fal…
1.String类是不可变类,一旦一个String对象被创建以后,包含在这个对象中的字符序列式不可改变的,直至这个对象被销毁. String s1 = "java"; s1 = s1 + "android"; s1 = s1 + "mysql"; 1)上面三个语句使用了3个字符串直接量之外,还会额外生成2个字符串直接量,"javaandroid","javaandroidmysql":程序中的s1依次指向3…
String类 字符串是不可变的,对其做的任何改变,会生成一个对象,不会改变有原有对象. ==和equals() String s1 = "good"; String s2 = "good"; if (s1 == s2) {} // true 这种直接把字符串赋值给对象的情况,是存储在常量池里的,指向同一个地址 // another example String s1 = "good"; String s2 = new String("…
String类是Java中的一个不可变类(immutable class). 简单来说,不可变类就是实例在被创建之后不可修改. 在<Effective Java> Item 15 中提到了为了使类成为不可变,需要遵循的五条规则: 不要提供任何会修改对象状态的方法. 保证类不会被扩展. 使所有的域都是final的. 使所有域都成为私有的. 确保对于任何可变组件的互斥访问. 不可变类有许多优点,不可变类比可变类更加易于设计.实现和使用,不容易出错,且更加安全. Java把String类设计为不可变…
不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的. Java对String类的定义: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // 省略... } final修饰符的用法: 1.修饰类 当用final修饰一个类时,表明这个类不能被继承.final类中的成员变量可以根据需要设为final,但是要注意final类中的…
前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的.其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基本数据类型一样使用,声明与初始化等操作都是相同的,是程序经常处理的对象,所以学好String的用法很重要. 一.创建字符串 在Java中用String类的构造方法来创建字符串变量,常用构造方法如下: 1. 使用String()方法初始化一个新创建的String对象. String s = new S…
Java.lang.String类是final类型的,因此不可以继承这个类.不能修改这个类.String是一个类不属于基本数据类型. 可以从源码中看到,String是一个final类型. String被设计成不可变(immutable)类,所以它所有的对象都是不可变对象. String为什么设计成不可变? String不可变的原因包括: 设计考虑,效率优化问题,以及安全性这三大方面 (以下根据查询的资料,做一份精简化的总结) 1. 字符串常量池的需要:字符串常量池(String pool, St…
Java中String类细节问题 (考察点Java内存分配问题) 1. String str1 = "abc";   System.out.println(str1 == "abc"); 步骤: 1) 栈中开辟一块空间存放引用变量str1, 2) String池中开辟一块空间,存放String常量"abc", 3) 引用str1指向池中String常量"abc", 4) str1所指代的地址即常量"abc"…
转载请注明出处: jiq•钦's technical Blog - 季义钦 String的不可变性 Java规定String是不可变的(immutable).事实上这个不可变具备两层含义: 1 内容不可变 不论什么看起来改动它们的操作.实际上都是又一次new出一个对象. String s = new String("111"); String newS = s; newS = "dsfsd"; System.out.println(s); //111 假设不能做到内…
String类 Java程序中的所有字符串字面值(如 "abc" )都是String的实例 字符串是常量(因为 String 对象是不可变的,所以可以共享) 字符串的本质是字符数组:private final char value[]; 创建字符串常用的方式 public class CreateString { public static void main(String[] args) { // 直接定义字符串 String str1 = "虎老狮"; // n…
/*String类用于描述字符串事物的那么它就提供了多个方法对字符串进行操作 方法都会用,字符串这块就结束了常见的操作有哪些?“abcd”它应该具备什么功能,我们才能更好得操作它?1.获取(必须要掌握)   1.1 字符串中包含的字符数,也就是字符串的长度   int length()  然而数组也有长度,数组调用的length没有括号,是属于属性,但是字符串是方法   1.2 根据位置获取位置上的某个字符   char charAt(int index)   1.3 根据字符获取该字符在字符串…
链接地址:http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前的Java基础系列中讨论了Java最核心的概念,特别是面向对象的基础.在Java进阶中,我将对Java基础进行补充,并转向应用层面. 大部分编程语言都能够处理字符串(String).字符串是有序的字符集合,比如"Hello World!"…
字符串广泛应用在Java编程中,在Java中字符串属于对象,String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等. String 类的常用方法: 注意事项: 1. 字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1 2. 使用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引:如果没有匹配结果,返回 -1 3. 使用 substring(beginIndex , endIndex…
在java语言中,String类具有不可变性,即常量字符串不可更改.下面的一个小例子简单演示相关概念. public class test { public static void main(String []args){ String str1="hello"; System.out.println(str1); tell(str1); System.out.print(str1); } public static void tell(String str) { str="…
2017-11-02 20:02:06 String:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因为 String 对象是不可变的,所以可以共享. *常用方法 String值不能被改变的理解 String s = "Hello"; s += "world"; System.out.println(s); 这里的“Hello”,“…
[前面的话] 毕业将近6个月了,试用期也快要过去了,期待接下来的日子.在金融类性质的机构,最痛苦的是也许就是大部分系统外包,所以比较少写代码,在这六个月中只写了1个月左右的代码,然后每天都在做一些比较杂的事情,希望有机会可以写一写代码,提高技术. 前段时间做了一下开发,最近马上也要过年了,时间相对就比较多了,所以又回过头来看看书,巩固一下基础知识,做一些笔记,看看自己的思维,主要目的是为了自己积累,所以都是很基础.很基础的知识,请自行选择.如果看到这里要走了,祝新年快乐,也不枉进来一趟. [知识…
String类包含在java.lang包中.这个包会在Java启动的时候自动import,所以可以当做一个内置类(built-in class).我们不需要显式的使用import引入String类. 创建字符串 我们之前使用类来创建对象.需要注意的时候,创建String类对象不需要new关键字.比如: public class Test{ public static void main(String[] args){ String s = "Hello World!"; System.…
标签(空格分隔): String类 String 的概述 class StringDemo{ public static void main(String[] args){ String s1="abc";//s1是一个类型变量,abc是一个对象, //字符串最大的特点,一旦被初始化就不可以改变, //s1="kk";//这时候是s1的指向变了,并不是abc String s2=new String("abc"); System.out.prin…
一.定义 就是由多个字符组成的一串数据.也可以看成是一个字符数组. 注意: 1.字符串是常量:它们的值在创建之后不能更改.为什么? 意思就是说字符串确定了,就会在常量池中生成这个字符串. 所以说它的值不能改变.但是字符串的引用能改变,换句话说, 你要改变字符串的"值",只需将字符串的引用指向常量池中其他值的引用就可以了 //字符串演示 String str = "我是第一个字符串"://常量池中产生"我是第一个字符串",它的内容已经固定,不能改变…
1.为了安全 java 必须借助操作系统本身的力量才能做事,jdk提供的很多核心类比如String,这类内的很多方法 都不是java编程语言本身编写的,很多方法都是调用操作系统本地的api,如果被继承的话,被重写了, 往操作系统内部写入一段具有恶意袭击性质的代码,这不就成核心病毒了 不想被修改,就像工具类一样,其实也是为了安全 2.性能…
String 本身一个对象,对象在jvm启动的时候就要实例化和其他类调用就要实例化,第一性能,第二安全,因为string的高频繁的使用,如果被继承,哪里性能将会大大降低,因为不能被继承,换句话来说就比较独立,也就安全. string里的方法都是final的 ,所有不需要实例化就可以使用String的方法,Java编译器会寻找机会内联(inline)所有的final方法,这个可以提升性能. 引用: http://www.cnblogs.com/ikuman/archive/2013/08/27/3…
之前老师在课堂上讲过关于Java的引用,但是很遗憾,木有认真听啊,所以就在学习Java的过程中迷惑迷惑...最近好像明白一点Java的引用是怎么回事了.以下仅是我个人的理解,如果不对,还请不吝赐教. 一.String String创建的String对象会放入到一个String池子里,对于一些可以共享的字符串对象,会先在String池子中查找是否存在相同的String内容(字符相同),如果有就直接返回,而不是直接创建一个新的String对象,以减少内存的耗用. String s1 = "Hello…