精华内容
下载资源
问答
  • 接近“自定义”运算符重载Java的唯一方面就是处理string的+,这或者导致了常量的编译时间连接,或者使用StringBuilder / StringBuffer导致了执行时间连接。 你不能定义你自己的操作符,但是它们的行为方式是一样...

    不,Java不支持用户定义的运算符重载。 接近“自定义”运算符重载的Java的唯一方面就是处理string的+,这或者导致了常量的编译时间连接,或者使用StringBuilder / StringBuffer导致了执行时间连接。 你不能定义你自己的操作符,但是它们的行为方式是一样的。

    对于支持运算符重载的类Java(和基于JVM的)语言,您可以看看Groovy 。 或者,您可能会发现Java编译器插件解决scheme的运气。

    运算符重载在Java中用于串联stringtypes:

    String concat = "one" + "two";

    但是,您不能定义自己的操作符重载。

    除了所有的人指出+为string重载外, -对于浮点和整数操作也是重载的,就像*和/ 。

    %也是浮点重载的,对于那些C或C ++背景的人来说,这可能有些让人吃惊。

    Java不允许运算符重载。 首选的方法是在您的类上定义一个方法来执行该操作: a.add(b)而不是a + b 。 你可以在这里看到C语言中剩下的其他位的摘要: 特性从C和C ++中删除

    你不能自己做这个,因为Java不允许操作符重载。

    但是有一个例外。 对于String对象, +和+ =被重载。

    可以尝试Java运算符重载 。 它有它自己的限制,但是如果你真的想要使用操作符重载,那么值得一试。

    只需使用Xtend和Java代码即可。 它支持运算符重载:

    package com.example; @SuppressWarnings("all") public class Test { protected int wrapped; public Test(final int value) { this.wrapped = value; } public int operator_plus(final Test e2) { return (this.wrapped + e2.wrapped); } } package com.example class Test2 { new() { val t1 = new Test(3) val t2 = new Test(5) val t3 = t1 + t2 } }

    在官方网站上,有一个为每个操作员实施的方法列表!

    正如其他许多人所回答的:Java不支持用户定义的操作符重载。

    也许这是脱离主题,但我想评论一些事情,我读了一些答案。

    关于可读性。

    比较:

    c = a + b

    c = a.add(b)

    再看一遍!

    哪一个更可读?

    允许创build用户定义types的编程语言应该允许它们以与内置types(或基本types)相同的方式进行操作。

    所以Java打破了generics编程的一个基本原则:

    我们应该能够将内置types的对象与用户定义types的对象进行交换。

    (你可能想知道:“他说了'内置的东西'吗?”是的, 看这里) 。

    关于string连接:

    math家使用symnol +进行交换操作。

    所以我们可以肯定a + b = b + a。

    string连接(在大多数编程语言中)并不尊重这种常见的math符号。

    a := "hello"; b := "world"; c := (a + b = b + a);

    或在Java中:

    String a = "hello"; String b = "world"; boolean c = (a + b).equals(b + a);

    额外:

    注意Java中的平等和身份是如何混淆的。 ==(相等)符号表示:

    一个。 平等原始types

    湾 用户定义types的身份检查,因此,我们被迫使用equals() 函数进行相等。

    但是…这与操作符重载有什么关系?

    如果语言允许运算符重载,则可以给相等运算符赋予适当的含义。

    或者,您可以创buildJava Groovy,并只是重载这些函数来实现您想要的

    //plus() => for the + operator //multiply() => for the * operator //leftShift() = for the << operator // ... and so on ... class Fish { def leftShift(Fish fish) { print "You just << (left shifted) some fish " } } def fish = new Fish() def fish2 = new Fish() fish << fish2

    谁不想成为/使用groovy? :d

    不,你不能像Java一样使用编译好的groovy JAR。 它仍然是Java的编译器错误。

    展开全文
  • 1,JAVA不具备C++和C#一样的重载运算符来实现类与类之间相互计算 的功能  这其实一定程度上让编程失去了代码的灵活性,但是个人认为,这在一定程度上减少了代码异常的概率  如果可以重载运算符,当你没看见一个...

    1, JAVA 不具备 C++ 和 C# 一样的重载运算符 来实现类与类之间相互计算 的功能

        这其实一定程度上让编程失去了代码的灵活性, 但是个人认为,这在一定程度上减少了代码异常的概率

        如果可以重载运算符,当你没看见一个运算的时候,你都会怀疑这是不是调用了某个方法(个人意见)

    2,String 类型加法的实现方式,其实是一个语法糖,正确的执行方式为 括号内的内容

       String a = 'a';

       String b = 'b';

       String c = a + b;    ( String c = (new StringBuilder(String.valueOf(a))).append(b).toString();   )

    3,由于 String 类型的不可变性,每一次字符串的拼接都会实例化一个 StringBuilder 类,相当消耗性能

          推荐字符串拼接在单线程的时候,使用 StringBuilder  多线程使用 Stringbuffer 来提高字符串拼接的性能

    4,String 类型不可变的原因

    4.1,设计上的考虑:JAVA 常量池的需要

    4.2,性能上的考虑: java中String对象的哈希码被频繁的使用,比如在HashMap的容器中,字符串不变性保证了hash码的唯一性,

       因此可以放心的进行缓存,这也是一种性能优化手段,意味着不必每次都取计算新的哈希码

    4.3,安全性的考虑:String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,

       还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。

    5、String类不可变的好处

    5.1,只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字 符串。

       但如果字符串是可变的,那么String interning 将不能实现(译者注:String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),

            因为这样的话,如果变量改变了它的值,那么,其它指向这个值的变量 的值也会一起改变。

    5.2,如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连 接,或者在socket编程中,

       主机名和端口都是以字,符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符 串指向的对象的值,造成安全漏洞。

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

    5.4,类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,

       那么会对你的数据库造成,不可知的破坏。

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

       这就是 HashMap 中的键往往都使用字符串。

    转载于:https://www.cnblogs.com/lovling/p/9961655.html

    展开全文
  • 编辑:有人提到std :: complex是一个比std :: string更好的例子,用于“好用”运算符重载,所以我也包括一个例子:std::complex c;c = 10.0;c += 2.0;c = std::complex(10.0, 1.0);c = c + 10.0;除了构造函数语法之外,...

    编辑:有人提到std :: complex是一个比std :: string更好的例子,用于“好用”运算符重载,所以我也包括一个例子:

    std::complex c;

    c = 10.0;

    c += 2.0;

    c = std::complex(10.0, 1.0);

    c = c + 10.0;

    除了构造函数语法之外,它的外观和行为与任何其他内置类型一样.

    主要的专业是你可以创建像内置类型一样的新类型.一个很好的例子是c中的std :: string(参见上面的更好的例子).这是在库中实现的,不是基本类型.但你可以写下这样的东西:

    std::string s = "hello"

    s += " world";

    if(s == "hello world") {

    //....

    }

    缺点是容易滥用.运算符重载的选择不当可能导致意外低效或不清楚的代码.想象一下,如果std :: list有一个operator [].你可能想写:

    for(int i = 0; i < l.size(); ++i) {

    l[i] += 10;

    }

    这是一个O(n ^ 2)算法!哎哟.幸运的是,std :: list没有operator [],因为它被认为是一个有效的操作.

    展开全文
  • String + 运算符重载 如上图:String 字符相加源码javap -c 反编译后发现 sql...java底层已经自动做了运算符重载但并不推荐使用String + 的运算符重载 eg: String + 运算符重载的时候每次都会在内存中开辟String

    String + 运算符重载
    这里写图片描述
    如上图:String 字符相加源码

    这里写图片描述

    javap -c 反编译后发现 sql = sql + “aa”; 反编译成new StringBuilder(“”).append(“aa”).toString();

    java底层已经自动做了运算符重载

    但并不推荐使用String + 的运算符重载
    eg:
    这里写图片描述
    String + 运算符重载的时候每次都会在内存中开辟StringBuilder对象的空间,不仅耗时,而且耗费内存,所以建议以后字符拼接时用StringBuilder() ,StringBuffer()里面有线程安全锁,所以比较慢一些。

    展开全文
  • Java没有运算符重载

    千次阅读 2012-09-12 23:53:22
    在程序中有时候需要使用重载运算符来做一些对象之间的运算,比如复数的计算,还有字符串的运算 例如:把字符串abc和字符串def拼接成abcdef 使用Java中的String类拼接字符串代码为:  String str1 = "abc"; String ...
  • 黑马程序员_Java没有运算符重载

    千次阅读 2015-04-21 21:26:21
    在程序中有时候需要使用重载运算符来做一些对象之间的运算,比如复数的计算,还有字符串的运算 例如:把字符串abc和字符串def拼接成abcdef 使用Java中的String类拼接字符串代码为:  String str1 = "abc"; ...
  • 重载运算符

    2019-03-02 18:15:40
    import java.util.Scanner; public class problem8 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); int m=sc....
  • JAVA提供的“+”运算符,如Iteger+String,从C++的角度来看总是想找到JAVA是怎么重载这个“+”运算符,于是进去String这个类中看,然而并没有什么卵发现,于是乎想着JAVA是怎么做到的?下面来为你逐步分析下JAVA是...
  • 重修Java——运算符

    2016-10-16 23:49:00
    Java运算符Java中有以下几类运算符: 1. 算术运算符 2. 关系运算符 ...除此之外,String类支持“+”和“+=”,我想大概是因为String使用的频率太多的原因,所以才有了“+”运算符重载。  那
  • JavaString字符串运算符"+"重载分析

    千次阅读 2018-04-12 21:57:00
    重载运算符“+”背后做了什么?首先我们都需要明确字符串对象是不可改变的,所有字符串对象的拼接和修改,实际上都是创建了一个新的字符串对象。在运行时,编译器会将所有的以“a”形式声明的字符串加载到字符串常量...
  • 0.Java操作符重载Java中我们可以执行如下语句:String fullName = “hongliang “+”cao”;System.out.println(fullName);System.out.println(“My age is “ + 99);输出结果为:hongliang caoMy age is 99这里的”+...
  • 写在前面: 1)本篇涉及内容: ...C++的类中重载“==”就相当于Java的类中重写equals方法 实现关系运算符重载: class Person { public: Person(int m_Age, string name) : m_Age(m_Age), name(name) {}
  • Java| JavaString对+的重载

    千次阅读 2018-10-17 20:11:02
    Java中是不支持重载运算符的,String的+是java中唯一的一个重载运算符,那么java使如何实现这个加号的呢?我们先看一段代码: public static void main(String[] args) { String s1 = &amp;quot;yves&amp...
  • 一、运算符重载  运算符重载允许把标准运算符(如+、—、*、/、等)应用于自定义数据类型的对象,这样我们在用...在这一点上C++和Java不同,Java不允许运算符重载,但是我们经常在程序里看到String c = a+b;这样的写
  • 问题引入: c++运算符重载一顿操作猛如虎,Java是否可以呢? 现实: java并不支持这项特性,但是这样的功能也是可以直接使用方法进行实现,...java中确实没有云运算符重载,唯一例外是String里面的=和+ String类的"=...
  • 一.不可改变String String对象是不可改变的, ... java传递参数的时候,传递的是引用的一个拷贝,调用时,都会复制一份引用,而引用所指向的对象,一直呆在某一单一物理位置,从未变动过. 二.重载 “+” 与 StringBuil
  • 1. String 为什么是不可变的? 简要说明下:这个可以看JDK源码。String本质是一个char[]数组。而且用final修饰, 在JDK1.7中... implements java.io.Serializable, Comparable&lt;String&gt;, CharSequenc...
  • char类型字符,和int类型数字之间的对照关系比表:ASCII,Unicode对于字符串String(首字母大写,并不是关键字)来,加号代表字符串连操作。任何数据类型和字符串进行连接的时候,结果都会变成字符串自增运算符:++自...
  • 在上一篇算术运算符重载中介绍了,运算符重载可以在成员函数和全局函数中实现,但请注意:左移运算符重载务必在全局函数中实现. class Person { public: string name; string sex; Person(string name, string
  • 3.为什么Java不支持运算符重载?4.为什么 StringJava 中是不可变的?5.为什么 char 数组比 Java 中的 String 更适合存储密码?6.如何使用双重检查锁定在 Java 中创建线程安全的单例?7. 编写 Java 程序时, 如何...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 245
精华内容 98
关键字:

java重载运算符string

java 订阅