字符串String

 在java 中,字符串不是基本数据类型,而是String 类的对象,当我们创建一个字符串的时候,真的是要使用new 来调用String 构造函数

String str  = new String();

  但是如果仅仅想创建一个字符串对象的话,完全可以使用字面量的方法,字面量还是使用双引号

String str = “abc”;  

  这里要注意的一点是,在Java中字符串字面量是共享的。当我们使用字面量的方式创建字符串对象的时,java在内存中会开辟一个字符串缓冲区,也可以理解为字符串常量池。当我们真正创建字符串对象时,如这里的”abc”  ,它就会到字符串常量池中查找这个对象有没有存在,如果没有,它就会新建这个对象, 然后把这个对象的地址引用赋值给我们声明的变量str。这时我们再声明一个变量,

String anotherString = “abc” ;

  它又会到字符串常量池中寻找“abc”,这时候发现”abc” 这个对象已经存在,那它直接把常量池中存在的对象的地址赋值给声明的变量anotherString.  这就是字符串共享。 

  字符串的共享也仅仅适用于字符串字面量,如果使用加号,或其它方法进行拼接形成的字符串,那就不一定在字符串常量池中了。如

String c = “Hello”;
Stirng st  = c + “word”;

  那st 应该在堆内存中了。

  但

String str = ‘Hello’ + ‘world’; 

  str 确是在字符串常量值中。这是为什么呢?因为java 都是先编译,然后再运行,编译器在编译的时候会对代码进行优化。‘Hello’ + ‘ world’ 都是确定好的,不会再发生改变,编译时,str 就会拼接成‘Hello world’, 所以当程序运行时,它是一个字符串常量,要在字符串常量池中进行查找。但 c + “word” 就不一样了,因为c是一个对象引用,在编译的时候,不会进行任何优化, 所以在运行的时候,它会在堆内存中生成一个对象,虽然内容都相同,但是地址不同。这也引出了一个判断两个字符串变量相等性的问题,如果使用==进行判断,那么判断的是这两个变量所引用的对象的地址,而不是这两个字符串变量所持有的内容,

str == st; // false 地址不同

  一般情况下,这不是我们想要的。大多数情况下,只想判断两个字符串持有的内空是否相同,那要使用字符串中的方法,equals(), 如果内容相同,返回true, 如果内容不同,返回false

str.equals(st); // true

  在java 中,虽然字符串是作为对象存在的,但是一旦创建之后,这个字符串对象就不会再发生变化,字符串的任何操作都会生成一个新的对象。对于频繁进行字符串操作来说,要生成好多个对象,不利于性能, 所以java 就有了一个类,StringBuilder, 专门用来操作大量变化的字符串。

  StringBuilder 类的操作步骤如下:

  1, 首先通过StringBuilder类生成一个空的字符串对象 builder

StringBuilder builder = new StringBuilder();

  2, 调用方法去操作这个空字符对象builder, 如append()方法,是向里面填加字符串,setCharAt修改某个位置上的字符等。

//调用append方法添加字符。
builder.append("hello");
        // 修改某个位置上的字符
builder.setCharAt(,'c');
        // 在某个位置插入字符
builder.insert(, "wordl");
        // 删除字符
builder.delete(, );
// 还有一个length方法,一共有多少个字符System.out.println(builder.length());

  3, 调用toString() 方法,把SringBuilder对象转化成字符串对象

// 调用toString 方法,转化成字符串

String completeString = builder.toString();

System.out.println(completeString);

  整 个代码如下,输出 cwordllo

public class FirstSimple {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder();
        builder.append("hello");
        builder.setCharAt(,'c');
        builder.insert(, "wordl");
        builder.delete(, );
        String completeString = builder.toString();
        System.out.println(completeString);
    }
}

  数组

  java是强类型语言,对于数组来说,这就意味着一个数组中只能保存相同的数据类型的内容,所以数组声明时,要指定其要保存的数据类型,同时还要指定保存的最大数量,保存的最大数量一旦声明就不会再改变。那数组怎么进行声明呢?我们都知道,声明一个变量,使用的是数据类型加变量名,如 int num, 就声明了一个int 类型的num变量,但它只能保存一个数据。如果在int 类型的后面加一个[] 呢,就表示可以存多个数据了,就是数组了。

int[] numbers = new int[10];

  int[] 就是一个类型,声明数组的专用类型,想要声明其它类型的数组,就把前面的类型改为其它类型就好了,String[] str = new String[10], 保存字符串的数组。数组的使用,基本都是一样的,都是基于索引

numbers[0] = 10;  // 赋值

  当然声明数组变量的时候,还可以初始化。它这里用的是{} 进行的初始化

int[] numbers = {2,5};

  这里还要注意java数组元素的默认值,在java中,只要声明了数组,数组中元素都会有默认值。对于数值型数组,它的默认值是0;对于Boolean型数组,它的默认值是false. 对于对象型数组,它的默认值是null, 这里指的是数组中的每个元素的默认值。在 java中字符串是对象,所以一个字符串对象数组,它里面中的所有元素的默认值为null。

  类类型

  当我们定义 一个类的时候,其实就是定义了一个数据类型,类的定义仅仅是类型的定义,它并不会创建对象。A class definition creates a new data Type. A class declaration is only a type description; it does not create an actual object., 这也可以称之为自定义数据类型。当我们定义一个类或,定义一个数据类型以后,这个类型和java 内置或原生的类型就没有什么区别了, java 对它们一视同仁。可以定义一个Student类,name 和age 称之为实例属性

class Student {
     String name;
     int age;
}

  当我们使用String类的时候,我们会创建一个String 类的对象。String str = new String();   那么当我们使用Student 类的时候,也应该使用类创建一个对象

Student stu = new Student();

  创建对象后,就要对象进行访问,当访问String 对象str 的属性的时候,我们使用的点号str. length(); 那么当我们访问 Strudent 对象stu 的属性的时候,也应该使用点号,

stu.name

  当使用类创建一个对象的时候,我们就说创建了这个类的一个实例。这个对象或实例拥有了一份它独有的该类所定义的的属性和方法的完整拷贝, 访问属性的时候,使用点号

  

java 中的引用数据类型的更多相关文章

  1. java中的基本数据类型和引用数据类型

    java中基本数据类型有8种:byte,short,int,long,char,float,double,boolean 整型有四种:byte short,int,long byte:   1字节   ...

  2. JAVA中分为基本数据类型及引用数据类型

    一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...

  3. JAVA中分为基本数据类型和引用数据类型区别

    一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...

  4. Java中的变量数据类型补充

    Java中变量的数据类型的补充 变量按照数据类型进行分类 1.基本数据类型 数值型:①整数类型(byte,short,int,long)②浮点型(float,doubbe)③字符型(char)④布尔型 ...

  5. java中的基本数据类型一定存储在栈中吗?

    首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的. 下面让我们一起来分析一下原因: 基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型 ...

  6. Java中的基本数据类型和引用类型

    一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...

  7. 二、java中的基本数据类型

    总结: 1.java中的基本数据类型有byte.short.int.long;float.double;char;boolean. 2.基本数据类型与1相对应分别占1.2.4.8;4.8;2;1.(单 ...

  8. Java中的引用传递和值传递

    Java中的引用传递和值传递 关于Java的引用传递和值传递,在听了老师讲解后,还是没有弄清楚是怎么一回事,于是查了资料,所以在这里与大家分享,有不对的地方,欢迎大家留言. java中是没有指针的,j ...

  9. Java中没有引用传递只有值传递(在函数中)

    ◆传参的问题 引用类型(在函数调用中)的传参问题,是一个相当扯的问题.有些书上说是传值,有些书上说是传引用.搞得Java程序员都快成神经分裂了.所以,我们最后来谈一下“引用类型参数传递”的问题. 如下 ...

随机推荐

  1. k8s数据管理(八)--技术流ken

    volume 我们经常会说:容器和 Pod 是短暂的.其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据都会被清除. 为了持久化保存容器的数据,可以使用 ...

  2. ASP.Net Mvc实现自定义User Identity用户身份识别系统(2)

    上一篇博文中已经实现了如何在页面上使用自定义的属性即上篇博文所示的@this.U,今天将进一步研究用户自定义User Identity; 实现思路: 通过研究微软自带identity的套路,我们可以发 ...

  3. nginx系列6:nginx的进程结构

    nginx的进程结构 如下图: 通过ps –ef | grep nginx可以看到共有三个进程,一个master进程,两个worker进程. nginx是多进程结构,多进程结构设计是为了保证nginx ...

  4. 如何利用GitHub设计一个炫酷的个人网站(含代码)

    1.在开始制作之前我们先预览一下我的网站吧! 1.方式一: 由于是手机版的所以用手机访问下面的链接体验比较好一点: https://tom-shushu.github.io/MyWeb.github. ...

  5. 自己实现的typeOf函数1

    自己实现的typeOf函数:返回传入参数的类型 主要用于解决,js自带的typeof返回结果不精确:Ext JS中typeOf对字符串对象.元素节点.文本节点.空白文本节点判断并不准确的问题 js代码 ...

  6. Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?

    Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...

  7. android 记一次解决键盘遮挡问题

    文章链接:https://mp.weixin.qq.com/s/1gkMtLu0BTXOUOj6isDjUw 日常android开发过程中,会遇到编辑框输入内容弹出软键盘,往往会出现键盘遮挡内容,或者 ...

  8. 如何删除Windows10操作系统资源管理器中的下载、图片、音乐、文档、视频、桌面、3D对象这7个文件夹

    通过注册表删除,步骤如下: 1.按下win+R,输入regedit,打开注册表 2.找到位置:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Cur ...

  9. python从开始到放弃的途中一直很菜的day13

    一直很菜的今天又来了两个新的概念,一个是装饰器,一个是推导式,装饰器好比女生出门前需要化妆的准备,推导式也称为生成式.先说装饰器吧,装饰器其实本质也是一个函数,并用@+函数名装饰到其他函数上,当这个其 ...

  10. vue 前端将时间戳格式化

    转自西风XF : https://blog.csdn.net/qq_36242361/article/details/79143050 后端传过来的时间数据是时间戳的形式,前端需要进行格式化 1. 新 ...