精华内容
下载资源
问答
  • 我们知道在Java中,String是不可变的、final的。Java在运行时也保存了一个字符串池(String pool),这使得String成为了一个特别的类。 主要是为了 “ 效率 ” 和 “ 安全性 ” 的缘故。 若 String 允许...

    String是所有语言中最常用的一个类。我们知道在Java中,String是不可变的、final的。Java在运行时也保存了一个字符串池(String pool),这使得String成为了一个特别的类。

    主要是为了 “ 效率 ”  “ 安全性 ” 的缘故。  String 允许被继承由于它的高度被使用率可能会降低程序的性能,所以 String 被定义成 final

     

    一:String 和其他基本类型不同 , 他是个对象类型既然是对象类型 , 如果是在静态方法下是必须调用静态方法或值的 , 如果是非静态的方法 , 就必须要实例化.

     

    main 函数是个 static 所以String 要能像其他的基本类型一样直接被调用这也是为什么在 main 函数下使用 String 类型不会报告错误的原因..

     

    一下就解释了两个心里的疑问..

     

    以前一直觉得奇怪 ,为什么 String 是对象类型在 main 函数下却是不需要实例化的再次佩服 java 设计人员想得真周到.

     

    二:当定义 String 类型的静态字段(也成类字段),可以用静态变量(非 final)代替常量(final)加快程序速度。 反之,对于原始数据类型,例如 int,也成立。

     

    例如,你可能创建一个如下的 String 对象:

     

    Privatestatic final Stringx="example";

    对于这个静态常量(由 final 关键字标识),你使用常量的每个时候都会创建一个临时的 String 对象。 在字节代码中,编译器去掉 ”x”,代替它的是字符串 “example”, 以致每次引用 ”x”  VM 都会进行一次哈希表查询。

     

    相比之下,度于静态变量 (  final 关键字 ),字符串只创建一次。 仅当初始化 “x” 时, VM 才进行哈希表查询。

     

    还有另一个解释 :

    带有 final 修饰符的类是不可派生的。  java 核心 API 中,有许多应用 final 的例子,例如 java.lang.String  String 类指定 final 防止了人们覆盖 length() 方法。

     

    另外,如果指定一个类为 final,则该类所有的方法都是 final java 编译器会寻找机会内联(inline)所有的 final 方法(这和具体的编译器实现有关)。 此举能够使性能平均提高 50%

     

    示例:

     

    publicclassTest{

    publicstaticvoidmain(String[]args){

    //

    }

    }

    如果 String 不是 final 那么就可以继承

     

    publicclassString2extendsString{

    //..

    //...

    }

    那我们的 main 也就可以写成

     

    publicclassTest{

    publicstaticvoidmain(String2[]args){//注意此处

    //

    }

    }

    英文参考:http://forums.sun.com/thread.jspa?threadID=636414

     

    另外补充一点:

    作用就是 final的类不能被继承,不能让别人继承有什么好处?

     

    意义就在于,安全性,如此这般:

    java 自出生那天起就是“为人民服务”,这也就是为什么java做不了病毒,也不一定非得是病毒,反正总之就是为了安全, 人家java的开发者目的就是不想让 java干这类危险的事儿,java并不是操作系统本地语言, 换句话说java必须借助操作系统本身的力量才能做事,JDK中提供的好多核心类比如 String,这类的类的内部好多方法的实现都不是java编程语言本身编写的, 好多方法都是调用的操作系统本地的API,这就是著名的“本地方法调用”,也只有这样才能做事,这种类是非常底层的, 和操作系统交流频繁的,那么如果这种类可以被继承的话,如果我们再把它的方法重写了,往操作系统内部写入一段具有恶意攻击性质的代码什么的, 这不就成了核心病毒了么?

     

    上面所述是最重要的,另外一个方面,上面2位老兄说的也都很对, 就是不希望别人改,这个类就像一个工具一样,类的提供者给我们提供了, 就希望我们直接用就完了,不想让我们随便能改,其实说白了还是安全性, 如果随便能改了,那么java编写的程序肯定就很不稳定,你可以保证自己不乱改, 但是将来一个项目好多人来做,管不了别人,再说有时候万一疏忽了呢?他也不是估计的, 所以这个安全性是很重要的,javaC++相比,优点之一就包括这一点;

     

    原因绝对不只有这么多,因为如果这些个核心的类都能被随便操作的话,那是很恐怖的,会出现好多好多未知的错误,莫名其妙的错误….

     

    String类不可变性的好处

     

    只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现(译者注:String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。

     

    如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。

     

    因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。

     

    类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏。

     

    因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串 

    展开全文
  • android设置EditText为不可编辑状态

    万次阅读 多人点赞 2018-05-10 18:50:41
    最近做一个项目,需要动态设置EditText为不可编辑状态,根据某些条件判断,设置EditText为可编辑状态: eidtext.setFocusableInTouchMode(false);//不可编辑 eidtext.setKeyListener(null);//不可粘贴,长按不会弹...

    最近做一个项目,需要动态设置EditText为不可编辑状态,根据某些条件判断,设置EditText为可编辑状态:

            eidtext.setFocusableInTouchMode(false);//不可编辑
            eidtext.setKeyListener(null);//不可粘贴,长按不会弹出粘贴框
            eidtext.setClickable(false);//不可点击,但是这个效果我这边没体现出来,不知道怎没用
            secend_eidtext.setFocusable(false);//不可编辑

    网上查了很多,但是这些都存在一个问题就是长按之后会弹出粘贴框,之后:

            eidtext.setKeyListener(null);//不可粘贴,长按不会弹出粘贴框

    任然存在问题,虽然这些设置后,编辑框下面会存在一条横线:

    最后找到了,解决问题的办法,只需简单设置:

            eidtext.setEnabled(false);

    完美的达到了我所需要的效果

    展开全文
  • 可以成功设置不可编辑; 但是,直接使用UE.getEditor('editor').setEnabled()后并不能使得编辑框可以编辑,处理多次还是有问题; 自己经过测试,亲测以下方法可用。。。 即,重新新建一个,然后设置可用即可。...

    直接用用官方方法,UE.getEditor('editor').setDisabled('fullscreen');

    可以成功设置不可编辑;

    但是,直接使用UE.getEditor('editor').setEnabled()后并不能使得编辑框可以编辑,处理多次还是有问题;

    自己经过测试,亲测以下方法可用。。。

    即,重新新建一个,然后设置可用即可。。。

     

    展开全文
  • String类不可变以及不可变类总结

    千次阅读 2017-10-01 20:11:38
    String类在java中是immutable(不可变),因为它被关键字final修饰。... 要了解String类创建的实例什么不可变,首先要知道final关键字的作用:final的意思是“最终,最后”。final关键字可以修饰类、方法...

          String类在java中是immutable(不可变),因为它被关键字final修饰。当String实例创建时就会被初始化,并且以后无法修改实例信息。String类是工程师精心设计的艺术品。

    一、String为什么不可变?

           要了解String类创建的实例为什么不可变,首先要知道final关键字的作用:final的意思是“最终,最后”。final关键字可以修饰类、方法、字段。修饰类时,这个类不可以被继承;修饰方法时,这个方法就不可以被覆盖(重写),在JVM中也就只有一个版本的方法--实方法;修饰字段时,这个字段就是一个常量。

            查看java.lang.String方法时,可以看到:

    /**
     * The String class represents character strings. All string literals in Java programs, such as "abc",
     * are implemented as instances of this class.
    */
    public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
       ...
    }

    "The String class represents character strings"意思是String类表示字符串;String类被关键字final修饰,可以说明它不可被继承;从"private final char value[]"可知,String本质上是一个char数组

            String类的成员字段value是一个char[]数组,而且也是用final关键字修饰,被final关键字修饰的字段在创建后其值是不可变的,但也只是value这个引用地址不可变,可是Array数组的值却是可变的,Array数组数据结构如下图所示:

    从图中可以看出,Array变量只是栈上(stack)的一个引用,数组中的数据存储在堆上(heap)。String类里的value是用final修饰,只能说在栈上(stack)这个value的引用地址不可变,可没说堆里的Array本身数据不可变。看下面这个例子:

    final int[] value = {1,2,3,4,5};
    int otherValue = {6,7,8,9,10};
    value = otherValue;//编译报错

    value是被final关键字修饰的,编译器不允许把value指向堆另外一个地址;但如果直接对数组元素进行赋值,就允许;如下面这个例子:

    final int[] value  = {1,2,3,4,5};
    value[0] = 0;

            所以说String是不可变,在后面所有的String方法里没有去动Array中的元素,也没有暴露内部成员字段。private  final char value[],private的私有访问权限的作用都比final大。所以String是不可变的关键都是在底层实现的,而不是一个简单的final关键字。

    二、String类实例不可变的内存结构图

            String类实例不可变很简单,如下图所示是String类实例不可变的内存结构图:

     

    有一个字符串s的值为"abcd",它再次被赋值为"abcdef",不是在原堆的地址上修改数据,而是重新指向一个新的对象,新的地址。

    三、字符串常量池

            字符串常量池是方法区(Method Area)中一个特殊的存储区域。当一个字符串被创建时,如果这个字符串的值已经存在String pool中,就返回这个已经存在的字符串引用,而不是创建一个新的对象。下面的代码只会在堆中创建一个对象:

    String name="abcd";
    String userName="abcd";

    这样在大量使用字符串的情况下,可以节省内存空间,提高效率。但之所以能实现这个特性,String的不可变性是最基础的一个必要条件。

    四、String类不可变有什么好处?

        最简单的就是为了安全和效率。从安全上讲,因为不可变的对象不能被改变,他们可以在多个线程之间进行自由共享,这消除了进行同步的要求;从效率上讲,设计成final,JVM才不用对相关方法在虚函数表中查询,而是直接定位到String类的相关方法上,提高执行效率;总之,由于效率和安全问题,String被设计成不可变的,这也是一般情况下,不可变的类是首选的原因。

    五、不可变类

            不可变类只是它的实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例时就提供,并在对象 的整个生命周期内固定不变。String、基本类型的包装类、BigInteger和BigDecimal就是不可变得类。

            为了使类成为不可变,必须遵循以下5条规则:①不要提供任何会修改对象状态的方法②保证类不会被扩展③使所有的域都是final④使所有的域都成为私有的⑤确保 对于任何可变组件的互斥访问。如果类具有指向可变对象的域,则必须确保该类的客户端无法获得指向这些对象的引用。

    六、不可变类的优点和缺点

            不可变类实例不可变性,具有很多优点。①不可变类对象比较简单。不可变对象可以只有一种状态,即被创建时的状态。②不可变对象本质上是线程安全的,它们不要求同步。当多个线程并发访问这样的对象时,它们不会遭到破坏。实际上,没有任何线程会注意到其他线程对于不可变对象的影响。所以,不可变对象可以被自由地分配。“不可变对象可以被自由地分配”导致的结果是:永远不需要进行保护性拷贝。③不仅可以共享不可变对象,甚至也可以共享它们的内部信息。④不可变对象为其他对象提供了大量的构件。如果知道一个复杂对象内部的组件不会改变,要维护它的不变性约束是比较容易的。

            不可变类真正唯一的缺点是,对于每个不同的值都需要一个单独的对象。创建这种对象的代价很高。

    七、如何构建不可变类?

            构建不可变类有两种方式:用关键字final修饰类让类的所有构造器都变成私有的或者包级私有的,并添加公有的静态工厂来替代公有的构造器

            为了具体说明用静态工厂方法来替代公有的构造器,下面以Complex为例:

    //复数类
    public class Complex{
        //实数部分
        private final double re;
        //虚数部分
        private final double im;
        //私有构造器
        private Complex(double re,double im){
            this.re = re;
            this.im = im;
        }
        //静态工厂方法,返回对象唯一实例
        public static Complex valueOf(double re,double im){
            return new Complex(re,im);
        }
        ...
    }

          不可变的类提供一些静态工厂方法,它们把频繁请求的实例缓存起来,从而当现在实例符合请求的时候,就不必创建新的实例。使用这样的静态工厂方法使得客户端之间可以共享现有的实例,而不是创建新的实例,从而减低内存占用和垃圾回收的成本。

           总之,使类的可变性最小化。不要为每个get方法编写一个相对应的set方法,除非有很好的理由要让类成为可变的类,否则就应该是不可变的。如果有些类不能被做成是不可变的,仍然应该尽可能地限制它的可变性。不可变的类有很多优点,但唯一的缺点就是在特定的情况下存在潜在的性能问题。

     

    PS:静态工厂方法是什么?

    静态工厂方法只是一个返回类的实例的静态方法,如下面是一个Boolean的简单实例。这个方法将boolean基本类型值转换成一个Boolean对象引用。

    public static Boolean valueOf(boolean b){
        return b?Boolean.TRUE?Boolean.FALSE;
    }

    静态工厂方法相对于构造器来说,具有很多优势:

     

    创建的方法有名字

    不必在每次调用它们的时候都创建一个新的对象

    可以返回原返回类型的任何子类的对象。这样我们在选择返回对象的类时就有更大的灵活性,这种灵活性的一种应用是API可以返回对象,同时又不会使对象的类变成公有的。以这种方式隐藏实现类会使API变得非常简洁,这项技术适用于基于接口的框架。

    在创建参数化类型实例时,它们使代码变得更加简洁。编译器可以替你找到类型参数,这被称为类型推导。如下面这个例子

    public static<k,v> HashMap<k,v> newInstance(){
        return new HashMap<k,v>();
    }

    静态工厂方法也有缺点:

    类如果不含公有的或者受保护的构造器,就不能被子类化。对于公有的静态工厂方法所返回的非公有类也同样如此。

    它们与静态方法实际上没有什么区别

    简而言之,静态工厂方法和公有构造器都各有用处,我们需要理解它们各自的长处。结合实际情况,再做选择。

     

     

    参考文章:Why String is immutable in Java?

                      在java中String类为什么要设计成final?程序员--知乎

    展开全文
  • 【数据库】快速理解脏读、不可重复读、幻读

    万次阅读 多人点赞 2018-08-14 19:24:29
    快速理解脏读、不可重复读、幻读? 理解这三种由于并发访问导致的数据读取问题,再理解事务隔离级别就简单多了。 【1】脏读(读取未提交数据) A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行...
  • 描述: 打开cmd,输入java,java -version没有问题,但是javac提示不是内部命令 问题排查: 找到java安装下的bin目录,运行cmd,输入javac,能提示,说明环境配置有问题 ...看看java 相关的java相关路径有没有...
  • Java中的String什么是不可变的?

    万次阅读 多人点赞 2018-09-03 21:27:55
    与其问String什么是不可变的,还不如问String类是如何实现其对象不可变的。 什么是不可变对象?  如果一个对象它被创建后,状态不能改变,则这个对象被认为是不可变的。 String是如何实现其对象不可变?  ...
  • Bootstrap 不可编辑的控件

    千次阅读 2018-03-07 09:51:10
    Bootstrap中,允许任何标签添加 .uneditable-input 类,来创建不可编辑的控件。如,使用 &lt;span&gt; 标签创建一个不可编辑的文本输入框,让它看上去像个文本输入框,但实际上不是文本输入框,也不可编辑...
  • 字符串在Java中是不可变的,因为String对象缓存在String池中。由于缓存的字符串在多个客户之间共享,因此始终存在风险,其中一个客户的操作会影响所有其他客户。例如,如果一段代码将String “Test”的值更改...
  • android EditTextView 设置不可输入不可点击,其实很简单: // 允许输入 editTextView.setEnabled(true); // 禁止输入 editTextView.setEnabled(false);
  • Java不可变对象

    千次阅读 2017-01-12 13:45:46
    一、不可变类简介 不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。...说完可变类和不可变类的区别,我们需要进一步了解什么要有不可变类?这样的特性对JAVA
  • python精讲 不可变对象与可变对象

    千次阅读 2020-07-22 15:46:35
    文章目录对象可变对象与不可变对象可变对象不可变对象 对象 Python 中的变量不是装有对象的“容器”,而是贴在对象上的“标签”。 真正的存贮位置是内存中 在python中,可变对象包括:list、set、dict、自定义对象...
  • js设置div不可点击

    万次阅读 2019-04-18 09:38:30
    css: .notclick{ pointer-events: none; } js: $("#divID"/".divClass").addClass("notclick");//设为不可点击 $("#divID"/".divClass").removeClass("notclick");//移除不可点击
  • CheckBox设置不可点击

    万次阅读 2017-12-29 16:55:42
    checkbox 设置为不可点击(当外面布局有点击事件与checkbox冲突时使用) 在 xml 文件 checkbox 属性中加入: android:enabled="false"   更多好内容戳下面: https://blog.csdn.net/wuqingsen1...
  • input框不可编辑的三种方法

    万次阅读 2019-04-04 09:59:32
    被禁用的 input 元素,不可编辑,不可复制,不可选择,不能接收焦点,后台也不会接收到传值。设置后文字的颜色会变成灰色。 EP:<input type="text" disabled="disabled" /> *disabled 属性无法与 <input ...
  • Python的可变与不可变数据类型

    万次阅读 多人点赞 2015-11-16 13:13:19
    python的可变与不可变数据类型
  • 1.首先来说button按钮不可点击 1.1第一种(html代码中控制) <button id="button_id" disabled="disabled">按钮不可点击</button> 1.2第二种(jquery控制) $("#button_id").attr('disabled',true....
  • Google-Guava学习:不可变集合

    万次阅读 2017-01-12 09:48:43
    不可变对象有很多优点,包括: 当对象被不可信的库调用时,不可变形式是安全的; 不可变对象被多个线程调用时,不存在竞态条件问题 ...JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但我
  • python中不可变数据类型和可变数据类型

    万次阅读 多人点赞 2019-05-29 17:43:15
    不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。 可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存...
  • String不可变很简单,如下图,给一个已有字符串“abcd”第二次赋值"abced",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。 2.String什么不可变? 翻开JDK源码,java.lang.String类起手前三行...
  • 设置textarea不可拖动

    万次阅读 2016-11-07 17:45:45
    默认情况下,我们将鼠标移动到textarea的右下角时发现文本域是可以通过拖动的方式改变其大小的,这会影响我们原本的页面布局。 若想设置其不可拖动,可其添加如下属性:;"></textarea>
  • mac上安装目录不可写,其实是权限问题。 问题:安装时显示,目录不可写。 mac目录不可写,mac修改文件权限,mac修改权限命令 /install 目录不可写,请检查后再试 /runtime 目录不可写,请检查后再...
  • 97-ICMP 协议(端口不可达)

    万次阅读 2017-05-23 10:38:29
    ICMP 端口不可达是差错报文中的一种,它的类型(type)是 3,代码(code)也是 3. 1. 差错报文首部格式 图1 差错报文首部 2. 实验 打开我们之前写的 ICMP 报文接收程序 程序托管在 gitos 上:...
  • 可重入锁和不可重入锁的区别

    万次阅读 2020-10-22 21:40:16
    不可重入锁示例(同一个线程不可以重入上锁后的代码段) 如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁...
  • (1)点击 CheckBox使得输入框可以使用,否则灰色能使用 过期时间: 相应的js函数: function doDisabled(checked) { if(checked){ $("#e
  • 一、设置不可编辑且有点击事件 二、设置不可编辑且无点击事件 三、设置可编辑 四、源代码 4.1 XML布局 4.2 Java代码 五、小结 一、设置不可编辑且有点击事件 public void setCanNotEditAndClick(View ...
  • 介绍数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性。 事务的4大特性(ACID):原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不...
  • HTML灰色不可编辑文本框

    万次阅读 2012-11-11 20:15:45
    将HTML文本框设为不可编辑文本框。   方法1: onfocus=this.blur() 方法2:readonly 方法3: disabled   让文本框变灰不可输入: 不可输入还可以用上述三种方法
  • 线性可分 线性不可

    千次阅读 2017-12-05 15:21:11
    如果数据不是线性分的,我们就必须要采用一些特殊的方法,比如SVM的核技巧把数据转换到更高的维度上,在那个高维空间数据更可能是线性分的(Cover定理)。理论上一定能在更高的维度把数据线性分。何为线性
  • 设置Input文本框变成不可编辑

    千次阅读 2018-03-19 23:47:17
    方法:使用blur()使输入框失去焦点---...特点:第一种方式:文本框的内容不仅不能修改,也不能复制第二种方式:文本框的内容文字会变色,不可编辑,可以复制第三种方式:文本框的内容不会变色,不可编辑,可以复制。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,751,830
精华内容 3,900,732
关键字:

不为不可成不求不可得