1. 数组
- 定义:
- 数组 : 类型相同,大小固定 的 很多数的组成在一起
- 优点: 类型相同
- 缺点:大小固定
2. 一维
2.1. 语法
- 声明
数据类型[] 数组名; [推荐]
数据类型 数组名[];
示例:
int[] num;
String[] args;
-
初始化
数组名=new 数据类型[大小]; // 数组无论是全局变量或者是局部变量都会自动初始化 数组名=new 数据类型[]{值1,值2,值3};
-
声明时同时初始化
数据类型[] 数组名 = {值1,值2,值3}; 数据类型[] 数组名 = new 数据类型[]{值1,值2,值3}; 数据类型[] 数组名= new 数据类型[大小];
2.2. 访问
- 是通过下标进行访问
- 下标是从0开始
- 下标的范围:0~数组长度-1
- 取值 : 数组[下标]
- 赋值: 数组[下标]=值;
- 如果下标超过数组中的元素长度,会报ArrayIndexOutOfBoundsException异常
2.3. 数组的长度
- 通过属性length可以获取
- 数组对象.length的方式
2.4. 数组的遍历
-
遍历即为打印数组中的所有元素、
-
可以通过for循环
//声明 int[] num; //初始化 //num = new int[5]; num= new int[] {1,2,3,4}; System.out.println(num[0]); //1 //声明时同时初始化 int[] num2 = {1,2,3}; int[] num3 = new int[]{1,2,3}; int[] num4 = new int[3]; //数组属性length来表示数组的长度 System.out.println(num.length); //4 //遍历(访问数组中所有元素) for(int i=0;i<num.length;i++) { System.out.print(num[i]+"\t"); }
-
还可以通过for的加强版本,是在JDK5.0之后 提供的
//遍历(for加强版本) for(int n:num) { //for(数据类型 每一个值 : 在数组里) System.out.print(n+"\t"); }
2.5. 特征
-
对象所在的堆中储存空间是连续的
-
优点: 查询和修改
-
缺点:插入和删除
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-apDe3G5u-1610499655175)(img\02.png)]
2.6. 数组的传递,即为引用传递
-
数组作为参数传递时,只需要传递数组名即可,肯定是引用传递
-
数组中的值传递,要看数组的数据类型;如果是值是值类型,则为值传递,值是引用类型,则为引用传递
-
示例
public static void main(String[] args) { Demo demo = new Demo(); int[] nums = {1,2}; demo.change(nums); //数组的传递,直接传数组名即可 System.out.println(nums[0]); //50 } private void change(int[] nums) { nums[0] = 50; }
2.7. 冒泡排序 : 口诀:两两比较,进行交换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CkPZMnbI-1610499655177)(img\05.png)]
int[] nums = {12,3,4,5,6,365,2}; System.out.println("排序前的结果"); for(int num:nums) { System.out.print(num+"\t"); } System.out.println(); //排序 for(int i=0;i<nums.length-1;i++) { for(int j=0;j<nums.length-1-i;j++) { if(nums[j]<nums[j+1]) { int temp=nums[j]; nums[j]=nums[j+1]; nums[j+1]=temp; } } } System.out.println("排序后的结果"); for(int num:nums) { System.out.print(num+"\t"); }
3. 二维数组
3.1. 语法
// 数据类型[][] 数组名 = new 数据类型[行大小][列大小]
//先声明,
int[][] nums;
int[] nums2[];
int nums3[][];
//再初始化大小 行大小 列大小
nums = new int[3][4];
nums = new int[][]{{1,2},{3,4},{5,6}};
//声明时同时初始行和列
int[][]nums4 = new int[3][4];
int[][]nums5 = {{1,2},{3,4,33},{5,6}};
int[][]nums6 = new int[][]{{1,2},{3,4},{5,6}};
//声明时同时初始化行
int[][]nums7=new int[3][];
//再初始化列
nums7[0]=new int[2];
nums7[1]=new int[3];
3.2. 访问
-
都是通过下标进行的
- 行下标
- 0~第一个中括号的行大小-1 :
- 行大小=》 数组名.length
- 列下标
- 0~第二个中括号的列大小-1
- 列大小=> 数组名[行下标].length
- 行下标
-
取值
数组名[行下标][列下标]
-
赋值
数组名[行下标][列下标]
=值
3.3. 数组的长度
- 行大小=》 数组名.length
- 列大小=> 数组名[行下标].length
3.4. 遍历
-
for传统
for(int i=0;i<nums5.length;i++) { //行 for(int j=0;j<nums5[i].length;j++) { //列 System.out.print(nums5[i][j]+"\t"); } System.out.println(); }
-
for加强
for(int[] rows:nums5) {
for(int data:rows) {
System.out.print(data+"\t");
}
System.out.println();
}
4. Arrays
- 专门操作数组的一个类
- 常用方法
- sort(xxx[])
- copyof(xxx[],数组长度)
- binarySearch(xxx[],xxx); 两分搜索,前提条件要先排序
- asList(T …t); 把多个数字变成集合
- toString(xx[]) ,打印数组的内容
5. 可变参数和main方法入参
public static void add(int ...nums) {
//把可变参数看成数组
//for加强
for(int n: nums ) {
System.out.print(n+"\t");
}
System.out.println();
}
public static void main(String[] args) {
add();
add(1);
add(1,2);
add(1,2,3);
//args是系统参数,给它赋,通知JVM,右击run--configurations-->Arguments选择-->Program arguments--> 多个值之间用空格隔开
for(String a: args ) {
System.out.print(a+"\t");
}
}
6. 字符串
6.1. String
-
字符串是由N多字符拼在一起的内容
-
需要放置在双引号里,字符的个数,可有可无可多个
-
最简单字符串可以写成"",但char类型最简单必须为’ ’
-
字符串一但声明后,内容就固定,如果重新赋值,则相当于重新创建了新的字符串常量对象
String str = "abc"; str="abcd"; System.out.println(str); //abcd str.concat("123"); //连接字符,新的字符串 System.out.println(str); //abcd String newStr = str+"abc"; System.out.println(str); //abcd
-
创建方式
-
直接赋值字符串常量
-
通过构造方法的方式
-
示例
String str2 = "abc"; String str3 = new String("abc"); String str4 = new String("abc"); /* * == * 值类型表示值相等 * 引用类型表示地址相等 * * equals * 在Object表示地址相等 * * */ System.out.println(str1==str2); //true System.out.println(str3==str4); //false System.out.println(str1==str4); //false
-
分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CaOX9gvR-1610499655178)(img/001.png)]
-
6.1.1. 字符串常用方法
System.out.println("abc".concat("123")); //abc123
System.out.println("abc123".charAt(0)); //a
System.out.println("abc123".codePointAt(0)); //97
System.out.println("abc123".contains("abc"));//true
System.out.println("abc123".startsWith("ab"));//true
System.out.println("abc123".endsWith("123"));//true
System.out.println("abc".equals("ABC"));//false
System.out.println("abc".equalsIgnoreCase("ABc"));//true
System.out.println("Abc".toUpperCase());//ABC
System.out.println("Abc".toLowerCase()); //abc
System.out.println("abc".toLowerCase().equals("ABC".toLowerCase()));//true
//现在使用UTF-8
System.out.println("abc".getBytes().length);
System.out.println("中国".getBytes().length);
System.out.println("中国".getBytes("gbk").length);
System.out.println("abc123bc".indexOf("bc")); //1
System.out.println("abc123bc".lastIndexOf("bc")); //6 从后往前找,从前往生数
System.out.println("".isEmpty()); //true
System.out.println("abc123".length());//6
System.out.println("abcd123".substring(1, 5)); //前包后不包 bcd1
System.out.println("abcd123".substring(1)); //前包至最后 bcd123
System.out.println(Arrays.toString("abc".toCharArray()));
System.out.println(" a b c ".trim().length()); //5
System.out.println("abc123a".replace("a", "qq"));
System.out.println("abc123a".replaceAll("a", "qq"));
/*
* iso-8859-1 西欧码 全部占一个字节
* gb2312 简单中文 中文占二个字节 英文占一个
* gbk 中文 中文占二个字节 英文占一个
* UTF-8 中文占三个字节 英文占一个
* */
6.1.2. 正则
- / 正则/
6.1.3. 用到正则的三个方法:
-
reqpalce(“要替换字符串”,“新的字符串”)和replaceAll(“正则表达式”,“新的字符串”)区别
-
matches(正则表达式)
-
split(下则表达式)
/*正则 * ^开头 * $结束 * * ========== 内容=============== * x字符 x字符 * \d 数字 [0-9] * \D 非数字 [^0-9] * \w 字母和数字 [0-9a-zA-Z] * \W 非字母、非数字 [^0-9a-zA-Z] * \s 空白 * \S 非空白 * * a|b * [0-9] * [^0-9] * [1,3,5] * * . 任意字符 * * * ==========有多少========= * * 可有可无可多少 * + 至少有一个 * ? 至多有一个 * {6} * {6,} * {6,10} * * */ String regExpress="\\w{5}\\d"; System.out.println("ab1231".matches(regExpress)); String phone="1\\d{10}"; System.out.println("12345678901".matches(phone)); //replace() replaceAll()区别 ? System.out.println("abc1223a".replace("\\w", "qq")); System.out.println("abc1223a".replaceAll("\\w", "qq")); System.out.println(Arrays.toString("aa,bb,cc".split(","))); System.out.println(Arrays.toString("abcbd".split("b"))); //[a,c,d] System.out.println(Arrays.toString("a.b.c".split("."))); //[]
6.2. StringBuffer
- String定义后生成字符串常量 ,在常量区 ; 如果改变String的内容,相当于重新生成新的字符串常量对象重新赋值之前String引用
- StringBuffer 内容存储在堆中,改变是自身。
- 根据上述的特点
- String 查询和修改效率高
- StringBuffer 增加和删除效率高,
6.3. StringBuilder
- StringBuffer 内容存储在堆中,改变是自身。
- StringBuffer 增加和删除效率高,
- StringBuffer和StringBuilder区别?
- StringBuffer线程同步
- StringBuilder线程不同步
- 在没有线程安全的情况下,StringBuilder效率更高
- 用到线程使用StringBuffer
- 未用到线程使用StringBuilder,现在很场景不考虑线程安全,使用StringBuilder概率大
- toString()变成String,就可以使用N多String常用方法
6.4. 小小练习
- 下面代码内容中创建了几个对象 (8)
String s3="aaa"+"b"; //1 java编译优化,常量会先计算
String s1="aaa"; //1
String s2="b" //1
String r1 = new String("aa"); //2
String s4=s1+s2; //1 => new String(s1+s2);
String s5 =s1.substring(1); //1
s1.concat("b"); //0
StringBuilder sb = new StringBuilder(s1); //1
sb.append("456")
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aQcl0U1D-1610499655181)(img\002.png)]
8. 其它类
8.1. 日期类Date
-
Date: 日期类
-
new Date()
-
getTime()
Date now = new Date(); System.out.println(now); System.out.println(now.getTime()); // long begin = now.getTime() // 方法() // long cost = now.getTime()-begin; System.out.println(1900 + now.getYear()); System.out.println(1+now.getMonth()); System.out.println(now.getDate()); System.out.println(now.getHours()); System.out.println(now.getMinutes()); System.out.println(now.getSeconds()); System.out.println(now.toLocaleString());
-
-
Calendar : 日历类
-
getInstance()
-
get()
//创建Calendar的实例 Calendar c = Calendar.getInstance(); //获取年份 System.out.println(c.get(Calendar.YEAR)); System.out.println(c.get(Calendar.MONTH)+1); System.out.println(c.get(Calendar.DATE)); System.out.println(c.get(Calendar.HOUR)); System.out.println(c.get(Calendar.MINUTE)); System.out.println(c.get(Calendar.SECOND)); System.out.println(c.get(Calendar.MILLISECOND));
-
-
SimpleDateFormat : 日期的格式化
- new SimpleDateFormat (String pattern)
yyyy 年 MM 月 dd 日 HH(24)|hh(12) 时 mm 分 ss 秒 SSS 毫秒
- String format(Date)
- Date parse(String)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); //把日期转成字符串 Date now = new Date(); String strNow = sdf.format(now); System.out.println(strNow); //把字符串转成日期 Date newDate = sdf.parse("2018-09-06 10:29:24:870"); System.out.println(newDate);
8.1. 数学Math
-
属性
- PI
- E
-
方法
- abs() 绝对值
- sqrt() 平方根
- max() 最大值
- min() 最小值
- ceil() 天花板
- floor() 地板
- round() 四舍五入
- random() 随机数 0~1
8.1. 随机类Random
- 生成随机数类
- 常用
- nextInt()
- nextLong()
- nextBoodlean()
- nextFloat()
- nextDouble()
7. 作业
-
接受用户录入的一串字符:如abc123^&*,统计:字母个数,数字个数和其它个数
-
接受用户录入的一串数字: 如aaabbcc111,统计每个字母出现个数
-
接受用户录入的字符串实现加密和解密 (a^b=c a^c=b)
-
接受用户录的的字符串,实现反序输出
-
研究邮箱和手机号的正则表达式