java:String不是基本类型,不是数组,是类,而数组也是类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java:String不是基本类型,不是数组,是类,而数组也是类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2965字,纯文字阅读大概需要5分钟。
内容图文
![java:String不是基本类型,不是数组,是类,而数组也是类](/upload/InfoBanner/zyjiaocheng/1327/369a7f0d39114a7eb8a1b505381d6e29.jpg)
环境:jdk 1.7。
本文可以用一句话总结:**String不是基本类型,不是数组,是类,而数组也是类。**
由于脚本语言使用较多,我在java中也写过这样的代码:
String str = "hi";
System.out.println(str[1]); // 错误的
可惜是错的。str是java.lang.String类的一个对象,无法使用
[]
运算符。真正可用的代码是这样的:
String str = "hi";
System.out.println(str.charAt(1));
数组是类
—
请参考java:反转数组,以及System.out的实现机制。
其实,从下面的语句就可以看出来:
int[] ia = new int[9];
也可以从下面的代码片段中看出来:
char[] arr = {‘a‘, ‘b‘, ‘c‘};
char[] arr2 = arr; // 引用
System.out.println(arr); // abc
System.out.println(arr2); // abc
arr[1] = ‘6‘;
System.out.println(arr); // a6c
System.out.println(arr2); // a6c
String不是基本类型
—
java提供了8个基本类型,分别是:byte、short、int、long、float、double、boolean和char,并没有String。基本类型可以以下面的形式定义变量并赋值:
int a = 5;
上面的变量a是一个基本类型变量,不是对象,所以变量a没有任何属性和方法,只有值
。
当然,这8个基本类型也有对应的类,分别是java.lang包下的Byte、Short、Integer、Long、Float、Double、Boolean、Character。这8个类都有一个私有的使用基本类型的变量value
来保存值。
Java中有“自动装箱”、“自动拆箱”的概念,这是针对基本类型和它们对应的类而言的。
自动装箱:把基本类型用它们对应的引用类型包装起来,使它们具有对象的特质,可以调用toString()、hashCode()、getClass()、equals()等方法。
拆箱:跟自动装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为基本类型的数据。
注意:自动装箱和拆箱是由编译器来完成的,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。
代码示例:
Integer a = 5; // 自动装箱
int b = new Integer(6); // 自动拆箱
System.out.println(a); // 5
System.out.println(b); // 6
String不是数组
—
因为无法使用数组运算符[]
。
String内部实现
—
String是一个类,具体是java.lang.String,查看其源码,可以看到
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
char数组value用来存储字符串。注意char类型的下面的性质:
char类型是一个单一的16位Unicode字符;
最小值是’\u0000’(即为0);
最大值是’\uffff’(即为65,535);
char数据类型可以储存任何字符;
例子:char letter = ‘A‘。
String类并没有暴露可以修改value的方法,所以可以认为String是无法修改的。
下面是一个示例:
char[] arr = {‘a‘, ‘b‘, ‘c‘};
String str = new String(arr);
System.out.println(arr); // abc
System.out.println(str); // abc
arr[1] = ‘6‘;
System.out.println(arr); // a6c
System.out.println(str); // abc
其中:new String(arr);
使用了下面的构造方法:
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
这相当于把arr的内容拷贝一份,让后让this.value指向它新生成的数组。所以,在
arr[1] = ‘6‘;
后,字符串对象
str
的value并没改变。
那么"123"
意味着?
看一下下面的代码:
package hellojava;
public class HelloJava {
void hi(char[] arr) {
System.out.println("hi, char[]");
}
void hi(String str) {
System.out.println("hi, String");
}
public static void main(String[] args) {
HelloJava hj = new HelloJava();
char[] arr = {‘a‘, ‘b‘};
hj.hi("123");
// hj.hi({‘a‘, ‘b‘}); // 错误
hj.hi(arr);
}
}
运行结果是:
hi, String
hi, char[]
所以"123"
是代表着String。
如果上面的代码中,没有void hi(String str)
方法,那么hj.hi("123");
也会报错。
补充
—
String类下还有这个构造方法:
String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}
如果该构造方法使用public修饰了,那么,下面的代码是成立的:
// 这段代码在实际中是不成立的
char[] arr = {‘a‘, ‘b‘, ‘c‘};
String str = new String(arr, true);
System.out.println(arr); // abc
System.out.println(str); // abc
arr[1] = ‘6‘;
System.out.println(arr); // a6c
System.out.println(str); //-> 结果会是: a6c
也就是String能被修改了,然而该构造方法**没有使用**public修饰。只有同在java.lang包中的类才能使用。
原文:http://my.oschina.net/letiantian/blog/415858
内容总结
以上是互联网集市为您收集整理的java:String不是基本类型,不是数组,是类,而数组也是类全部内容,希望文章能够帮你解决java:String不是基本类型,不是数组,是类,而数组也是类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。