首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java常见误区与细节

如果变量是byte,short,byte类型,当对其赋予编译时期常量,该常量又没有超过变量取值范围时,编译器就可以进行收缩转换。...这种收缩转换是安全,因为该收缩转换只适用于变量赋值,不适用于方法调用语句,即不适用于方法调用时参数传递。 7 注意char类型,这是一个无符号类型。...String类那些看似修改字符序列方法实际上都是返回新创建String对象,不是修改自身对象。 17 由于String对象是不可改变,因此具有线程安全性,可以自由地实现共享。...18 在String类内部,是使用一个字符数组char[])来维护字符序列。...所有的数组都继承Object类,并且实现了java.lang.Cloneable与java.io.Serializable接口。数组成员包括变量length(存在)与从Object类继承成员。

68730

Java 常见 30 个误区与细节!

如果变量是byte,short,byte类型,当对其赋予编译时期常量,该常量又没有超过变量取值范围时,编译器就可以进行收缩转换。...这种收缩转换是安全,因为该收缩转换只适用于变量赋值,不适用于方法调用语句,即不适用于方法调用时参数传递。...String类那些看似修改字符序列方法实际上都是返回新创建String对象,不是修改自身对象。 17   由于String对象是不可改变,因此具有线程安全性,可以自由地实现共享。...18   在String类内部,是使用一个字符数组char[])来维护字符序列。...所有的数组都继承Object类,并且实现了java.lang.Cloneable与java.io.Serializable接口。数组成员包括变量length(存在)与从Object类继承成员。

58830
您找到你想要的搜索结果了吗?
是的
没有找到

Java 常见 30 个误区与细节!

如果变量是byte,short,byte类型,当对其赋予编译时期常量,该常量又没有超过变量取值范围时,编译器就可以进行收缩转换。...这种收缩转换是安全,因为该收缩转换只适用于变量赋值,不适用于方法调用语句,即不适用于方法调用时参数传递。...String类那些看似修改字符序列方法实际上都是返回新创建String对象,不是修改自身对象。 17 由于String对象是不可改变,因此具有线程安全性,可以自由地实现共享。...18 在String类内部,是使用一个字符数组char[])来维护字符序列。...所有的数组都继承Object类,并且实现了java.lang.Cloneable与java.io.Serializable接口。数组成员包括变量length(存在)与从Object类继承成员。

60510

C语言竟支持这些操作:C语言神奇程序分享

---- 2.神奇转换 在某些弱类型语言中,转换是十分常见,如在JavaScript中,用一个数字去减去一个形如数字字符串,JavaScript会将字符转换为数字,再进行数字之间减法运算...难道我们C语言也支持类似JavaScript那种转换吗? C语言当然是不支持这样转换,那程序为什么会输出0.5呢?...这就要从C语言字符串说起了,在C语言中,没有字符串类型,字符串其实都是用以'\0'结尾字符数组储存数组名则表示字符首地址。...也许字符串"2"被编译器转换成数字2了呢?...在Python中,有字符串类型,通过强转型函数可以将字符串转换为其他类型,但是即便是Python,也不支持上述那种转换,即无法将一个数组与一个字符串进行**指数运算。

2.2K30

scala 转换

一般来说,在没有源码情况下,你很难扩展第三方函数库,函数库提供了什么就只能利用什么。 C 3.0 支持静态扩展方法,可以为已经定义库、类进行扩展。...编译器随之可以选择它作为变化候选项。你可以使用 implicit 来标记任意变量,函数或是对象。...转换 scala中一个核心集合特质 IndexedSeq[+A] ,它描述了建立在类型A元素上随机访问序列.它具有数组或列表实用方法. take/drop/map/filter/exists以及...eg.编写方法printWithSpaces,它可以打印指定随机访问序列中字符并用空格作为字符分隔....装扮”现在库 转换操作规则 定义是指编译器为了修改类型错误允许插入到程序中定义.

1K30

《Kotlin 极简教程 》第4章 基本数据类型与类型系统

这样我们就可以直接使用类型在较高层次方式思考,不是繁重低层次实现。 例如,我们可以将字符串想成一个值,以此取代仅仅是字节数组字符串就是一个抽象数据类型。...但是有些则不是,如 Haskell、ML 等,它们可以基于变量操作来推断其类型; Scala 是静态类型语言,它使用类型推断功能来支持类型。...有一点不同是,Kotlin对于数字没有拓宽转换(如 Java 中 int 可以转换为long)。 注意在 Kotlin 中字符Char不是数字。...显转换 由于不同表示方式,值范围较小类型并不是较大类型子类型,是不能转换。 代码示例: >>> val a: Int? = 1 >>> val b: Long?...实践是它很好用,但你不知道是为什么。 程序员将理论和实践结合到一起: 既不好用,也不知道是为什么。 默认 | 用作边界前缀,但你可以选择其他字符并作为参数传入,比如 trimMargin(">")。

2K20

整理:C++中sprintf()函数使用详解

如果你想看si 本来面目,那么就应该让编译器做0 扩展不是符号扩展扩展时二进制左边补0 不是补符号位): sprintf(s, "%04X", (unsigned short)si); 就可以了...如果你想看si 本来面目,那么就应该让编译器做0 扩展不是符号扩展扩展时二进制左边补0 不是补符号位):   sprintf(s, "%04X", (unsigned short)si);   ...如果你想看si 本来面目,那么就应该让编译器做0 扩展不是符号扩展扩展时二进制左边补0 不是补符号位):   sprintf(s, "%04X", (unsigned short)si);...如果你想看si 本来面目,那么就应该让编译器做0 扩展不是符号扩展扩展时二进制左边补0 不是补符号位):   sprintf(s, "%04X", (unsigned short)si);   ...应该让编译器做0扩展不是符号扩展。   如  sprintf(s,"%04X",(unsigned short)si); %o 8进制格式化字符串。

2.8K00

C语言中常见指针问题集解答

char *p; *p = malloc(10); 答:你所声明指针是p, 不是*p, 当你操作指针本身时你只需要使用指针名字即可:cp = malloc(10);当你操作指针指向内存时,你才需要使用...(如果编译器支持这样扩展, 那要么是一个错误, 要么是有意作出非标准扩展) // 要达到你目的可以用 p = (char *)((int *)p + 1); // 或者,因为 p 是 char...* 型, 直接用 p += sizeof(int); //但是, 在可能情况下, 你还是应该首先选择适当指针类型, 不是一味地试图李代桃僵。...你可以自己模拟按引用传递, 定义接受指针函数,然后在调用时使用 & 操作符。事实上,当你向函数传入数组时,编译器本质上就是在模拟按引用传递。..., 所有 “真正” 函数名总是退化为指针。

50740

C++打怪升级(八)- 泛型编程初见

,生成不同类型函数称为函数模板实例化; 分为实例化和显实例化; 实例化 由编译器在编译阶段根据我们所传实参推导函数模板参数实际类型然后生成某一具体类型函数; //函数模板 template...1:具体函数由我们指定不是编译器推导,不过这样会发生类型转换 int main() { int a = 1; double b = 3.14; Add(a, b); Add...-- 如果模板可以产生一个具有更好匹配函数, 编译器将会选择模板实例化出函数; **也就是说,编译器选择优先考虑是匹配问题; ** int Add(const int& t1, const int...,注意类模板名字不是真正类,实例化结果才是真正类(也就是类模板名加上具体类型是真正类名); 这里有个问题,类模板实例化为什么必须在其后加上呢?...或者说为什么我们需要指定类模板实例化类型不是像函数模板实例化那样由编译器推导类型再实例化呢?

76920

【编程基础】数组和指针为什么不等价?

这就是说, 一旦数组出现在表达式中, 编译器地生成一个指向数组第一个成员地指针, 就像程序员写出了&a[0] 一样。...例外情况是, 数组为sizeof 或&操作符操作数, 或者为字符数组字符串初始值。 作为这个这个定义后果, 编译器并那么不严格区分数组下标操作符和指针。...如果你把数组地址赋给指针: p = a; 那么p[3] 和a[3] 将会访问同样成员。 那么char a[]和char *a是一样吗? 并非如此。(做函数形式参数会被这样认为) 数组不是指针。...指针申明char *p, 请求一个位置放置一个指针, 用名称“p” 表示。这个指针几乎可以指向任何位置: 任何字符和任何连续字符, 或者哪里也不指。 一个图形胜过千言万语。...在上例中, a[3] 和p[3] 碰巧都是’l’ , 但是编译器到达那里途径不尽相同。本质区别在于类似a 数组和类似p 指针一旦在表达式中出现就会按照不同方法计算, 不论它们是否有下标。

86980

Java简答面试题(一)

这么做是出于基础类型安全考虑, 比如 String 和 Integer 。 这样也使得编译器进行一些优化, 更容易保证线程安全性。 final 方法无法重写。 final 变量值不能改变。...答案:类型转化就是简单一个类型赋值给另一个类型, 没有显告诉编译器发生了转化。并不是所有的类型都支持类型转化。 5.问题:你怎么理解变量?...需要时候 int 类型也可能被提升成 long 。 long 和 float 则有可能会被转换成 double 类型。 7.问题: main 方法参数里面,字符数组第一个参数是什么 ?...答案:数组是空,没有任何元素。不像 C 或者 C++ ,第一个元素默认是程序名。如果命令行没有提供任何参数的话, main 方法 String 数组为空 ,但不是 null 。...一般来说变量是 private get 和 set 方法是 public

58110

深入理解String类

String类值是通过char数组存储,并且char数组被private和final修饰,字符串一旦创建就不能再修改。 下面通过几个问题不断加深对String类理解。...(buf, true); } } return this; } 其他方法也是一样,无论是sub、concat还是replace操作都不是在原有的字符串上进行,而是重新生成了一个新字符串对象...问题二 为什么要使用final关键字修饰String类? 首先要讲final修饰类作用,被final修饰类不能被继承,类中所有成员方法都会被地指定为final方法。...String s1 = "abc"; String s2 = new String("abc"); //s2这行代码,只会创建一个对象 字符串拼接 字符拼接在Java中是很常见操作,但是拼接字符串并不是简简单单地使用...,StringBuffer方法都被sync关键字修饰,所以是线程安全StringBuilder则是线程不安全(效率高)。

33020

CA1831:在合适情况下,为字符串使用 AsSpan 不是基于范围索引器

Span 上范围索引器是非复制 Slice 操作,但对于字符串中范围索引器,将使用方法 Substring 不是 Slice。 这会生成字符串所请求部分副本。...此副本在用作 ReadOnlySpan 或 ReadOnlyMemory 值时常常是不必要。 如果不需要副本,请使用 AsSpan 方法来避免不必要副本。...>)str[a..b]; 如何解决冲突 若要解决此规则冲突,请对字符串使用 AsSpan 不是基于 Range 索引器,以避免创建不必要数据副本。...若要使用它,请将光标置于数组冲突上,然后按 Ctrl+。 (句点)。 从显示选项列表中选择“对字符串使用 AsSpan 不是基于范围索引器”。...不是基于范围索引器来获取数组 ReadOnlySpan 或 ReadOnlyMemory 部分 CA1833:使用 AsSpan 或 AsMemory 不是基于范围索引器来获取数组 Span

1K00

《CLR via C#》笔记:第3部分 基本类型(2)

第十六章 数组 初始化数组元素 数组转型 所有数组派生自System.Array 所有数组实现IEnumberable,ICollection和IList 数组传递和返回 创建下限非零数组...l FileAttributes.Hidden); 向枚举类型添加方法 使用扩展方法功能,代码示例(P328 2) ---- 第十六章 数组 CLR支持一维、多维和交错数组数组构成数组)。...在应用程序变量或字段中,包含是对数组引用,不是包含数组本身元素。...(P335 Tip) 所有数组派生自System.Array System.Array定义了许多有用实例方法和属性,比如Clone,CopyTo,GetLength,GetLongLength,...(P336 2) 所有数组实现IEnumberable,ICollection和IList 值类型和基类型实现接口。

75210

【笔记】《C++Primer》—— 第一部分:C++基础

wchar_t :确保可以存放机器最大扩展字符集中任意一个字符“宽字符”,最小尺寸16位 char16_t 和char32_t :负责处理Unicode字符类型 当明确知道数值是正时,选无符号型... 类内定义函数默认是内联函数 this是类一个常量指针,指向当前所用这个实例对象,常量指针指的是我们不能改变这个指针指向地址 可以在成员函数参数列表后面加上const,此时成员函数称为常量成员函数...,可以在开头加上friend关键字使之成为友元 友元声明仅仅指示了权限,不是传统声明,所以要在类外部再声明一次(尽管很多编译器不要求这个额外声明,但建议还是独立声明提高可移植性),同样为了清晰也建议声明在此类头文件中...想使用默认构造函数时,方法是初始化对象时不使用后面的调用运算符(即小括号对),如直接写Test a; 当构造函数*只接受一个*实参时,称转换构造函数,即定义了这种类型转换机制,在这种情况下我们对实参输入编译器可以自动地进行...*一步*转换 这种类型转换有时候我们是不希望其启用,此时我们可以将那个那个构造函数声明为explicit(显),它就不会进行转换 explicit只要在类内声明中写,类外定义时不需要写

1.4K40

说出来你们可能不信,但是数组名确实不是指针常量

sizeof(数组名)等于数组所有元素大小,不是sizeof(指针);对数组取地址,得到指针进行加减,增减字节数是sizeof(数组);你可以用字符串字面量初始化一个字符数组,但是不能用常量指针来初始化一个字符数组...其次,为什么很多老师都说数组是常量指针 他们不了解C语言类型系统和转换规则 他们怕下面的人听不懂 他们解释不清为什么数组名不能进行赋值或者++之类运算指针可以 切入正题,我们从类型系统和转换规则来讲...) 数组名在大部分情况下会转换为首元素指针右值,除了(参见 Implicit conversions) sizeof运算时候 取址时候 用字符串字面量初始化字符数组时候 以及C11_Alignof...运算符(这个本文不考虑) 其他情况下都会发生数组到指针转换,比如你用方括号取值,如果方括号左边是个数组,那么数组会被转换为首元素指针右值,然后对这个值进行解引用。...(参见Member access operators) 更进一步,二维数组type[size1][size2],实际上就是元素类型是数组数组,进行转换后得到首元素指针类型是type(*)[size2

1.5K60
领券