数组String

Posted Mr_madong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组String相关的知识,希望对你有一定的参考价值。

简单java类:

一个类之中只包含基本的属性,setter、getter方法,这种类称为简单java类,对于简单java类的开发规则有如下几点:

  • 类名称必须可以明确的表示出一类的定义,例如:Person、Emp、Dept

  • 类之中的所有属性必须使用private进行封装

  • 类之中的所有属性都必须定义相应的setter、getter;

  • 类之中可以提供构造方法,为属性初始化,但是不管提供多少个构造方法,一定要保留有一个无参构造方法;

  • 类之中不允许直接使用system.out.println()输出,所有内容要返回给被调用处输出。

例题:定义一个表示雇员的操作类,这个类之中包含雇员的编号、姓名、职位、基本工资、佣金,并且可以计算出一个雇员的月薪和年薪,可以返回一个雇员的完整信息。

class Emp

    private int empno ;
    private String ename ;
    private String ejob ;
    private double esal ;
    private double ecom ;
    public Emp()
    public Emp(int eno , String ena ,String ej , double es , double ec)
        empno = eno ;
        ename = ena ;
        ejob = ej ;
        esal = sa ;
        ecom = ec ;
    
    public void setEmpno(int eno)
        empno = eno ;
    
    public void setEname(String ena)
        ename = ena ;
    
    public void setEjob(String ej)
        ejob = ej ;
    
    public void setEsal(double es)
        esal = es ;
    
    public void setEcom(double ec)
        ecom = ec ;
    
    public int getEmpno()
        return empno ;
    
    public int getEname()
        return ename ;
    
    public int getEjob()
        return job ;
    
    public int getEsal()
        return sal ;
    
    public int getEcom()
        return com ;
    
public double salary()
    return sal + com ;

public double income()
    return salary()* 12 ;

public String getInfo()
    return "雇员信息:"+"\\n"+
                " \\t | - 编号:" + getEmpno() + "\\n" +
                " \\t | - 姓名:" + getEname() + "\\n" +
                " \\t | - 职位:" + getEjob() + "\\n" +
                " \\t | - 基本工资:" + getEsal() + "\\n" +
                " \\t | - 佣金:" + getEcom() + "\\n" +
                " \\t | - 月薪:" + salary() + "\\n" +
                " \\t | - 年薪:" + income() + "\\n" +



public static void main(String args[])
    Emp emp = new Emp(1234 , "史密斯" , "办事员" , 800.0 , 200.0) ;
    System.out.println(emp.getInfo()) ;

数组:

数组的定义格式:
动态初始化:数据类型 数组名称 [] = new 数据类型 [长度];数组内容都是默认值
静态初始化:数据类型 数组名称 [] = new 数据类型 []值,值… ;

二维数组:
动态初始化:数据类型 数组名称 [] []= new 数据类型 [长度][长度];
静态初始化:数据类型 数组名称 [] []= new 数据类型 [][]值,值…,值,值…;

如果要取得数组长度:数组名称.length

数组的两个基本操作方法:
**排序:**java.util.Arrays.sort(数组名称);

说明:
(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;
(2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是提供了默认的升序排列,没有提供相应的降序排列方法。 
(3)要对基础类型的数组进行降序排序,需要将这些数组转化为对应的封装类数组,如Integer[],Double[],Character[]等,对这些类数组进行排序。(其实还不如先进行升序排序,自己在转为将序)。

用默认的升序对数组排序
函数原型:
static void sort(int[] a) 对指定的 int 型数组按数字升序进行排序。
static void sort(int[] a, int fromIndex, int toIndex) 对指定 int 型数组的指定范围按数字升序进行排序。
代码如下: 

import java.util.Arrays;
public class ArraysSort_11 
    public static void main(String args[])
    
        int[] a=1,4,-1,5,0;
        Arrays.sort(a);
        //数组a[]的内容变为-1,0,1,4,5
        for(int i=0;i<a.length;i++)
            System.out.print(a[i]+"  ");
    

**数组拷贝:

  • System.Arraycopy(源数组名称,源数组开始点,目标数组名称,目标数组开始点,长度);
    示例:
    System.arraycopy的用法:
    int[] src = 1,3,5,7,9,11,13,15,17;

int[] dest = 2,4,6,8,10,12,14,16,18,20;

//从src中的第一个元素起复制三个元素,即1,3,5复盖到dest第2个元素开始的三个元素

System.arraycopy( src, 0, dest, 1, 3);
System.Arraycopy(源数组名称,源数组开始点,目标数组名称,目标数组开始点,长度);

System.out.println(Arrays.toString(dest));

结果为:[2, 1, 3, 5, 10, 12, 14, 16, 18, 20]

还有其它的两种基本复制用法:

  • Arrays.copyOf的用法:
    int[] src = 1,3,5,7,9,11,13,15,17;

    int[] dest = 2,4,6,8,10,12,14,16,18,20;

    //copyOf(是复制src数组从0开始的两个元素到新的数组对象)

    int[] copyof=Arrays.copyOf(src, 2);

    System.out.println(Arrays.toString(copyof));

    结果为:[1, 3]

  • Arrays.copyOfRange的用法

    int[] src = 1,3,5,7,9,11,13,15,17;

    int[] dest = 2,4,6,8,10,12,14,16,18,20;

    //copyRange(从src数组中从0开始的第二个元素到第五个元素复制到新数组,含头不含尾)

    int[] copyofRange=Arrays.copyOfRange(src, 2,6);

    System.out.println(Arrays.toString(copyofRange));

    结果为:[5, 7, 9, 11]

注意:对象数组开辟之后需要为每一个数组元素分别进行是实例化操作。

String类两种对象实例化方式

直接赋值方式:String str = ”Hello” ;

public class Test2

    public static void main(String args[])
        String str1 = "Hello" ;
        String str2 = new String("Hello") ;
        String str3 = str2 ;
        System.out.println(str1 == str2) ;    //false
        System.out.println(str1 == str3) ;    //false
        System.out.println(str2 == str3) ;    //true
    

分析如下:
数组、String_数据类型

现在使用“==”是判断数值的相等,这里判断的是堆内存的地址数值是否相等。

*.equals()(用来比较内存中内容是否相等)

public class Test2

    public static void main(String args[])
        String str1 = "Hello" ;
        String str2 = new String("Hello") ;
        String str3 = str2 ;
        System.out.println(str1.equals(str2)) ;    //true
        System.out.println(str1.equals(str3)) ;    //true
        System.out.println(str2.equals(str3)) ;    //true
    

现在比较的不是内存的地址,而是比较内存中的内容是否相等。

比较“==”、equals()的区别?

  • “==”:比较的是字符串的数值是否想扥,属于数值比较。

  • Equals():比较的是两个字符串在内存中的内容是否相等,属于内存比较。

  • -

字符串常量是string的匿名对象

如果程序在定义字符串(使用“”),那么就表示一个string对象。

匿名对象可以调用类之中的方法和属性,如:”Hello”.equals();,那么这个字符串常量一定是一个对象。

String类的两种实例化操作的区别

  • 分析直接赋值方式:String str = “Hello” ;
public class Test2

    public static void main(String args[])
        String str1 = "Hello" ;
        String str2 = "Hello" ;
        String str3 = "Hello" ;

        System.out.println(str1 == str2) ;    //true
        System.out.println(str1 == str3) ;    //true
        System.out.println(str2 == str3) ;    //true
       

数组、String_数据类型_02

在string类进行设计时采用了一种共享设计模式的概念,在每一个运行的JVM底层存在一个字符串的对象池(Object Pool),如果用户采用直接赋值的方式,会将字符串的内容放到池中,以供其他继续使用直接赋值方式的string对象使用,如果新声明的字符串内容不再池中,则会开辟一个新的,继续放到池中,以供下次使用。

  • 构造方法赋值:
public class Test2

    public static void main(String args[])
        String str = new String("Hello");
        System.out.println(str) ;  

    

数组、String_数组_03
使用构造方法的方式开辟的字符串对象,实际上开辟两块空间,其中一块称为垃圾。

入池方式:

  • 直接入池:String str2 = “Hello” ;
public class Test2

    public static void main(String args[])
        String str1 = new String("Hello");
        String str2 = "Hello" ;   //入池
        String str3 = "Hello" ;     //使用池对象
        System.out.println(str1 == str2) ;  //false
        System.out.println(str1 == str3) ;  //false
        System.out.println(str2 == str3) ;  //true

    

使用构造方法实例化string对象,不会入池。

  • 手工入池:String str1 = new String(“Hello”).intern();
public class Test2

    public static void main(String args[])
        String str1 = new String("Hello").intern();     //手工入池
        String str2 = "Hello" ;   //入池
        String str3 = "Hello" ;     //使用池对象
        System.out.println(str1 == str2) ;  //false
        System.out.println(str1 == str3) ;  //false
        System.out.println(str2 == str3) ;  //true

    

思考:String类的两种实例化方式的区别?

  • 直接赋值:之开辟一块堆内存空间,字符串的内容可以入池,以供下次使用。
  • 构造方法:开辟两块堆内存空间,又有成为垃圾,并且不能自动入池,使用intern()手工入池。

字符串的内容一旦声明就不可改变

public class Test2

    public static void main(String args[])
        String str = "Hello" ;  
        str += " World" ;
        str = str + "!!!" ;
        System.out.println(str) ; 

    

数组、String_字符串_04

字符串的更改,实际上改变的是字符串对象的引用

以上是关于数组String的主要内容,如果未能解决你的问题,请参考以下文章

10个JavaScript代码片段,使你更加容易前端开发。

以下代码片段的时间复杂度是多少?

ListView 未显示在片段中

无法在 MongoDB(猫鼬)文档中追加数组

VSCode自定义代码片段—— 数组的响应式方法

VSCode自定义代码片段10—— 数组的响应式方法