一、键盘录入相关类
1.System
1)系统类,提供了一些有用的字段和方法2)成员方法(自己补齐)
A:运行垃圾回收器:void gc()
C:获取当前时间的毫秒值:long currentTimeMillis()2.Scanner的使用D:数组复制:void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
1)在JDK5以后出现的用于键盘录入数据的类。
2)构造方法:
A:System.in其实是标准的输入流,对应于键盘录入
B:构造方法
InputStream is = System.in;
Scanner(InputStream is);
C:常用的格式
Scanner sc = new Scanner(System.in);
3)基本方法格式:A:hasNextXxx() 判断是否是某种类型的B:nextXxx()返回某种类型的元素
4)两个常用方法A:public int nextInt()B:public String nextLine()
5)注意:同一个Scanner对象,先获取数值,再获取字符串会出现一个小问题。解决方案:
a:重新定义一个Scanner对象b:把所有的数据都用字符串获取,然后再进行相应的转换
二、字符串类
1.String类的概述和使用
1)多个字符组成的一串数据, 可以和字符数组进行相互转换。
2)构造方法:
A:public String()B:public String(byte[] bytes)C:public String(byte[] bytes,int offset,int length)D:public String(char[] value)E:public String(char[] value,int offset,int count)F:public String(String original)下面的这一个虽然不是构造方法,但是结果也是一个字符串对象G:String s = "hello";
3)字符串的特点
A:字符串一旦被赋值,就不能改变。
注意:这里指的是字符串的内容不能改变,而不是引用不能改变。
B:字面值作为字符串对象和通过构造方法创建对象的不同例:
String s = new String("hello");和String s = "hello";
第一个s是指向堆里的String对象,然后String对象指向字符串缓冲区第二个是s直接指向字符串缓存区
4)字符串易错事例
A:==和equals()
String s1 = new String("hello"); String s2 = new String("hello"); System.out.println(s1 == s2);// false,地址不同 System.out.println(s1.equals(s2));// true,内容相同 String s3 = new String("hello"); String s4 = "hello"; System.out.println(s3 == s4);// false,地址不同 System.out.println(s3.equals(s4));// true,内容相同 String s5 = "hello"; String s6 = "hello"; System.out.println(s5 == s6);// true,地址相同(都指向字符串缓冲区的同一地址) System.out.println(s5.equals(s6));// true,内容相同
B:字符串的拼接
String s1 = "hello"; String s2 = "world"; String s3 = "helloworld"; System.out.println(s3 == s1 + s2);// false System.out.println(s3.equals((s1 + s2)));// true System.out.println(s3 == "hello" + "world");// true,编译器编译时,会把所有常量之间的运算进行运算,此语句等效于s3 == "helloworld" System.out.println(s3.equals("hello" + "world"));// true
5)字符串的功能A:判断功能字符串是否相同:boolean equals(Object obj)字符串忽略大小写后是否相同:boolean equalsIgnoreCase(String str)字符串是否包含另外一个字符串:boolean contains(String str)字符串是否以另外一个字符串开始:boolean startsWith(String str)字符串是否以另外一个字符串结尾:boolean endsWith(String str)字符串是否为空:boolean isEmpty()B:获取功能获取字符串长度:int length()获取字符串指定索引处的字符:char charAt(int index)获取字符串中第一次出现指定字符的索引位置:int indexOf(int ch)获取字符串中第一次出现指定字符串的索引位置:int indexOf(String str)获取字符串中从指定索引开始第一次出现指定字符的索引位置:int indexOf(int ch,int fromIndex)获取字符串中从指定索引开始第一次出现指定字符串的索引位置:int indexOf(String str,int fromIndex)截取start索引处和之后字符串:String substring(int start)截取start和end索引之间的字符串(包括start,不包括end):String substring(int start,int end)C:转换功能获取组成字符串的字节数组:byte[] getBytes()获取组成字符串的字符数组:char[] toCharArray()将字符数组转为字符串:static String valueOf(char[] chs)将valueOf()里面的值转为字符串:static String valueOf(int i)将字符串转为小小:String toLowerCase()将字符串转为大小:String toUpperCase()在字符串转后面追加字符串:String concat(String str)D:其他功能a:替换功能String replace(char old,char new)String replace(String old,String new)b:去空格功能String trim()c:按字典比较功能int compareTo(String str)int compareToIgnoreCase(String str)
2.StringBuffer、StringBuilder
1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了一个字符串缓冲区类。StringBuffer,StringBuilder供我们使用。StringBuilder与StringBuffer的区别仅在于StringBuffer是同步的,数据安全,效率低。StringBuilder是不同步的,数据不安全,效率高下面只拿StringBuffer来讲
2)StringBuffer的构造方法A:StringBuffer()B:StringBuffer(int size)C:StringBuffer(String str)
3)StringBuffer的常见功能E:截取功能: String substring(int start), String substring(int start,int end)
4)注意事项 :StringBuffer:同步的,数据安全,效率低。StringBuilder:不同步的,数据不安全,效率高。A:String,StringBuffer,StringBuilder的区别String是定长的,全部存放于字符串缓冲区,StringBuffer,StringBuilder是可变的,数据存在堆中
B:StringBuffer和数组的区别?数组只能存放某一类型的数据不好增加长度, StringBuffer可以存任意类型的数据,长度可变String作为形式参数:和基本类型一样不会改变值StringBuffer作为形式参数:会改变值
三、工具类1.Arrays以及排序1)排序A:冒泡排序相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。同理,其他的元素就可以排好。
public static void bubbleSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for (int y = 0; y < arr.length - 1 - x; y++) { if (arr[y] > arr[y + 1]) { int temp = arr[y]; arr[y] = arr[y + 1]; arr[y + 1] = temp; } } } }
B:选择排序把0索引的元素,和索引1以后的元素都进行比较,第一次完毕,最小值出现在了0索引。同理,其他的元素就可以排好。
public static void selectSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for (int y = x + 1; y < arr.length; y++) { if (arr[y] < arr[x]) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } } } }
2)查找A:基本查找针对数组无序的情况
public static int getIndex(int[] arr, int value) { int index = -1; for (int x = 0; x < arr.length; x++) { if (arr[x] == value) { index = x; break; } } return index; }
B:二分查找(折半查找)针对数组有序的情况(千万不要先排序,在查找)
public static int binarySearch(int[] arr, int value) { int min = 0; int max = arr.length - 1; int mid = (min + max) / 2; while (arr[mid] != value) { if (arr[mid] > value) { max = mid - 1; } else if (arr[mid] < value) { min = mid + 1; } if (min > max) { return -1; } mid = (min + max) / 2; } return mid; }
3)Arrays工具类A:是针对数组进行操作的工具类。包括排序和查找等功能。B:要掌握的方法把数组转成字符串:String toString(数组 a)排序:void sort(数组 a)二分查找:int binarySearch(数组 a, byte key) ,int binarySearch(数组 a, int fromIndex, int toIndex, float key)
4)把字符串中的字符进行排序例:""abcdefg"得到结果"abcdefg"
/* * 把字符串中的字符进行排序。 * 举例:"dacgebf" * 结果:"abcdefg" * * 分析: * A:定义一个字符串 * B:把字符串转换为字符数组 * C:把字符数组进行排序 * D:把排序后的字符数组转成字符串 * E:输出最后的字符串 */ public class ArrayTest { public static void main(String[] args) { // 定义一个字符串 String s = "dacgebf"; // 把字符串转换为字符数组 char[] chs = s.toCharArray(); // 把字符数组进行排序 bubbleSort(chs); // 把排序后的字符数组转成字符串 String result = String.valueOf(chs); // 输出最后的字符串 System.out.println("result:" + result); } // 冒泡排序 public static void bubbleSort(char[] chs) { for (int x = 0; x < chs.length - 1; x++) { for (int y = 0; y < chs.length - 1 - x; y++) { if (chs[y] > chs[y + 1]) { char temp = chs[y]; chs[y] = chs[y + 1]; chs[y + 1] = temp; } } } } }
2.Math1)针对数学运算进行操作的类2)常见方法A:绝对值:abs()B:向上取整:ceil()C:向下取整:floor()D:两个数据中的大值:max()E:a的b次幂:pow(double a, double b)F:随机数:random()G:四舍五入:round()H:正平方根:sqrt()3)案例:获取任意范围的随机数import java.util.Scanner; /* * 需求:请设计一个方法,可以实现获取任意范围内的随机数。 * * 分析: * A:键盘录入两个数据。 * int strat; * int end; * B:想办法获取在start到end之间的随机数 * 我写一个功能实现这个效果,得到一个随机数。(int) * C:输出这个随机数 */ public class MathDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入开始数:"); int start = sc.nextInt(); System.out.println("请输入结束数:"); int end = sc.nextInt(); for (int x = 0; x < 100; x++) { // 调用功能 int num = getRandom(start, end); // 输出结果 System.out.println(num); } } /* * 写一个功能 两个明确: 返回值类型:int 参数列表:int start,int end */ public static int getRandom(int start, int end) { // 回想我们讲过的1-100之间的随机数 // int number = (int) (Math.random() * 100) + 1; // int number = (int) (Math.random() * end) + start; // 发现有问题了,怎么办呢? int number = (int) (Math.random() * (end - start + 1)) + start; return number; } }
3.Random1)用于产生随机数的类2)构造方法:A:Random() 默认种子,每次产生的随机数不同B:Random(long seed) 指定种子,每次种子相同,随机数就相同3)成员方法:A:int nextInt() 返回int范围内的随机数B:int nextInt(int n) 返回[0,n)范围内的随机数
四、其他类1.Integer1)为了让基本类型的数据进行更多的操作,Java就为每种基本类型提供了对应的包装类类型byte Byteshort Shortint Integerlong Longfloat Floatdouble Doublechar Characterboolean Boolean
2)Integer的构造方法A:Integer i = new Integer(100);B:Integer i = new Integer("100");注意:这里的字符串必须是由数字字符组成
3)String和int的相互转换A:String -- intInteger.parseInt("100");B:int -- StringString.valueOf(100);
4)其他的功能进制转换:static String toBinaryString(int i) 二进制
static String toHexString(int i) 16进制
static String toOctalString(int i) 八进制
5)JDK5的新特性自动装箱基本类型--引用类型自动拆箱引用类型--基本类型
例:Integer i = 100;//编译器会自动翻译成:Integer i = Integer.valueOf(100);
(6)注意:Integer自带一个 -128到127之间的数据缓冲池,所有new的Integer在此范围内的,都指向此缓冲池,与String类似
2.Character1)Character构造方法Character ch = new Character('a');2)要掌握的方法:A:判断给定的字符是否是大写:static boolean isUpperCase()B:判断给定的字符是否是小写:static boolean isLowerCase()C:判断给定的字符是否是数字字符:static boolean isDigit()D:把给定的字符转成大写:static boolean toUpperCase()E:把给定的字符转成小写:static boolean toLowerCase()3)案例:统计字符串中大写,小写及数字字符出现的次数
import java.util.Scanner; /* * 统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符) * * 分析: * A:定义三个统计变量。 * int bigCont=0; * int smalCount=0; * int numberCount=0; * B:键盘录入一个字符串。 * C:把字符串转换为字符数组。 * D:遍历字符数组获取到每一个字符 * E:判断该字符是 * 大写 bigCount++; * 小写 smalCount++; * 数字 numberCount++; * F:输出结果即可 */ public class CharacterTest { public static void main(String[] args) { // 定义三个统计变量。 int bigCount = 0; int smallCount = 0; int numberCount = 0; // 键盘录入一个字符串。 Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String line = sc.nextLine(); // 把字符串转换为字符数组。 char[] chs = line.toCharArray(); // 历字符数组获取到每一个字符 for (int x = 0; x < chs.length; x++) { char ch = chs[x]; // 判断该字符 if (Character.isUpperCase(ch)) { bigCount++; } else if (Character.isLowerCase(ch)) { smallCount++; } else if (Character.isDigit(ch)) { numberCount++; } } // 输出结果即可 System.out.println("大写字母:" + bigCount + "个"); System.out.println("小写字母:" + smallCount + "个"); System.out.println("数字字符:" + numberCount + "个"); } }
3.BigInteger1)针对大整数的运算2)构造方法A:BigInteger(String s)3)成员方法(自己补齐)A:加:BigInteger add(BigInteger val)B:减:BigInteger subtract(BigInteger val)C:乘:BigInteger multiply(BigInteger val)D:除:BigInteger divide(BigInteger val)E:商和余数:BigInteger[] divideAndRemainder(BigInteger val)
4.BigDecimal1)浮点数据做运算,会丢失精度。所以,针对浮点数据的操作建议采用BigDecimal。(金融相关的项目)2)构造方法A:BigDecimal(String s)3)成员方法:A:加:BigDecimal add(BigDecimal augend)B:减:BigDecimal subtract(BigDecimal subtrahend)C:乘:BigDecimal multiply(BigDecimal multiplicand)D:除:BigDecimal divide(BigDecimal divisor)E:自己保留小数几位:BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
5.Date/DateFormat1)Date是日期类,可以精确到毫秒。A:构造方法Date()Date(long time)B:成员方法long getTime()long setTime(long time)C:日期和毫秒值的相互转换例:来到这个世界多少天
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; /* * 算一下你来到这个世界多少天? * * 分析: * A:键盘录入你的出生的年月日 * B:把该字符串转换为一个日期 * C:通过该日期得到一个毫秒值 * D:获取当前时间的毫秒值 * E:用D-C得到一个毫秒值 * F:把E的毫秒值转换为年 * /1000/60/60/24 */ public class MyYearOldDemo { public static void main(String[] args) throws ParseException { // 键盘录入你的出生的年月日 Scanner sc = new Scanner(System.in); System.out.println("请输入你的出生年月日:"); String line = sc.nextLine(); // 把该字符串转换为一个日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse(line); // 通过该日期得到一个毫秒值 long myTime = d.getTime(); // 获取当前时间的毫秒值 long nowTime = System.currentTimeMillis(); // 用D-C得到一个毫秒值 long time = nowTime - myTime; // 把E的毫秒值转换为年 long day = time / 1000 / 60 / 60 / 24; System.out.println("你来到这个世界:" + day + "天"); } }
2)DateFormat针对日期进行格式化和针对字符串进行解析的类,但是是抽象类,所以使用其子类SimpleDateFormatA:SimpleDateFormat(String pattern) 给定模式yyyy-MM-dd HH:mm:ssB:日期和字符串的转换a:Date -- String:利用SimpleDateFormatformat(Date date)b:String -- Date:利用SimpleDateFormatparse(String str)
6.Calendar1)日历类,封装了所有的日历字段值,通过统一的方法根据传入不同的日历字段可以获取值。
2)如何得到一个日历对象呢?Calendar rightNow = Calendar.getInstance();本质返回的是子类对象
3)成员方法A:根据日历字段得到对应的值:get(Calendar.对应值)B:根据日历字段和一个正负数确定是添加还是减去对应日历字段的值:add(Calendar.对应值, int)C:设置日历对象的年月日:set()
4)案例:计算任意一年的2月份的天数import java.util.Calendar; import java.util.Scanner; /* * 获取任意一年的二月有多少天 * * 分析: * A:键盘录入任意的年份 * B:设置日历对象的年月日 * 年就是A输入的数据 * 月是2 * 日是1 * C:把时间往前推一天,就是2月的最后一天 * D:获取这一天输出即可 */ public class CalendarTest { public static void main(String[] args) { // 键盘录入任意的年份 Scanner sc = new Scanner(System.in); System.out.println("请输入年份:"); int year = sc.nextInt(); // 设置日历对象的年月日 Calendar c = Calendar.getInstance(); c.set(year, 2, 1); // 其实是这一年的3月1日 // 把时间往前推一天,就是2月的最后一天 c.add(Calendar.DATE, -1); // 获取这一天输出即可 System.out.println(c.get(Calendar.DATE)); } }