第三周周2技术课讲义

增强for循环

什么是增强for循环?

  增强for循环 (也称for each循环) 是迭代器遍历方法的一个“简化版”,是一个高级for循环,专门用来遍历数组和集合。

  其在遍历数组/集合的过程中,不能对集合中的元素进行增删操作。

增强for循环的使用

  1.使用范围:用来遍历集合和数组(必须有遍历目标,目标只能是集合或者数组),所有单列表集合都可以使用增强for循环。   2.格式如下:

int[] array = {1,4,6,2,7,9}
for(int a: array) //格式: 数组的数据类型 变量名 :数组名
{ 
    System.out.println(a));
}

Arrays工具类

java.util.Arrays工具类:提供了非常实用的方法,可以帮助我们在处理数组时更加高效和便捷

Aarry的几个常用函数:

排序 : sort()

对数组从小到大的排序(String类型的数组不宜使用)

查找 : binarySearch()

二分查找法找指定元素的索引值,数组一定是排好序的,否则会出错(Bug)。找到元素,只会返回最后一个位置 。

返回不存在元素的规律:-(应该插入的位置索引 + 1)

int arr[] = { 1, 3, 2, 7, 6, 5, 4, 9 };
//int binarySearch(Object[] a, Object key):在a数组中查找key,返回key在数组中的位置 (无序)
int a1=Arrays.binarySearch(arr,10);  //-9
int a2=Arrays.binarySearch(arr,6);  //-4
​
int arr1[] = {1, 4, 6, 7, 9, 10}
int a1=Arrays.binarySearch(arr,10);  //5
int a2=Arrays.binarySearch(arr,6);  //2

比较: equals()

判断两个数组是否相等

//boolean equals(Object[] a, Object[] a2):比较两个数据是否相等
String string1[]={"1","2","3","4","5"};
String string2[]={"1","3","5","7","9"};
String string3[]={"1","3","5","7","9"};
String string4[]=null;
String string5[]=null;
 
boolean b1= Arrays.equals(string1,string2);  //false
boolean b2=Arrays.equals(string2,string3);  //true
boolean b3=string2.equals(string3);   //false
boolean b4=Arrays.equals(string1,string3);  //false
boolean b5=Arrays.equals(string4,string5);  //true

转字符串 : toString()

返回指定数组的内容的字符串表示形式

int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };           
System.out.println(Arrays.toString(a));  //[1, 2, 3, 4, 5, 6, 7, 8, 9]

复制: copyOf()

1.int[] copyOf(int[] a, int len):从a数组中截取长度为len的新数组

2.int[] copyOfRange(int[] a, int from, int to):从original数组中截取[from,to)新数组

int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//copyOf 方法实现数组复制,a为数组,6为复制的长度 
int a1[] = Arrays.copyOf(a, 6);
for (int i : a1) {
      System.out.print(i);  //123456
}
// copyOfRange:将a数组的指定范围(4~8)复制到新数组a2中
int a2[] = Arrays.copyOfRange(a, 4, 8);
for (int j : a2) {
   System.out.print(j);  //5678
}
​

String类概述

String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!

String类的特点

  • 字符串不可变,它们的值在创建后不能被更改

  • 虽然 String 的值是不可变的,但是它们可以被共享

  • 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )

String类的构造方法

  • 常用的构造方法

    方法名说明
    public String()创建一个空白字符串对象,不含有任何内容
    public String(char[] chs)根据字符数组的内容,来创建字符串对象
    public String(byte[] bys)根据字节数组的内容,来创建字符串对象
    String s = “abc”;直接赋值的方式创建字符串对象,内容就是abc
  • 示例代码

    public class StringDemo01 {
        public static void main(String[] args) {
            //public String():创建一个空白字符串对象,不含有任何内容
            String s1 = new String();
            System.out.println("s1:" + s1);
    ​
            //public String(char[] chs):根据字符数组的内容,来创建字符串对象
            char[] chs = {'a', 'b', 'c'};
            String s2 = new String(chs);
            System.out.println("s2:" + s2);
    ​
            //public String(byte[] bys):根据字节数组的内容,来创建字符串对象
            byte[] bys = {97, 98, 99};
            String s3 = new String(bys);
            System.out.println("s3:" + s3);
    ​
            //String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc
            String s4 = "abc";
            System.out.println("s4:" + s4); 
        }
    }

创建字符串对象两种方式的区别

  • 通过构造方法创建

    通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同

  • 直接赋值方式创建

    以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护

字符串的比较

==号的作用
  • 比较基本数据类型:比较的是具体的值

  • 比较引用数据类型:比较的是对象地址值

equals方法的作用
  • 方法介绍

    public boolean equals(String s)     比较两个字符串内容是否相同、区分大小写
  • 示例代码

    public class StringDemo02 {
        public static void main(String[] args) {
            //构造方法的方式得到对象
            char[] chs = {'a', 'b', 'c'};
            String s1 = new String(chs);
            String s2 = new String(chs);
    
            //直接赋值的方式得到对象
            String s3 = "abc";
            String s4 = "abc";
    
            //比较字符串对象地址是否相同
            System.out.println(s1 == s2);
            System.out.println(s1 == s3);
            System.out.println(s3 == s4);
            System.out.println("--------");
    
            //比较字符串内容是否相同
            System.out.println(s1.equals(s2));
            System.out.println(s1.equals(s3));
            System.out.println(s3.equals(s4));
        }
    }

字符串拼接

“ + ” 操作符

String对象后面跟着一个 “+” 时,不管 “+” 后面的是什么数据(可能不是Strig对象),都会转换为字符串。当使用 “+” 拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容

concat 方式

当两个量都为String类型且值不为null时,可以用concat方式。

代码示例:
/**
 * 1.字符串的拼接:基本数据类型中+是加法运算。
 * 字符串参与+运算时,统一按拼接处理
 * 2.字符串字面值直接拼接,查找常量池,没有就创建,然后引用
 * 有变量参与拼接时没同意在堆内存中new,所以地址肯定不一样
 */
String str1 = "hello";
String str2 = " world";
String str3 = "hello world";
System.out.println(str1+str2);
System.out.println(("hello"+" world") == str3);//ture
System.out.println((str1 +" world") == str3);//false
System.out.println((str1+str2) == str3);//false
System.out.println(str1+1);//hello1
System.out.println(str1+1+1);//hello11
System.out.println(1+1+str1);//2hello

//str1拼上str2
System.out.println(str1.concat(str2));  //hello world
System.out.println("hello".concat(" world") == str3);  //false

上课整理:

  • /*
     * 1.字符串就是一串字符,带 ""。
     * 2.字符串是引用类型,String
     * 3.字符串的定义:String 变量名 = 值;
     * 4.基本数据类型中, ==比较的是值。引用数据类型中,
     * == 比较的是内存地址。
     * 5.String 变量 = 字面值
     * 和String 变量 = new String(字面值).
     * ==比较结果为FALSE,说明地址不一样,不是同一个。
     * 6.String 变量=字面值。首先检查常量池有没有此字面值,
     * 有的话引用他的地址;没有的话先创建在使用。
     * 7.String 变量 = new String(字面值),
     * 首先检查常量池有没有此字面值,没有的话先创建
     * 然后在堆内存开一个空间引用他的地址
     * 然后变量实际指向堆内存的地址;
     * 8.Str1.equals(str2)方法比较Str1和str2的字面值是否一样
     */
        String str = "Hello World";
        System.out.println(str);  
        String str1 = "我爱双体";
        System.out.println(str1);
    
        String str2 = new String("我爱双体");
        System.out.println(str2);  //我爱双体
        System.out.println(str1 == str2);  //false
    
        String str3 = "我爱双体";
        System.out.println(str1 == str3);//true
        String str4 = new String("我爱双体");
        System.out.println(str2==str4);//false
        System.out.println(str3==str4);//false
    
        //equals()方法比较字面值
        System.out.println(str1.equals(str2));//true
        System.out.println(str1.equals(str3));//true
        System.out.println(str3.equals(str4));//true

扩展

字符串存储的内存原理

String s = “abc”;直接赋值

特点:

此时字符串abc是存在字符串常量池中的。

先检查字符串常量池中有没有字符串abc,如果有,不会创建新的,而是直接复用。如果没有abc,才会创建一个新的。

所以,直接赋值的方式,代码简单,而且节约内存。

new出来的字符串

看到new关键字,一定是在堆里面开辟了一个小空间。

String s1 = new String(“abc”);

String s2 = “abc”;

s1记录的是new出来的,在堆里面的地址值。

s2是直接赋值的,所以记录的是字符串常量池中的地址值。

==号比较的到底是什么?

如果比较的是基本数据类型:比的是具体的数值是否相等。

如果比较的是引用数据类型:比的是地址值是否相等。

结论:==只能用于比较基本数据类型。不能比较引用数据类型。

  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值