Java 入门 (十)

String类(续)

常见功能

转换功能

byte[] getBytes()
char[] toCharArray()
String toLowerCase()
String toUpperCase()
String concat(String str)
package top.zunmx.u1;

// ALC-Master
public class Demo1 {
    public static void main(String[] args) {
        String str="中国你好China123";
        String str1="测试拼接字符串";
        byte[] bys = str.getBytes();
        for (int i = 0; i < bys.length; i++) {
            System.out.print(bys[i]+" ");
        }System.out.println();
        for (int i = 0; i < bys.length; i++) {
            System.out.print((char)bys[i]+" ");
        }System.out.println();
        char chs[] = str.toCharArray();
        System.out.println(chs);
        for(int i = 0 ; i <chs.length;i++) {
            System.out.print(chs[i]+" ");
        }System.out.println();
        System.out.println(str.toLowerCase());
        System.out.println(str.toUpperCase());
        System.out.println(str.concat(str1));
    }
}

其它功能

String trim();
String replace(CharSequence target, CharSequence replacement); //CharSequence 包含String

Scanner类

import java.util.Scanner;

构造方法

public Scanner(InputStream source)
//平常使用的Scanner sc = new Scanner(System.in); 就是此构造方法

常见方法

可以分为两大类:nextXxx和hasNextXxx

例如:

 String next() 
 boolean nextBoolean() 
 byte nextByte() 
 double nextDouble() 
 float nextFloat() 
 int nextInt() 
 String nextLine() 
 long nextLong() 
 short nextShort() 
 short nextShort(int radix)  

接收字符串

next() // tab 换行 空格作为结束标志
nextLine() // 换行作为结束标志

注意:每一个数据的录入都有一个hasNextXxx来判断是否为相应类型的输入,返回值为布尔型

遇到的问题

先接收一个除nextLine之外方法,再用nextLine进行接收的话,会在接受完第一个数据后直接停止,而nextLine没有接收到数据。

键盘录入会将我们录入的数据存入到一块内存中,通过next这种方法来从这个内存中获取。

比如:nextInt 现存如内存中的数据是666/r 后面再来一个nextInt的话,这个nextInt会扫描到内存中的剩余的/r(因为nextInt并不以回车作为结束的标志,所以这个nextInt会不管这个/r,而继续进行录入)

解决问题

  1. 先用一个nextLine接收之前的换行,在用一个nextLine接收数据
  2. 再创建一个Scanner对象,用来接收nextLine数据
  3. 用next方法来替换nextLine

Math类

java.lang 包下,因此不需要import

Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

常见方法

abs                 绝对值
sqrt                平方根
cbrt                立方根
floor               返回值小于等于参数,并等于某个整数。
eceil               返回值大于等于参数,并等于某个整数。
max                 返回最大值
min                 返回最小值
random              返回一个[0,1)之前的double型随机数
round               四舍五入

常量

PI                  圆周率
E                   自然对数的底数

System类

java.lang 包下,因此不需要import

静态变量

System.in           标准输入流,关联到键盘,键盘录入的内容
System.out          标准输出流,关联到控制台,用于打印。
System.err          标准错误六,也能打印在控制台,红色

常见方法

currentTimeMiles        返回当前的时间戳
gc                      强制垃圾回收

StringBuilder

StringBuilder是在java.lang包下的,所以不用到包就可以直接使用

一个可变的字符序列。不同步(没有加锁的),效率会高一点

主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据

StringBuilder(); //创建一个容量为16的StringBuilder对象
StringBuilder(CharSequence seq); //创建一个指定容量的SB对象
StringBuilder(String str); //创建一个指定字符串的SB,容量为16+传入字符串长度

常见功能

添加或插入功能

append(text)
insert(index,text)

注意:StringBuilder可以扩容,如果默认容量为16,那么在第一次扩容时会变成16*2+2,后续如果再超过这个长度,那么SB的容量就和字符串长度保持一致。

删除功能

deleteCharAt(index)
delete(begin,end)

注意:delete包括左不包括右,end值可以大于length,不会报错,但是后面的没有意义。

替换和反转

replace(begin,end,text)
reverse()

查询功能

indexOf(str)
length() 获取字符串长度
capacity() 获取StringBuilder容量的方法

StringBuilder/StringBuffer

区别:

  1. 出现的版本不同

StringBuilder 1.5

StringBuffer 1.0

  1. 安全性不同

StringBuilder 不同步

StringBuffer 同步

  1. 效率不同

StringBuilder 高

StringBuffer 低

StringBuilder和String当作参数传递

image-20201130151344293.png

包装类类型

之前学习的基本数据类型只能做一些简单的运算,一旦涉及到比较复杂的运算的时候,就无能为力了。但是我们知道方法中时可以帮助我们完成这些复杂的操作的,但是基本数据类型是没有方法的,只有引用数据类型才有方法。所以java给基本数据类型都通过了一个对应的引用数据类型。这种类型也被我们称为包装类型。

基本数据类型 包装类类型

  • byte[Byte]
  • short[Short]
  • long[Long]
  • float[Float]
  • double[Double]
  • boolean[Boolean]
  • int[Integer]
  • char[Character]

Integer

构造方法

Integer(int value)
Integer(String s)

常见方法

int intValue();
static Integer valueOf(int i);
static Integer valueOf(String s);
static Integer toBinaryString(int i);
static Integer toOctalString(int i);
static Integer toHexString(int i);
static int parseInt(String s);
static String ValueOf(int i, int radix); //进制

自动装箱拆箱现象

  • 装箱:将基本数据类型通过构造或者方法提升为其对应的包装类类型
  • 拆箱:将包装类类型通过构造或者方法将为其对应的基本数据类型
  • 自动装箱:将基本数据类型通过构造或者方法提升为其对应的包装类类型
  • 自动拆箱:将包装类类型通过构造或者方法将为其对应的基本数据类型

正则表达式

能匹配一系列字符串的较短的特殊字符串

java.util.regex.Pattern 需要导包

常见规则

字符

x 字符 x 
\\ 反斜线字符 

字符类

对字符集进行了升级,一次可以表达多个规则,但是一次还是只能匹配单个字符

[abc]           a、b 或 c(简单类) 
[^abc]          任何字符,除了 a、b 或 c(否定) 
[a-zA-Z]        a 到 z 或 A 到 Z,两头的字母包括在内(范围) 

预定义字符类

之前的字符类写的太多,那么我们可以把他们简单化,简单化就是预定义字符类。也是只能匹配单个字符

.           任何字符(与行结束符可能匹配也可能不匹配) 
\d          数字:[0-9] 
\D          非数字: [^0-9] 
\s          空白字符:[ \t\n\x0B\f\r] 
\S          非空白字符:[^\s] 
\w          单词字符:[a-zA-Z_0-9] 
\W          非单词字符:[^\w] 

数量词

以上都是只能匹配单个字符,但是加上数量词之后就可以匹配多个字符了

X?          X,一次或一次也没有 
X*          X,零次或多次 
X+          X,一次或多次 
X{n}        X,恰好 n 次 
X{n,}       X,至少 n 次 
X{n,m}      X,至少 n 次,但是不超过 m 次 

常见功能

结合字符串中方法

判断功能

boolean matches(String regex); //告知此字符串是否匹配给定的正则表达式
public class Demo4 {
    public static void main(String[] args) {
        String regex = "1[3589]\\d{9}";
        System.out.println("输入一个手机号:");
        String phone = new Scanner(System.in).next();
        System.out.println(phone.matches(regex));
    }
}

分割功能

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

替换功能

replaceAll(String str1,String str2);
replaceFirst(String str1,String str2);

集合

集合和数组都是一个容器,集合只能用来存储引用数据类型

集合和数组的区别

区别 数组 集合
存储类型 基本数据类型、引用数据类型 引用数据类型
长度 长度声明好就不能改变 可以动态增减
graph LR
A[Collection]-->B[List]
B-->C[ArrayList]
B-->D[LinkedList]
A-->E[Set]
E-->F[HashSet]
F-->G[LinkedHashSet]

Colleaction接口

Collection 层次结构中的根接口

一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。

添加功能

 boolean add(Object e) ;            //添加一个元素
 boolean addAll(Collection c);      //添加一个组

删除功能

boolean remove(Object o);               //移除一个元素
boolean removeAll(Collection<?> c)      //移除一个组
void clear();                           //清空

判断功能

boolean contains(Object o);             //是否包含那个元素
boolean containsAll(Collection c);      //是否包含那个组
boolean isEmpty();                      //是否为空

长度和转数组功能

int size();             //长度
Object[] toArray();     //转数组

迭代器iterator

迭代器是和具体的对象绑定的

Iterator<E> iterator() ;//返回在此collection的元素上进行迭代的迭代器
package top.zunmx.d2;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

// ALC-Master
class Student {
    String name;
    int age;

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

}

public class Demo1 {
    public static void main(String[] args) {
        Collection<Object> c = new ArrayList();
        Student s = new Student("Jack Ma", 50);
        Student s1 = new Student("Tony Ma", 49);
        Student s2 = new Student("BG Ma", 69);
        c.add(s);
        c.add(s1);
        c.add(s2);
        System.out.println(c);
        System.out.println("<--------------------------->");

        /*
         * 第一种遍历
         */
        Object[] obj = c.toArray();
        for (int i = 0; i < obj.length; i++) {
            System.out.println(obj[i]);
        }
        System.out.println("<--------------------------->");
        /*
         * 第二种遍历 迭代器
         */
        Iterator it = c.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }

        /*
         * ???
         */
        System.out.println("<------------3--------------->");
        Iterator it1 = c.iterator();

        while (it1.hasNext()) {
            Student sit = (Student) (it1.next());
            System.out.println(sit.getName() + "-----" + sit.getAge());
        }
    }
}

求交集retainAll

谁调用谁改变

boolean retailAll(Collection c);// 仅保留此collection中那些也包含在指定collection的元素

返回值:本身是否改变。

使用集合的步骤

  1. 创建集合对象

  2. 创建元素对象[引用数据类型]

  3. 将元素对象添加到集合对象中

  4. 遍历集合

  • toArray()

  • 迭代器

    • 通过Iterator 方法获取迭代器对象
    • 通过Iterator.hasNext方法判断是否可以继续迭代
    • 通过Iterator.next方法获取元素

List接口

有序的Collection(序列),此处的有序是插入的有序性。

可以通过索引访问,元素允许重复

特有功能

void add(int index, Object element);// 指定位置添加指定元素
Object get(int index) ;//获取指定位置的元素
Object remove(int index) ;//一处列表中指定位置的元素
Object set(int index, E element);// 用指定元素替换列表中指定位置的的元素
package top.zunmx.d3List;

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

// ALC-Master
public class Demo {
    public static void main(String[] args) {
        List<Object> li = new ArrayList<Object>();
        li.add("hello");
        li.add("world");
        li.add("java");
        li.add(0, "java");
        System.out.println(li);
        Iterator<Object> iterator = li.iterator(); // 遍历
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        System.out.println("*************");// 获取
        System.out.println(li.get(0));
        System.out.println(li.get(2));
        System.out.println("*************");// 遍历List的第三种方式
        for (int i = 0; i < li.size(); i++) {
            System.out.println(li.get(i));
        }
        System.out.println("*************"); // 移除返回的是移除的内容
        System.out.println(li.remove(0));
        System.out.println(li);
        System.out.println("*************"); //替换
        li.set(0, "你好");
        System.out.println(li);
    }
}

注意:

出现问题的原因:
1.迭代器对象是属于某一个集合的,既然能通过迭代器获取到集合中的每一个元素,
那就证明迭代器中包含了集合中的所有元素的内容。
2.迭代器是先获取集合中的内容,然后再进行迭代的。
3,遍历迭代器的同时又给原来的集合中添加了内容。(原集合是知道添加了元素的,但是因为迭代器对象是已经获取过的,迭代器对象并不知道添加了内容,所以再去遍历的时候就发生了错误)
4.总结:迭代器对象和原集合对象不同步。

ListIterator

List本身的迭代器

提供了previous方法,使指针前移

public static void main(String[] args) {
        List<Object> li = new ArrayList<Object>();
        li.add("hello");
        li.add("world");
        li.add("java");
        ListIterator<Object> lit = li.listIterator();
        while (lit.hasNext()) {
            System.out.println(lit.next());
        }
        while (lit.hasPrevious()) {
            System.out.println(lit.previous());
        }
    }

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。