春秋招java后端方向技能全面突破-基础篇06

Java中各种数据、变量类型

 首先,我们需要知道的是java中分为两种,一种是基本数据类型一共有八个(byte,short,int,long,float,double,char(默认为空),boolean(默认false)),和五种引用数据类型(类、接口类型、数组类型、枚举类型、注解类型)

这里区分一下基本数据类型与引用数据类型的区别:

基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上。

引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。

而对于变量类型来说,分为:

  • 类变量(静态变量,当然,也是可以通过ClassName.VariableName的方式访问的):独立于方法之外的变量,用 static 修饰。
  • 实例变量:独立于方法之外的变量,不过没有 static 修饰。(实例变量在对象创建的时候创建,在对象被销毁的时候销毁)
  • 局部变量:类的方法中的变量。(是在栈上分配)

举个栗子:

public class Variable{
    static int allClicks=0;    // 类变量
 
    String str="hello world";  // 实例变量
 
    public void method(){
 
        int i =0;  // 局部变量
 
    }
}

String的使用

关于String的底层实现,之前的文章里已经有比较详细的论述了,这里就简单说一下它的方法的使用:

1.length():获取字符串的长度

2.charAt(int index):获取某个位置上的字符

3.indexOf(int ch)/indexOf(String str):返回ch/str在字符串上第一次出现的位置

4.contains(str):该字符串上是否包含某一子串

5.equals(str):判断字符内容是否相同

6.compareTo(string):对两个字符串进行自然顺序的比较

7. replace(oldchar,newchar):对字符串指定字符进行替换

JDK 6和JDK 7中substring的原理及区别

首先明确它的作用:

substring(int beginIndex, int endIndex)方法截取字符串并返回其[beginIndex,endIndex-1]范围内的内容。

首先,我们得知道String是不可变的,那么在调用它的过程中,发生了什么呢,过程如下:

如图,指向了一个全新的字符串。(但是具体在JDK1.6和JDK1.7又是有区别的)

先说在JDK1.6里面吧

String是通过字符数组实现的。在jdk 6 中,String类包含三个成员变量:char value[], int offsetint count。他们分别用来存储真正的字符数组,数组的第一个位置索引以及字符串中包含的字符个数。

当调用substring方法的时候,会创建一个新的string对象,但是这个string的值仍然指向堆中的同一个字符数组。这两个对象中只有count和offset 的值是不同的。(当然在1.6中如果说我们需要调用的是一小段字符,但是却引用了整个字符串,这可能会造成性能问题,同时又因为因为这个非常长的字符数组一直在被引用,所以无法被回收,就可能导致内存泄露

然后再回过来看看JDK1.7里面

对于上述的问题,我们在1.7中得到了解决,subString方法会在堆内存中新建一个数组,如下所示:

replaceFirst、replaceAll、replace区别

1、replace()(不使用正则表达式):

String str= "Hello World"

   str.replace('e', 'o')

   returns "Hollo World"

由此可知replace是全替换的。

2.replaceFirst():

   replaceFirst只替换第一次出现的,后面就不管了;

3.replaceAll():

增强版,全都替换。(一般用不到,爬虫手机号验证等等)

这里最后要注意一下:执行了替换操作后,源字符串的内容是没有发生改变的.

猜你喜欢

转载自blog.csdn.net/qq_40901379/article/details/84316193