一、Scanner类
- Scanner类:java.util.Scanner ;
需要导包— 文本扫描器 - 构造方法:
public Scanner(InputStream source):
创建一个文本扫描器,需要传递字节输入流,形式参数是一个抽象类,需要抽象类子类对象 - 获取功能
public int nextInt() :将下一个录入的标记为int类型 - 判断功能:
public boolean hasNextXXX()
判断是否为xxx类型
public boolean hasNextLine():判断录入的是否为String
public boolean hasNextInt() :判断录入的是否为int
举例:
public class ScannerDemo {
public static void main(String[] args) {
/* Scanner sc = new Scanner(System.in) ;
System.out.println(sc);
ArrayList arrayList = new ArrayList() ;
System.out.println(arrayList);*/
//创建键盘录入对象
// System类有一个标准输入流,标准输出流
//in,out这些成员变量
//public static final InputStream in ;标准输入流
//public static final PrintStream out ;标准输出流
InputStream inputStream = System.in ;
Scanner sc = new Scanner(inputStream) ;
//提示并录入
System.out.println("请输入数据:");
//加入判断
if(sc.hasNextInt()){
// public int nextInt()
int a = sc.nextInt() ;
PrintStream ps = System.out ;
//PrintStream:字节打印流:属于 "字节输出流的一种"
ps.println("录入的int数据是:"+a);
}else if(sc.hasNextLine()){
String a = sc.nextLine() ;
System.out.println("录入的字符串数据是"+a);
}else if(sc.hasNextDouble()){
double d = sc.nextDouble() ;
System.out.println("录入的double数据是:"+d);
}
/**
* 如果录入的结果数据类型和接收的类型不匹配
* java.util.InputMismatchException:输入类型不匹配异常
*/
//System.err.println("这是错误输出流");
}
}
二、String类(重点)
-
String代表字符串:Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
String str = “abc”;
字符串是常量;它们的值在创建之后不能更改(就是地址值) -
构造方法:
public String()空参构造(不建议使用:是一个空字符序列)
String(byte[] bytes) :使用平台默认解码集进行解码
String(byte[] bytes,字符集) :使用指定字符集集进行解码
public String(byte[] bytes,int offset,int length):将一个部分字节数组字符串
public String(char[] value):构造一个字符串对象,传递一个字符数组
public String(char[] value,int offset,int count):将字符数组的某个位置开始指长度的内容转换成字符串对象
public String(String original):传入指定的字符串值,构造一个字符串对象!
-
字符串的获取功能:
int length() :字符串的特有功能:获取字符串的长度int[] arr = new int[4] ; length属性---数组中获取数组的长度的length属性!
-
字符串的有转换功能
编码的过程:
byte[] getBytes() :将字符串转换为字节数组,空参为平台默认编码集
byte[] getBytes(字符集) :将字符串转换为字节数组,使用指定字符集编码
String s = “” ;
String s = null ; 空值,没有对象
举例1:
public class StringDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
//测试构造方法
// public String()
String s1 = new String() ; //String s1 = "" ;
//String s2 = null ;
System.out.println(s1);
System.out.println(s1.length());
System.out.println("-----------------------------");
//编码:将看懂的东西---->变成看不懂的
/**
* 常见的字符集:
* GBK :中国的中文编码表 (一个中文对应两个字节)
* GB2312:GBK的升级版,可以提供更多的中文字符
* utf-8:一个中文对应3个字节
* iso-8859-1:拉丁文码表
* big-5:大五码:港澳地区:繁写字体
* unicode:国际编码表
*
*/
String s2 = "我爱你中国" ;
//String的转换功能:getBytes()---->byte[] :平台默认编码集编码: utf-8 (一个中文三个字节)
byte[] bytes = s2.getBytes();
// byte[] bytes = s2.getBytes("GBK"); //一个中文两个字节
//System.out.println(bytes);
//java.util.Arrays:针对数组操作的工具类(提供:排序,,搜索,将数组转换成的功能)
//public static String toString(byte[] a):重载的方法:可以将任何数组转换成String
String byteArray = Arrays.toString(bytes);
System.out.println(byteArray);
System.out.println("------------------------");
//解码:利用String类型的构造方法String(byte[] bytes):默认平台解码集解码
String s3 = new String(bytes) ;//utf-8解码
// String s3 = new String(bytes,"GBK") ;
System.out.println(s3);
System.out.println("-----------------------------------");
//创建一个字节数组:
byte[] bytes2= {97,98,99,100,101} ;
String s4 = new String(bytes2) ; //字节数需要找对应的ASCII码表
System.out.println(s4);
System.out.println(s4.length());
// public String(byte[] bytes,int offset,int length):将一个部分字节数组字符串
String s5 = new String(bytes2,2,2) ;
System.out.println(s5);
System.out.println(s5.length());
System.out.println("-----------------------------------");
//public String(char[] value):构造一个字符串对象,传递一个字符数组
char[] chs = {'高','圆','圆'} ;
String s6 = new String(chs) ;
System.out.println(s6);
System.out.println(s6.length());
//public String(char[] value,int offset,int count)
String s7 = new String(chs,0,2) ;
System.out.println(s7+"---"+s7.length());
System.out.println("-----------------------------------");
// public String(String original):
String s8 = new String("hello") ;
System.out.println(s8+"---"+s8.length());
}
}
举例2:
package com.qf.string_01;
//面试题
//String s = new String("hello") ;
//String s = "hello" ; //推荐
//两个区别是什么? 分别创建了几个对象
/**
* 前者:要在堆内存中产生空间地址,并且要常量标记:"hello" , 两个 (堆,常量池)
* 后者:创建一个对象,将常量赋值给变量,直接现在常量池 中找是否存在这个常量值,存在,直接返回值地址;不存在
* 在常量池中开辟空间!
*
* 前者和共同点:都是创建一个字符串对象:"hello",推荐使用后者,节省内存空间!
*
*/
public class StringDemo2 {
public static void main(String[] args) {
String s1 = "hello" ;
String s2 = new String("hello") ;
System.out.println(s1 == s2); //比较地址值
System.out.println(s1.equals(s2));
//String底层重写了Object类的equals方法以及hashCode(),比较的是两字符串对象中存储的字符序列是否一样
}
}