大数据预科班10

来源:互联网 发布:lcd1602不显示数据 编辑:程序博客网 时间:2024/04/30 02:55

大数据预科班10

复习

  • Object:顶级父类---getClass获取对象的实际类型(实际子类,而不是声明的类),equals(判断两个对象是否相等,底层默认地址是否一致,需手动重写),toString(将对象转化为字符串,默认输出地址)

String

  • final不能被继承
  • 代表字符串,字符串是常量,创建之后不可被改变
  • String s="a"; s="b"; s+="c";
  • String s=new String("ab"); String s1="ab"; String s2="a"+"b"; String s3="s3"; s3+="b";
  • 字面量:常量(六类)数值、字符、字符串
  • JVM在编译时会优化String s3="a"+"b"; 即String s3="ab";
  • StringBuilder

String s="a";s+="b";过程:s=new StringBulder("a").append("b").toString();//toString时,用new String(),即指向了堆

产生多少个对象

String s="a";a+="b";
  • 1. a
  • 2. StringBuilder
  • 3. b
  • 4. ab
  • 5. 堆中对象

StringBuilder方法和StringBuffer一样

  • StringBuilder线程不安全的
  • StringBuffer线程安全
  • StringBuilder

String创建之后不可改变

  • 字符串是一个常量,定义后不可改变。

 String[] ss=new String[100]; String a="";//第一个对象 for(String s:ss){ str+=s;//三个对象 } 3*100+1=301个对象StringBuilder sb=new StringBuilder();//1 for(String s:ss){    sb.append(s);//1 }String str=sb.toString();//1产生对象1+1*100+1=102
  • 当拼接多个对象的时候建议使用StringBuilder(空间+时间),拼接较少时可以用+

测试用时间:System.currentTimeMillis()返回值为long类型(毫秒)

String方法

  • charAt()//获取指定字符串的编号的值

String s="abc";//自动编号
  • length()//获取字符串的长度

练习

  • 1.输入字符串,判断是否为回文字符串

package com.peng.demo;import java.util.Scanner;public class TestDemo {    public static void main(String[] args) {        System.out.println("请输入一个字符串");        Scanner s = new Scanner(System.in);        String ss = s.nextLine();        s.close();        boolean isok = true;        for (int start = 0, end = ss.length() - 1; start < end; start++, end--) {            if (ss.charAt(start) != ss.charAt(end)) {                isok = false;            }        }        if (isok) {            System.out.println("是回文数字!");        } else {            System.out.println("不是回文数字!");        }    }}
  • 2.输入一个字符串,统计字符串中的字母,数字以及其他字符的个数

package com.peng.demo;import java.util.Scanner;public class TestDemo {    public static void main(String[] args) {        System.out.println("请输入一个字符串");        Scanner s = new Scanner(System.in);        String ss = s.nextLine();        s.close();        int sum1 = 0;// 字母个数        int sum2 = 0;// 数字个数        int sum3 = 0;// 其他字符个数        for (int i = 0; i < ss.length(); i++) {            if (65 <= (int) (char) ss.charAt(i)                    && 97 >= (int) (char) ss.charAt(i)) {                sum1++;            } else if (48 <= (int) (char) ss.charAt(i)                    && 57 >= (int) (char) ss.charAt(i)) {                sum2++;            } else {                sum3++;            }        }        System.out.println("字母:" + sum1);        System.out.println("数字:" + sum2);        System.out.println("其他字符:" + sum3);    }}

用'a','z','A','Z','0','9'更准确一些

  • 3.字符串数字求和

package com.peng.demo;import java.util.Scanner;public class TestDemo {    public static void main(String[] args) {        System.out.println("请输入一个字符串");        Scanner s = new Scanner(System.in);        String ss = s.nextLine();        s.close();        int sum = 0;        for (int i = 0; i < ss.length(); i++) {            if (48 <= (int) (char) ss.charAt(i)                    && 57 >= (int) (char) ss.charAt(i)) {                sum += Integer.parseInt(Character.toString(ss.charAt(i)));            }        }        System.out.println(sum);    }}
  • 4.字符串提取数字并排序

package com.peng.demo;import java.util.Arrays;import java.util.Scanner;public class TestDemo {    public static void main(String[] args) {        System.out.println("请输入一个字符串");        Scanner s = new Scanner(System.in);        String ss = s.nextLine();        s.close();        int sum = 0;// 数组大小        for (int i = 0; i < ss.length(); i++) {            if (48 <= (int) (char) ss.charAt(i)                    && 57 >= (int) (char) ss.charAt(i)) {                sum++;            }        }        // 创建数组        int[] arr = new int[sum];        int i = 0;        // 将字符串中的整数存放在数组中        for (int j = 0; j < ss.length(); j++) {            if (48 <= (int) (char) ss.charAt(j)                    && 57 >= (int) (char) ss.charAt(j)) {                arr[i] = Integer.parseInt(Character.toString(ss.charAt(j)));                i++;            }        }        // 排序数组        Arrays.sort(arr);        // 输出数组        System.out.println(Arrays.toString(arr));    }}
  • 输入字符串,记录每个元素出现的次数

package com.peng.demo;

import java.util.Arrays; import java.util.Scanner;

//每种元素出现的次数 public class TestDemo { public static void main(String[] args) { System.out.println("请输入一个字符串"); Scanner s = new Scanner(System.in); String ss = s.nextLine(); s.close(); // 将字符串转化为字符数组 char arr[] = ss.toCharArray(); // 对字符数组进行正序排序,方便后面的前后对比 Arrays.sort(arr); // 记录对应元素的总的出现的次数 int sum = 1; // 进行比较:前后一致进行次数加1,前后不同进行上次数据的输出和下次的新数据的开始 for (int i = 0; i <= arr.length - 2; i++) { if (arr[i + 1] == arr[i]) { sum++; if (i == arr.length - 2) { System.out.println(arr[arr.length - 2] + ":" + sum); } } else { System.out.println(arr[i] + ":" + sum); sum = 1; } } // 对最后的两个数据判断输出:不同才输出 if (arr[arr.length - 1] != arr[arr.length - 2]) { System.out.println(arr[arr.length - 1] + ":" + sum); } } }

运行程序如下:请输入一个字符串ji3488aa3:14:18:2a:2i:1j:1//思路://创建两个数组,一个数组存放字符,另一个数组存放int值进行对对应数组中的字符找出相同的数记录其对应的总数//思路://用Boolean数组+循环标记已经找出的数并输出其对应数的总数//false表示没访问过;true表示被统计过//遍历+后遍历
  • compareTo按字典顺序进行比较(从小到大顺序)

底层机制:    1. 首先把两个字符串转化为字符数组    2. 按位相减--对象字符串的对应位置减去参数字符串的对应位置    3. 如果差不是0,则直接返回;如果差是0,下一位继续相减;    4. 如果每一位相减都为0,如果一个字符串首先遍历完了,返回对象字符串的长度之差结果:0两个字符串一致;正数,则说明对象字符串比较大;反之,参数字符串大;注:有大小写之分
  • compareToIgnoreCase忽略大小写 比较
  • concat拼接两个字符串

String中提供了一系列操作,但是不会改变原字符串【void改变值】【其他不改变】底层:    1. 将字符串转化字符数组    2. 将字符数组合并(System.arraycopy)    3. 将合并的数组转化为字符串(String s=new String(new char[]{'a','c'});)
  • toCharArray将字符串转化为字符数组
  • 字符数组转化为字符串(构造函数)(String s=new String(new char[]{'a','c'});)
  • 字符数组按规则转为字符串(new String(字符数组, 偏移量(开始),转化字符个数))
  • contains判断字符串是否包含指定的参数--返回值(true/false)
  • endsWith判断字符串是否是参数指定结尾【筛选数据】
  • equals判断两个字符串想的【比较的是内容】

重写了equals方法--地址,长度,内容
  • equalsIgnoreCase忽略大小写比较
  • toLowerCase转小写
  • toUpperCase转大写
  • getBytes获取字节数组【统计以B(字节)来的】

byte[] bs=new String("abc").getBytes();补充:编码表(码表)--不止一张,iso-8859-1西欧码表(一个字符一个字节),【插曲:笔画来存储,但是组装特别麻烦,最终放弃这个想法】,GB2312(早期中国),GBK(一个字符两字节--国标码--收录了常见的基本简体和部分繁体汉字),unicode编码体系--常用的【utf-8(一个字符占三个字节)】不同编码表一个字符占不同字节所有的码表默认兼容西欧码表,无论哪个码表,英文字符永远占一个字节//当没有指定编码的时候,默认使用系统平台【windows默认gbk】【unix,Linux默认为utf-8】
  • new String(new Byte[]{},指定下标,长度,编码)字节数组转化为字符串

byte[] bs=s.getBytes("utf-8");//指定编码
  • hashCode

String做过重写--同一个字符串在任何情况下hashCode一定一致,保证这个字符串的唯一性(不分系统和时间)【底层对应的hash码】
  • isEmpty判断字符串是否为一个空串""(看字符串的长度是否为0),不是null!!
  • 字符串为空null,空字符串""
  • null身上没有任何的方法和属性,只要利用bull调用属性和方法会报空指针异常

练习

  • 输入字符串和数字(表示字节个数),根据指定字节获取字符串,不能出现半个字符

注:gbk规定为两个字节存储一个汉字
System.out.println(new String(arr, 0, num - 1, "gbk"));中的-1

package com.peng.demo;import java.io.UnsupportedEncodingException;import java.util.Arrays;import java.util.Scanner;public class TestDemo {    public static void main(String[] args) throws UnsupportedEncodingException {        System.out.println("请输入一个字符串:");        Scanner s = new Scanner(System.in);        String ss = s.nextLine();        System.out.println("请输入字节个数:");        int num = s.nextInt();        s.close();        byte[] arr = ss.getBytes("gbk");        System.out.println(arr.length);        String temp = new String(arr, 0, num);        if (temp.charAt(temp.length() - 1) != ss.charAt(temp.length() - 1)) {            System.out.println(new String(arr, 0, num - 1, "gbk"));        } else {            System.out.println(temp);        }    }}

注意:
1. charAt()执行的返回结果为char,判断字母、数字、 其他字符时可以直接根据字符来判断,即'a','z','A','Z','0','9'来判断;

2. 如果是求字符串中数字和的话,可以这样做:Integer.parseInt(Character.toString(s.charAt(i)));即现将字符转化为字符串,再将字符串转化为整数。

3. c-'0'

4. 突发小问题:
字符串常量,程序结束前都存在
编码:char都为两字节;String考虑编码;java文件用Unicode编码 

原创粉丝点击