第3章 - Java 数组 和 字符串

3- Java 数组字符串

 

8 数组

(basic.array.ArrayDemo)

概念同一种数据类型的数据集合其实数组就是一个容器

好处可以自动给数组中的元素从0开始编号方便操作这些元素

说明数组作为对象允许使用new关键字进行内存分配在使用数组之前必须首先声明数组变量所属的类型

 

8.1 一维数组

1.概念:一组相同类型数据的集合

2.格式:

    1).数组元素类型数组名字[] = new 数组元素类型[数组元素个数]

    2).数组元素类型[] 数组名字  = new 数组元素类型[数组元素个数]

    3).数组元素类型[] 数组名= new 元素类型[]{元素元素, ...};

    4).数组元素类型[] 数组名= {元素元素, ...};

       int arr[] = new int[5];

       int[] arr = new int[5];

       int[] arr = new int[]{3, 5, 1, 7};// 定义并初始化

       int[] arr = {3, 5, 1, 7};

3.说明:

    1).数组元素类型决定数组的数据类型(Java任意数据类型)

    2).数组名字合法的标识符

    3).符号"[]": 指明该变量是一个数组类型变量单个"[]"表示要创建的数组是一维数组

    4).new: 对数组分配空间的关键字(因为数组是作为对象允许使用new关键字进行内存分配的使用new关键字时候整数类型默认初始化值为0)

    5).数组元素的个数指定数组中变量的个数即数组的长度

4.内存例子1:

(basic.demo08.MemoryDiagram1)

    publicstaticvoidmain(String[] args) {

        int[] arrnewint[3];

        arr[0] = 89;

        int[] arr2arr;

        System.out.println(arr[0]);

        arrnull;

    }

图示说明:

    1).主方法main先压栈

    2).int[] arr: arr压栈

    3).new int[3]: 放在堆里通过new关键字在堆中开辟空间内存在存储数据的时候会开辟内存地址(: 0x0045(16进制)的地址空间数组有脚标划分3个格子每个格子有对应的下标标号并默认初始化设置为0) 

    4).然后对应arr地址就是0x0045, arr就指向该地址的对象数组(这种就叫做引用数据类型(C就叫指针))

    5).修改arr指向地址中的下标0的值为89

    6).此处不难理解当定义int[] arr2 = arr, 实际上就是将arr的指向地址赋给arr2

    7).找到arr指向地址中的下标0的值显示

    8).当想取消arr的指向赋值arr=null

    9).arr=null之后, Java自动回收机制会不定时的回收垃圾数据

 

8.2 二维数组(多维数组同理)

1.概念:如果一维数组中的各个元素仍然是一维数组那么它就是一个二维数组常用于表第一个下标代表行第二个下标代表列

2.格式:

    1).int arr[][] = new int[2][4];

       int[][] arr = new int[2][4];

       {1}.定义了名称为arr的二维数组

       {2}.二维数组中有2个一维数组

       {3}.每一个一维数组中有4个元素

       {4}.一维数组的名称分别为arr[0], arr[1]

       {5}.给第一个一维数组1脚标位赋值位78写法是: arr[0][1] = 78

    2).int arr[][] = new int[2][];

       int[][] arr = new int[2][];

       {1}.二维数组中有3个一维数组

       {2}.每个一维数组都是默认初始化值null

       {3}.可以对这个三个一维数组分别进行初始化

           arr[0] = new int[2];  arr[1] = new int[3];

    3).int[][] arr = {{3, 1, 7}, {5, 8, 2, 9}, {4, 1}}

3.内存例子2:

(basic.array.MemoryDiagram2)

    publicstaticvoidmain(String[] args) {

        int[][] arrnewint[3][2];

        arr[1][1] = 89;

        arr[2][2] = 89;  // error

        // 分别对二维数组中的每一个小数组进行初始化

        int[][] arr2newint[3][];

        arr2[0] = newint[2];

        arr2[1] = newint[1];

        arr2[2] = newint[3];

    }

图示说明:

    1).主方法main先压栈

    2).int[][] arr: arr压栈

    3).new int[3][2]:进堆通过new关键字在堆中开辟空间如图创建地址0x0034指向赋给arr, 然后因为二维数组中就是小地址再开辟3个地址对应就是小数组的地址

    4).arr[1][1]=89, 就是先找0x0034, 在找到下标1, 即地址0x0089的下标1赋值88

    5).arr[2][2]=89, 找到0x0034, 在找0x0012, 但是不存在下标2的对应位置所以这段代码报错

 

8.3 数组-常见操作(详细见程序的demo)

(basic.array.ArrayMethod, ArrayTest)

8.3.1 遍历(自己实现)

8.3.2 获取最值(自己实现)

8.3.3 选择排序(SelectSort)

    每一趟从待排序的数据元素中选出最小(或最大)的一个元素顺序放在已排好序的数列的最后直到全部待排序的数据元素排完。

    选择排序是不稳定的排序方法, n个记录的文件的直接选择排序可经过n1趟直接选择排序得到有序结果

 

8.3.4 冒泡排序(BubbleSort)

    冒泡排序是交换排序中一种简单的排序方法它的基本思想是对所有相邻记录的关键字值进行比效如果是逆顺(a[j]>a[j+1]), 则将其交换最终达到有序化其处理过程为

    1).将整个待排序的记录序列划分成有序区和无序区初始状态有序区为空无序区包括所有待排序记录

    2).对无序区从前向后依次将相邻记录的关键字进行比较若逆序将其交换从而使得关键字值小的记录向上"飘浮"(左移), 关键字值大的记录好像石块向下"堕落"(右移)

    每经过一趟冒泡排序都使无序区中关键字值最大的记录进入有序区对于n个记录组成的记录序列最多经过n-1趟冒泡排序就可以将这n个记录重新按关键字顺序排列

:想象轻()的浮在上面(), ()的落在下面()

 

8.3.5 基本查找(自己实现)

8.3.6 折半查找(二分查找HalfSearch)

    优点比较次数少查找速度快平均性能好

    缺点要求待查表为有序表且插入删除困难

    场景:不经常变动而查找频繁的有序列表

    折半查找法也称为二分查找法它充分利用了元素间的次序关系采用分治策略可在最坏的情况下用O(log n)完成搜索任务

    它的基本思想是n个元素分成个数大致相同的两半a[n/2]与欲查找的x作比较如果x=a[n/2]则找到x, 算法终止如果x<a[n/2], 则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列). 如果x>a[n/2], 则我们只要在数组a的右半部继续搜索x

 

 

8.4 byte数组的一些使用

8.4.1 byte数组的编解码

(basic.array.EncodeDemo)

    private static String ENCODING_GBK = "GBK";

    private static String ENCODING_UTF8 = "UTF-8";

 

    public static void main(String[] args) throws IOException {

        String str = "谢谢";

        byte[] encodeGbkByte = encodeDemo(str, ENCODING_GBK);

        printBytes(encodeGbkByte);

 

        String decodeUtf8 = decodeDemo(encodeGbkByte, ENCODING_UTF8);

        System.out.println(decodeUtf8);

 

        byte[] encodeUtf8Byte = encodeDemo(decodeUtf8, ENCODING_UTF8);

        printBytes(encodeUtf8Byte);

 

        String decodeGbk = decodeDemo(encodeUtf8Byte, ENCODING_GBK);

        System.out.println(decodeGbk);

    }

 

    private static byte[] encodeDemo(String str, String charset) {

        try {

            return str.getBytes(charset);

        } catch (Exception e) {

            throw new RuntimeException(e.getMessage());

        }

    }

 

    private static String decodeDemo(byte[] byteArray, String charset) {

        try {

            return new String(byteArray, charset);

        } catch (Exception e) {

            throw new RuntimeException(e.getMessage());

        }

    }

 

    private static void printBytes(byte[] buf) {

        for (byte b : buf) {

            System.out.print(b + " ");

        }

        System.out.println();

    }

 

8.5 Arrays(数组工具类)

(basic.demo08.ArraysDemo)

    此类包含用来操作数组(比如排序和搜索)的各种方法还包含一个允许将数组作为列表来查看的静态工厂.

    除非特别注明否则如果指定数组引用为null, 则此类中的方法都会抛出NullPointerException.

Arrays常用工具类方法归类:大部分方法都含有基础数据的参数,以下省略说明:

    typeAllbyteshortintlongfloatdoublecharObject

    typeBasicbyteshortintlongfloatdoublechar

1).排序

    void sort(typeAll[] a) // 对指定Object型数组按升序排序

    void sort(Object[] a, int fromIndex, int toIndex) // 指定范围排序

    <T> void sort(T[] a, Comparator<? super T> c) // 指定比较器顺序排序

    <T> void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)

    void parallelSort(typeBasic[] a) // 并行排序

    void parallelSort(typeBasic[] a, int fromIndex, int toIndex)

    <T extends Comparable<? super T>> void parallelSort(T[] a) 

    <T extends Comparable<? super T>> void parallelSort(T[] a, int fromIndex, int toIndex)  

    <T> void parallelSort(T[] a, Comparator<? super T> cmp) // 指定比较器顺序并行排序

    <T> void parallelSort(T[] a, int fromIndex, int toIndex, Comparator<? super T> cmp)

2).搜索

    int binarySearch(typeAll[] a, typeAll key) // 使用二分搜索法来搜索指定的下标值

    int binarySearch(typeAll[] a, int fromIndex, int toIndex, typeAll key)

    <T> int binarySearch(T[] a, T key, Comparator<? super T> c)

    <T> int binarySearch(T[] a, int fromIndex, int toIndex, T key, Comparator<? super T> c)

3).比较

    boolean equals(typeAll[] a, typeAll [] a2)  // 如果两个指定的数组彼此相等,则返回true

4).赋值

    void fill(typeAll[] a, typeAll val) // 将指定的值赋值给数组所有元素

    void fill(typeAll[] a, int fromIndex, int toIndex, typeAll val)

5).复制

    <T> T[] copyOf(T[] original, int newLength) 复制指定的数组截取或用null填充(如有必要), 以使副本具有指定的长度

    <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) 复制指定的数组截取或用null填充(如有必要), 以使副本具有指定的长度

    <T> T[] copyOfRange(T[] original, int from, int to) 将指定数组的指定范围复制到一个新数组

    <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) 

    typeBasic[] copyOf(typeBasic[] original, int newLength) // 复制指定的数组截取或用0[:booleanfalse, charnull, 其余用0]填充(如有必要), 以使副本具有指定的长度

    typeBasic[] copyOf(typeBasic[] original, int from, int to)

6).Array -> List

    <T> List<T> asList(T... a) // 返回一个受指定数组支持的固定大小的列表

7).获取

    int hashCode(typeAll[] a)  // 基于指定数组的内容返回哈希码

    int deepHashCode(Object a[])  // 基于指定数组的"深层内容"返回哈希码

    boolean deepEquals(Object[] a1, Object[] a2) // 如果两个指定数组彼此是深层相等的则返回true

    String toString(typeAll[] a) // 返回指定数组内容的字符串表示形式

    String deepToString(Object[] a) 返回指定数组"深层内容"的字符串表示形式

8).其他

    <T> void legacyMergeSort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)    

    <T> void parallelPrefix(T[] array, BinaryOperator<T> op)    

    <T> void parallelPrefix(T[] array, int fromIndex, int toIndex, BinaryOperator<T> op)    

    void parallelPrefix(long[] array, LongBinaryOperator op)    

    void parallelPrefix(long[] array, int fromIndex, int toIndex, LongBinaryOperator op)    

    void parallelPrefix(double[] array, DoubleBinaryOperator op)    

    void parallelPrefix(double[] array, int fromIndex, int toIndex, DoubleBinaryOperator op)    

    void parallelPrefix(int[] array, IntBinaryOperator op)  

    void parallelPrefix(int[] array, int fromIndex, int toIndex, IntBinaryOperator op)  

    <T> void setAll(T[] array, IntFunction<? extends T> generator) 

    <T> void parallelSetAll(T[] array, IntFunction<? extends T> generator)  

    void setAll(int[] array, IntUnaryOperator generator)    

    void parallelSetAll(long[] array, IntToLongFunction generator)  

    void setAll(double[] array, IntToDoubleFunction generator)  

    void parallelSetAll(double[] array, IntToDoubleFunction generator)  

    <T> Spliterator<T> spliterator(T[] array)   

    <T> Spliterator<T> spliterator(T[] array, int startInclusive, int endExclusive) 

    Spliterator.OfInt spliterator(int[] array)  

    Spliterator.OfInt spliterator(int[] array, int startInclusive, int endExclusive)    

    Spliterator.OfLong spliterator(long[] array)    

    Spliterator.OfLong spliterator(long[] array, int startInclusive, int endExclusive)  

    Spliterator.OfDouble spliterator(double[] array)    

    Spliterator.OfDouble spliterator(double[] array, int startInclusive, int endExclusive)  

    <T> Stream<T> stream(T[] array) 

    <T> Stream<T> stream(T[] array, int startInclusive, int endExclusive)   

    IntStream stream(int[] array)   

    IntStream stream(int[] array, int startInclusive, int endExclusive) 

    LongStream stream(long[] array) 

    LongStream stream(long[] array, int startInclusive, int endExclusive)   

    DoubleStream stream(double[] array) 

    DoubleStream stream(double[] array, int startInclusive, int endExclusive)  

 

 

 

9 字符串

9.1.String

    String类即字符串类型(不可变类), 并不是Java的基本数据类型但可以像基本数据类型一样使用用双引号括起来进行声明Java中用String类的构造方法来创建字符串变量

特点

    1).字符串是一个特殊的对象    2).字符串对象一旦被初始化就不会被改变查看源码可以看到定义

    public final classString

 

9.2.String的方法

(basic.str.StringDemo, StringMethod)

    底层实现: char value[]; 用类型是char的数组来存储数据

    String主要方法如下:

1).构造函数

    public String() // 初始化一个新创建的String对象默认为:""

    public String(String original)

    public String(char value[])

    public String(char value[], int offset, int count)

    public String(int[] codePoints, int offset, int count)

    public String(byte bytes[], String charsetName) 使用指定的charset解码指定的byte数组

    public String(byte bytes[], int offset, int length, String charsetName)

    public String(byte bytes[], int offset, int length, Charset charset) 

    public String(byte bytes[], Charset charset)

    public String(byte bytes[], int offset, int length)

    public String(byte bytes[])

    public String(StringBuffer buffer)

    public String(StringBuilder builder) 

过时的构造函数:该方法无法将字节正确地转换为字符.JDK1.1开始完成该转换的首选方法是使用带有Charset、字符集名称或使用平台默认字符集的String构造方法

    public String(byte ascii[], int hibyte, int offset, int count) 

    public String(byte ascii[], int hibyte)

2).判断

    boolean isEmpty() // 当且仅当length()时返回true

    boolean startsWith(String prefix) //   测试此字符串是否以指定的前缀开始

    boolean startsWith(String prefix, int toffset) // 同上,区别:从指定索引开始的字符串

    boolean endsWith(String suffix) //测试此字符串是否以指定的后缀结束

    boolean matches(String regex)   // 测试此字符串是否匹配给定的正则表达式

    boolean contains(CharSequence s)  // 当且仅当此字符串包含指定的char 值序列时,返回true

3).比较

    int compareTo(String anotherString) // 按字典顺序比较两个字符串

       如:"abc".compareTo("acz")结果为-1, bc,-1

    int compareToIgnoreCase(String str) // 按字典顺序比较两个字符串不考虑大小写

    boolean equals(Object anObject) //将此字符串与指定的对象比较(内容

    boolean equalsIgnoreCase(String anotherString) // 忽略大小写比较

    boolean contentEquals(StringBuffer sb) // 将此字符串与指定的StringBuffer比较

    boolean contentEquals(CharSequence cs) // 将此字符串与指定的CharSequence比较

    boolean regionMatches(int toffset, String other, int ooffset, int len) // 测试两个字符串区域是否相等

    boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)  // 测试两个字符串区域是否相等

4).获取

    int length()    返回此字符串的长度

    char charAt(int index)  返回指定索引处的char

    int codePointAt(int index)  返回指定索引处的字符(Unicode代码点)

    int codePointBefore(int index)  返回指定索引之前的字符(Unicode代码点)

    int codePointCount(int beginIndex, int endIndex)    返回此String的指定文本范围中的Unicode代码点数

    int offsetByCodePoints(int index, int codePointOffset)  返回此String中从给定的index处偏移codePointOffset个代码点的索引

    void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) 将字符从此字符串复制到目标字符数组

    void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) 已过时该方法无法将字符正确转换为字节JDK 1.1完成该转换的首选方法是通过getBytes()方法该方法使用平台的默认字符集

    byte[] getBytes(String charsetName) 使用指定的字符集将此String 编码为byte 序列,并将结果存储到一个新的byte 数组中

    byte[] getBytes(Charset charset)    使用给定的charset 将此String 编码到byte 序列并将结果存储到新的byte 数组

    byte[] getBytes()   使用平台的默认字符集将此String 编码为byte 序列并将结果存储到一个新的byte 数组中

    int hashCode() // 返回此字符串的哈希码

    int indexOf(int ch) // 返回指定字符在此字符串中第一次出现处的索引

    int indexOf(int ch, int fromIndex) // 从指定的索引开始搜索

    int indexOf(String str)

    int indexOf(String str, int fromIndex)

    int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引

    int lastIndexOf(int ch, int fromIndex)

    int lastIndexOf(String str)

    int lastIndexOf(String str, int fromIndex)

    String substring(int beginIndex)    返回一个新的字符串它是此字符串的一个子字符串

    String substring(int beginIndex, int endIndex)  返回一个新字符串它是此字符串的一个子字符串

    CharSequence subSequence(int beginIndex, int endIndex)  返回一个新的字符序列它是此序列的一个子序列

    String concat(String str)   将指定字符串连接到此字符串的结尾

    String replace(char oldChar, char newChar)  返回一个新的字符串它是通过用newChar 替换此字符串中出现的所有oldChar 得到的

    String replaceFirst(String regex, String replacement)   使用给定的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串

    String replaceAll(String regex, String replacement) 使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串

    String replace(CharSequence target, CharSequence replacement)   使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串

    String[] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串

    String[] split(String regex)    根据给定正则表达式的匹配拆分此字符串

    String toLowerCase(Locale locale)   使用给定Locale 的规则将此String 中的所有字符都转换为小写

    String toLowerCase() // 使用默认语言环境的规则将此String 中的所有字符都转换为小写

    String toUpperCase(Locale locale) // 使用给定Locale的规则将所有字符都转换为大写

    String toUpperCase() // 使用默认语言环境的规则将此String 中的所有字符都转换为大写

    String trim()   返回字符串的副本,忽略前导空白和尾部空白

    String toString()   返回此对象本身(它已经是一个字符串!)

    char[] toCharArray()    将此字符串转换为一个新的字符数组

    native String intern()  返回字符串对象的规范化表示形式

5).静态方法

    static String format(String format, Object... args) 使用指定的格式字符串和参数返回一个格式化字符串

    static String format(Locale l, String format, Object... args)   使用指定的语言环境、格式字符串和参数返回一个格式化字符串

    static String valueOf(boolean/char/int/long/float/double b) // 返回指定类型参数的字符串表示形式

    static String valueOf(Object obj)   返回Object 参数的字符串表示形式

    static String valueOf(char data[])  返回char 数组参数的字符串表示形式

    static String valueOf(char data[], int offset, int count) // 返回char 数组参数的特定子数组的字符串表示形式

    static String copyValueOf(char data[], int offset, int count) // 返回指定数组中表示该字符序列的String

    static String copyValueOf(char data[])  返回指定数组中表示该字符序列的String

    static String join(CharSequence delimiter, CharSequence... elements)    

    static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements)  

 

9.2.1 字符串连接说明

    连接多个字符串两个连接的字符串之间用"+"相连, "+"就是字符串的连接符连接之后生成一个新的字符串

:Java中的字符串不能分开两行中写如果一个字符串太长需要将这个字符串分在两行上书写此时可以使用"+"将两个字符串连起来并在加号处换行】

    在字符串和其他数据类型连接时同样使用"+"连接符连接之后的返回值是字符串

:只要"+"运算符的一个操作类型是字符串编译器就会将另外的操作类型转换成字符串形式所以应谨慎地将其他数据类型与字符串相连】

 

9.2.2 Stringintern方法

(basic.str.StringDemo)

    如果池中包含一个等于此String对象的字符串则返回池中的字符串否则将此String对象添加到池中并返回此String对象的引用

    /**

     * public String intern()返回字符串对象的规范化表示形式。

     * 如果池中包含一个等于此String对象的字符串,则返回池中的字符串

     * 否则将此String对象添加到池中,并返回此String对象的引用

     */

    publicstaticvoidmain(String[] args) {

        String s0 "kvill";

        String s1 newString("kvill");

        String s2 newString("kvill");

        System.out.println(s0 == s1);     //false

        s1.intern();

        s2 s2.intern();

        System.out.println(s0 == s1);//false

        System.out.println(s0 == s1.intern());//true

        System.out.println(s0 == s2);//true

    }

 

 

9.2格式化字符串

(示例: basic.str.format.DataFormat, TimeFormat, DateAndTimeFormat, GeneralFormat, SystemOutPrintf)

    格式化字符串主要包括日期格式化、时间格式化、日期/时间组合的格式化和常规类型格式化

9.2.1 格式化方法

1.format(String format, Object... args)

    format: 格式化转换符

    args: 格式化字符串格式说明符引用的参数如果还有格式说明符以外的参数则忽略这些额外的参数

    返回值一个格式化的字符串

2).format(Local l, String format, Object... args)

    l: 格式化过程要应用的语言环境如果lnull, 则不进行本地化

    format: 格式化转换符

    args: 格式化字符串格式说明符引用的参数如果还有格式说明符以外的参数则忽略这些额外的参数

    返回值:一个格式化的字符串

 

9.2.2 日期格式化

常见的日期格式化转换符

转换符

说明

示例

%te

一个月中的某一天

6

%tb

指定语言环境的月份简称

Feb(英文), 二月(中文)

%tB

指定语言环境的月份全称

February(), 二月()

%ta

指定语言环境的星期几简称

Mon(), 星期一()

%tA

指定语言环境的星期几全称

Monday(), 星期一()

%tc

包括全部日期和时间信息

星期二 三月25 13:37:22 CST 2008

%tY

4位年份

2008

%ty

2位年份

08

%tj

一年中的第几天(001~366)

085

%tm

月份

03

%td

一个月中的第几天(0~31)

02

 

9.2.3 时间格式化

常见的时间格式化转换符

转换符

说明

示例

%tH

2位数字的24时制小时(00~23)

14

%tI

2位数字的12时制小时(01~12)

05

%tk

2位数字的24时制小时(0~23)

5

%tl

2位数字的12时制小时(1~12)

10

%tM

2位数字的分钟(00~59)

05

%tS

2位数字的秒数(00~60)

12

%tL

3位数字的毫秒数(000~999)

920

%tN

9位数字的微秒数(000000000~999999999)

062000000

%tp

指定语言环境下上午或下午标记

下午(), pm()

%tz

相对于GMT RFC82格式的数字时区偏移量

+0800

%tZ

时区缩写形式的字符串

CST

%ts

1970-01-01 00:00:00至现在经过的秒数

1206426737

%tQ

1970-01-01 00:00:00至现在经过的毫秒数

1206426737453

 

9.2.4 日期时间组合格式化

常见的时间格式化转换符

转换符

说明

示例

%tF

"--"格式(4位年份)

2008-03-25

%tD

"//"格式(2位年份)

03/25/08

%tc

全部日期和时间信息

星期二三月 25 15:20:00 CST 2008

%tr

"::PM(AM)"格式(12时制)

03:22:06 下午

%tT

"::"格式(24时制)

15:25:50

%tR

":"格式(24时制)

15:25

 

9.2.5 常规类型格式化

常见的类型格式化转换符

转换符

说明

示例

%b, %B

结果被格式化为布尔值

true

%h, %H

结果被格式化为散列码

A05A5198

%s, %S

结果被格式化为字符串类型

"abcd"

%c, %C

结果被格式化为字符类型

'a'

%d

结果被格式化为十进制整数

40

%o

结果被格式化为八进制整数

11

%x, %X

结果被格式化为十六进制整数

4b1

%e

结果被格式化为用计算机科学计数法表示的十进制数

1.700000e+01

%a

结果被格式化为带有效位数和指数的十六进制浮点值

0X1.C0000000000001P4

%n

结果为特定平台的行分隔符

 

%%

结果为字面值'%'

%

%h, %H

哈希值

cd

 

9.2.5 System.out.printf

printf格式控制的说明

转换符

说明

%

表示格式说明的起始符号不可缺少

-

-表示左对齐输出如省略表示右对齐输出

0

0表示指定空位置0, 如省略表示指定空位不填

m.n

m指域宽即对应的输出项在输出设备上所占的字符串

n指精度用于说明输出的实型数的小数位数缺省n=6

lh

验证失败

l对整型指long对实型指double

h用于将整型的格式字符修正为short

d格式用来输出十进制整数

%d

按整型数据的实际长度输出

%md

m为指定的输出字段的宽度如果数据位数小于m, 左端补空格若大于m, 按实际位数输出: printf("%5d\n", 123)

%-md

-代表左对齐如果数据位数小于m, 右端补空格若大于m, 按实际位数输出: printf("%-5d\n", 123)

%05d

0代表有空位置显示: printf("%05d\n", 123)

o格式用来输出八进制整数

%o

按整型数据的实际长度输出

%mo

m为指定的输出字段的宽度如果数据位数小于m, 左端补空格若大于m, 按实际位数输出: printf("%5o\n", 123)

%-mo

-代表左对齐如果数据位数小于m, 右端补空格若大于m, 按实际位数输出: printf("%-5o\n", 123)

%05o

0代表有空位置显示: printf("%05o\n", 123)

x格式用来输出十六进制整数

%x

按整型数据的实际长度输出

%mx

m为指定的输出字段的宽度如果数据位数小于m, 左端补空格若大于m, 按实际位数输出: printf("%5x\n", 123)

%-mx

-代表左对齐如果数据位数小于m, 右端补空格若大于m, 按实际位数输出: printf("%-5x\n", 123)

%05x

0代表有空位置显示: printf("%05x\n", 123)

c格式用来输出字符

%c

输出字符: printf("%c\n", 97)

f格式用来输出浮点数

%f

按浮点数据的输出小数默认精确到6

%m.nf

m为指定的整数部分输出位数,m没啥影响

n为指定的小数部分的输出位数四舍五入到精确的位数

%-m.nf

-代表左对齐

e格式用来输出浮点数

%e

按浮点数据的输出小数默认精确到6

%m.ne

m为指定的整数部分输出位数,m没啥影响

n为指定的小数部分的输出位数四舍五入到精确的位数

%-m.ne

-代表左对齐

s格式用来输出浮点数

%s

 

%ms

 

%-ms

 

%m.nf

n代表要输出的长度从左到右

%-m.nf

 

g格式用来输出浮点数

%g

 

%mg

 

%-mg

 

%m.ng

n代表要输出的长度从左到右

%-m.ng

 

 

 

 

9.3 正则表达式

(basic.str.regex.RegexDemo, RegexCrawler)

9.3.1 判断是否符合正则表达式的方法

    为了检查输入的数据是否满足某种格式JDK1.4开始可以使用String类的matches()方法进行判断

    boolean matches(String regex)

       1).regex: 指定的正则表达式

       2).返回值返回boolean类型

    该方法用于告知当前字符串是否匹配参数regex指定的正则表达式返回值是boolean类型如果当前字符串与正则表达式匹配则该方法返回true, 否则返回false

 

9.3.2 正则表达式的元字符

    正则表达式是由一些含有特殊意义的字符组成的字符串这些含有特殊意义的字符串称为元字符

元字符

正则表达式中的写法

含义

.

"."

代表任意一个字符

\d

"\\d"

代表0~9的任何一个数字

\D

"\\D"

代表任何一个非数字字符

\s

"\\s"

代表空白字符'\t','\n'

\S

"\\S"

代表非空白字符

\w

"\\w"

代表可用作标识符的字符但不包括"$"

\W

"\\W"

代表不可用于标识符的字符

\p{Lower}

\\p{Lower}

代表小写字母{a~z}

\p{Upper}

\\p{Upper}

代表小写字母{A~Z}

\p{ASCII}

\\p{ASCII}

ASCII字符

\p{Aplha}

\\p{Aplha}

字母字符

\p{Digit}

\\p{Digit}

十进制数组,[0~9]

\p{Alnum}

\\p{Alnum}

数字或字母字符

\p{Punct}

\\p{Punct}

标点符号: !#$%&'()*+,-./:;<=>?@[\]^_`{|}~

\p{Graph}

\\p{Graph}

可见字符: [\p{Alnum}\p{Punct}]

\p{Print}

\\p{Print}

可打印字符: [\p{Graph}\x20]

\p{Blank}

\\p{Blank}

空格或制表符: [\t]

\p{Cntrl}

\\p{Cntrl}

控制字符: [\x00~\x1F\x7F]

 

9.3.3 正则表达式的限定符

    在使用正则表达式时如果需要某一个类型元字符多次输出逐个输入就相当麻烦这时可以使用正则表达式的限定元字符来重复次数

限定修饰符

意义

示例

?

0次或1

A?

(.?)

非贪婪匹配

(.?)

*

0次或多次

A*

+

1次或多次

A+

{n}

正好出现n

A{2}

{n,}

至少出现n

A{3,}

{n,m}

出现n~m

A{2,6}

 

9.3.4 方括号中元字符的含义

字符

含义

[abc]

表示a,bc

[^abc]

表示a,b,c之外的任何字符

[a-zA-Z]

a~zA~Z的任何字符

[a-d[m-p]]

a~dm~p的任何字符

[a-z&&[def]]

d,ef

[a-z&&[^bc]]

a~z之间不含bc的所有字符

[a-z&&[^m-p]]

a~z之间不含m~p的所有字符

正则表达式对字符串的常见操作:

    1).匹配: 其实使用的就是String类中的matches方法. 

    2).切割: 其实使用的就是String类中的split方法.  组:((A)(B(C)))

    3).替换: 其实使用的就是String类中的replaceAll()方法. 

    4).获取: 案例: 网页爬虫

    将正则规则进行对象的封装

    Pattern p = Pattern.compile("a*b");  

   // 通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher .

    Matcher m = p.matcher("aaaaab");

    // 通过Matcher匹配器对象的方法对字符串进行操作。

    boolean b = m.matches();

 

 

9.4 StringBuffer(字符串缓冲区)

(basic.demo09.StringBufferDemo)

    StringBuffer: 就是字符串缓冲区用于存储数据的容器

特点:

    1).长度的可变  2).可以存储不同类型的数据  3).最终要转成字符串进行使用. 4).可以对字符串进行修改

存储数据的容器应该具备什么功能?  CRUD

    C(create)U(update)R(read)D(delete)

1).添加

    StringBuffer append(data); 

    StringBuffer append(StringBuffer sb)

    StringBuffer insert(index, data);

2).删除

    StringBuffer delete(start, end);    // 包含头不包含尾

    StringBuffer deleteCharAt(int index);   // 删除指定位置的元素

3).查找

    char charAt(index);

    int indexOf(string);

    int lastIndexOf(string);

4).修改

    StringBuffer replace(start, end, string);

    void setCharAt(index, char);

5).其他

    length();                   // 获取长度

    setLength(int length);       // 设置长度

    reverse();                  // 反转显示

    toString();                  // 字符串格式

 

9.5 StringBuilder(字符串生成器)

(basic.demo09.StringBuilderDemo)

    StringBuilder类即字符串生成器新创建的StringBuilder对象初始容量是16个字符可以指定初始长度

    jdk1.5以后出现了功能(方法一直)StringBuffer一模一样的对象就是StringBuilder

不同的是

    1).StringBuffer是线程同步的通常用于多线程.(源码中可以发现方法带有synchronized关键字)

    2).StringBuilder是线程不同步的通常用于单线程它的出现提高效率

    3).在字符串缓存被单个线程使用时要比StringBuffer类快

JDK升级:  1).简化书写,2).提高效率,3).增加安全性

 

 

 

 

 

代码清单1-1 xxx或者代码

(com.vwFisher)

classLava {

    privateintspeed= 5;// 5 kilometers per hour

    voidflow() {

    }

}

 

 

转载于:https://my.oschina.net/vwFisher/blog/2208468

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值