欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

4.JAVA-数组、String详解

程序员文章站 2022-04-28 14:19:09
1.数组 2.二维数组 初始化的一般为3种: 示例: 打印: 3.String类 java中的String采用共享设计模式(后续会讲),都存在string池中,存储的是常量字符串. string常量字符串的说明可以看第2章说明:2.JAVA-基础语法以及String的介绍 3.1 String两种实 ......

1.数组

public class test{

                  public static void main(string args[]){
                          int[] intarray = new int[] {1,4,3,2,5};//等价于 : int intarray[] = new int[] {1,2,3,4,5};

                          system.out.println(intarray.length);      //打印长度

                         
                          //使用java.util.arrays工具类 来操作 数组
                          system.out.println(java.util.arrays.tostring(intarray));//打印内容
                          java.util.arrays.sort(intarray);         //排序
                          system.out.println("4="+java.util.arrays.binarysearch(intarray,4));//通过2分查找4所在的位置(必须先排序才行)

                          system.out.println(java.util.arrays.tostring(intarray));//打印内容


                          //初次之外java.util.arrays类还有:
                          //copyof():复制
                          //copyofrange():指定具体范围复制
                          //equals():判断两个数组是否相等
                          //fill():填充某个值
                          //hashcode():根据数组内容返回哈希码
                  }
}

 

2.二维数组

初始化的一般为3种:

         int[][] arr1 = {{1,2}, {2, 3}, {4, 5}};
         int[][] arr2 = new int[5][5];
         int[][] arr3 = new int[5][];       //这种则需要使用的时候再去new一次,否则无法确定二维大小

示例:

public class test{

         public static void main(string args[]){
            int[][] arr3 = new int[5][];

            for(int i=0; i<arr3.length; ++i) {
            arr3[i] = new int[i + 1];

            for (int j = 0; j < arr3[i].length; ++j)
                arr3[i][j] = i + j;
            }

            for(int i=0; i<arr3.length; ++i) 
             system.out.println(java.util.arrays.tostring(arr3[i]));
         }
}

打印:

 4.JAVA-数组、String详解

 

3.string

java中的string采用共享设计模式(后续会讲),都存在string池中,存储的是常量字符串.

string常量字符串的说明可以看第2章说明:2.java-基础语法以及string的介绍

3.1 string两种实例化说明

string stra = "123";                         //只会在string池中创建"123"常量字符串

string strb = new string("123");             //由于string池中已经有了"123",所以只在堆空间分配一段内存来存储"123",然后使strb引用它.

stra = "124";                                //在string池中创建"124"并返回这个地址,并且将之前的"123"视为垃圾,等待回收站释放.

3.2 ==和equals()的区别

  •    ==     :   用来判断string的内存地址是否相等
  • equals(): 用来判断两个string的字符串内容相等

示例:

string stra = "123";                      //在string池中创建"123"字符串,并返回这个引用

string strb =stra;                        //strb和stra相等

string strc = "1" + "23";                 //strc="123",由于string池中已经有了"123",所以直接让stra=strb=strc

string strd = new string("123");          //可能会分配两块空间,1:首先会去string池中寻找"123"字符串,如果存在则直接调用,否则在池中创建"123".
                                          //2:然后在堆空间创建"123"的一段内存,使strd引用它.
                                          //3: 最后再去判断string池中的"123"是否被其它对象使用,如果没有,则视为垃圾,等待释放.

system.out.println("stra == strb:"+(stra==strb));
system.out.println("stra == strc:"+(stra==strc));
system.out.println("stra == strd:"+(stra==strd));
system.out.println("equals:"+stra.equals(strd));

打印如下:

 4.JAVA-数组、String详解

3.3 string共享设计模式

我们先将上个示例对应的图画出来,如下所示:

 4.JAVA-数组、String详解

如上图所示.在jvm底层上是有一个string池(同样也有其它类似的池),当代码中使用了直接赋值的方式定义一个string对象时,会将此字符串对象所使用的匿名对象进行入池保存,而后面如果又重新定义string对象,并且设置相同内容时,那么将不会在string池开辟新空间,而是继续使用,这种模式叫做共享设计模式.

 

3.4 string的new实例化之手工入池

string有一个intern()方法,可以使new实例化实现手工入池,intern方法定义如下:

public string intern();
//在string池中寻找等于此string的字符串,如果字符串存在,则返回池中的字符串,否则,在池中创建字符串后再返回池中的字符串.

示例如下:

string stra = new string("123").intern();   //在堆空间创建"123"的一段内存.并且将"123"入池,然后返回池中的"123"所在的位置
string strb = "123";                       //返回池中的"123"所在的位置
system.out.println(stra==strb);            //打印true

打印如下:

 4.JAVA-数组、String详解

 

3.5 string之其它常用成员方法

string str="hello world 我";

char[] data = str.tochararray();               //将string转为char

 
system.out.println(str.charat(2));           //返回小标处2的char值,返回l

system.out.println(str.codepointat(11));     //返回小标出11(“我”)的unicode码

string str1 = str.concat("是nqian");          //将str和"是nqian"进行连接,并返回给str1
system.out.println(str1);


system.out.println( str.compareto("hello.") );   //将"hello world 我"和"hello"按asc表进行比较
                             // 如果str大于"hello."返回正数,相等返回0,小于返回负数

system.out.println( str.comparetoignorecase ("hello.") ); //忽略大小写比较两个字符串

system.out.println( str.contains("he") );                //判断str里是否包含"he"字符,包含返回true,否则返回false

system.out.println( str. startswith("he") );            //如果str是以"he"开头,返回true,否则返回false

system.out.println( str.endswith("he") );              //如果str是以"he"结尾,返回true,否则返回false

system.out.println( str.equals("hello world 我") );        //判断两个字符串内容是否相等,返回boolean类型

system.out.println( str.equalsignorecase  ("hello world 我") ); //忽略大小,判断两个字符串内容是否相等

system.out.println( str.format("str1:%03d  %03f  %s",75,5.234,"format") );
//类似于sprintf(),打印"str1:075 5.23400 format",需要注意:并不会改变对象本身内容,str的值还是为:hello world 我 system.out.println( str.hashcode () ); // 返回str的哈希值(内容不同的字符串,哈希值都不同) system.out.println( str. indexof ("e")); //从头查找出现e字符的位置,所以返回1,如果未找到返回-1 system.out.println( str. indexof ("ld",4)); //从下标4处查找出现"ld"的位置并返回,如果未找到返回-1 system.out.println( str. lastindexof ("e")); //从尾部向前查找出现e字符的位置并返回,如果未找到返回-1 system.out.println( str. lastindexof ("o",5)); //从下标4处尾部向前查找出现"o"的位置,所以返回4 system.out.println( str. length ()); //返回string长度 system.out.println( str. isempty ()); //判断是否为空 system.out.println( str. replace("l","o")); //将字符串中的l替换为o,所以打印" heooo worod 我" string[] arrstr = str. split(" "); //以" "来拆开字符串,所以arrstr[0]="hello",arrstr[1]="world", arrstr[2]="我" system.out.println( str. substring(1,5)); //返回str的内容下标1~4的串(不包括5),所以打印:ello system.out.println( str.tolowercase()); //返回str的小写内容 system.out.println( str. touppercase()); //返回str的大写内容 system.out.println( " adc abc ". trim ()); //trim修剪字符串头和尾部的空格,所以打印:"abc abc",注意:如果头尾的字符小于空格的话,也会被修剪掉的. system.out.println( str.valueof(true)); //返回true对应的字符串,也就是"true",当然valueof也满足int,double等参数