Java基础01~16总结,集合总结

细节知识总结(查漏补缺)

1.编译不报错String s = "jion" +2 +"here"
将其他类型转为String类型最简单的方法 就是 其他类型+" ";所以代码中的int 类型的2 转为String类型,符合语法

编译报错 int f=5+5L; int类型小于long类型,无法自动转型,不符合语法 正确语法long f=5+5L;或者加强转
补充以下 其他类型转String类型方法
a. 直接使用+ ,例如:2+" “; ‘a’+” ";
b. 使用构造方法 new String(其他类型数据);
c.使用String类的valueOf()方法 String.valueOf(其他基本类型数据);
d.其他类型数据使用toString 方法 Character.toString(字符); Arrays.toString(数组);
补充声名多个同类型变量可用逗号隔开,写在同一行

int a=1,b=2;
int sum =a+b;
List<Student> stu = new ArrayList<>(), pre = new ArrayList<>();

2.构造方法,在创建对象时即(new 一个对象 实例化对象)就会执行,当存在继承关系时,实例化子类对象,先执行最顶级的父类构造方法,在层层往下执行子类构造方法,因为初始化子类的时候,不初始化父类,则无法通过子类调用父类方法或变量,所以先初始化父类
在java中一个类可以同时继承一个类和实现一个接口,不冲突
补充 方法的调用
直接调用 getSum(); 一般是void 类型,无返回值,
打印调用 System.out.println(getSun(2,3));
赋值调用 int sum = getSum(2,3)
对象名.方法名
类名.方法名

3.声明多个异常的时候 异常类的范围从小到大来进行声明
当一个异常匹配且执行后不会再运行try{}里报错位置后的代码,也不会再匹配另一个catch,直接跳出try-catch结构,执行后面的代码
throw 是抛出异常 在方法中 一次只抛出一个异常 异常确实存在可能发生异常
throws 是声名异常 在方法参数后面 可声名多个异常 异常不一定存在
异常处理方法:通过try-catch 捕获异常 或 throws声名异常 来解决

4.equals 只能比较引用数据类型,未重写之前比较两者的地址,重写之后比较两者的内容
== 可以比较基本数据类型 和 引用数据类型 ,基本数据类型比较值,引用数据类型比较两者的地址
实际开发中一般引用数据类型比较用equals 基本数据类型比较用==
5.String类型
所有的字符串字面值 都是存在堆内存中字符串常量池中"abc" “def” new 字符串 都是存在堆内存中
如果使用new String() 则在堆内存开辟一个新空间来存储
字符串的是先转换为字符数组 再将字符数组 转换为字节 是以字节数据来进行存储 “abc” ==>97 98 99
在这里插入图片描述

  1. final修饰变量 就是常量 只能赋值一次
    修饰类 不能继承
    修饰方法 不能重写
    修饰引用数据对象 不能改变的是地址值 可以改变的对象的属性值

  2. Calendar 是一个抽象类 需要调用方法来实现实例化,不能直接new,有点像单例模式 Calendar cal =Calendar.getInstance();
    一般用不到,所以老忘记
    Data SimpleDateFormat Calendar 看代码就会了,主要的功能方法就那两句,感觉一般用不到
    美国的月和中国计算不一样,在最后结果加1就行,不是在get方法内加1 int month = cal.get(Calendar.MONTH)+1;

2000-01-01格式字符串转为date数据第一种方式
        * String borth =sc.next();
        SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd");
        Date date = s1.parse(borth);
        *2000-01-01格式字符串转为date数据第二种方式
        *  String line = sc.next();
        String [] array = line.split("-");
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR,Integer.parseInt(array[0]));
        cal.set(Calendar.MONTH,Integer.parseInt(array[1]));
        cal.set(Calendar.DAY_OF_MONTH,Integer.parseInt(array[2]));
        Date date = cal.getTime();
        * 得出两者差值求出年龄
        * long time =date.getTime();
        long t = System.currentTimeMillis();
        System.out.println((t-time)/1000/60/60/24/365);
        * 将当前系统时间转化为yyyy-MM-dd格式
        * Date d = new Date();
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = s.format(d);
        //将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer
        System.out.println(time);
        * //SimpleDateFormat的parse方法解析字符串的文本,转成Date类型
        Date d1 = s.parse(time);
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年-月-日");
        /*String[] s = sc.next().split("-");
        int num = Integer.parseInt(s[0]);//静态方法用类名加方法调用*/

        Date d = new SimpleDateFormat("yyyy-MM-dd").parse(sc.next());
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        int num = cal.get(Calendar.YEAR);

7.敲代码的一些巧妙思想
for循环中用if语句,可能需要设计标记
在for循环前设置布尔标记,if中为真则布尔标记变量为真,else中则布尔变量为假 然后在for后加if(!布尔变量)输出语句
斗地主代码中用取余等0,1,2来进行分牌,
分东西时都可用,取余还可用来获取个 十 百 位
除法自动向下取整,循环除10根据除几次得0用来判断位数,除8在加1来判断第几周
当两个变量和为固定时,例如和为1,只设一个变量num,另一个变量为1-num;
代码:求字符出现次数

package exam;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Test03 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串");
        String str =sc.next();
        char[] chars = str.toCharArray();
        /*Map map = new HashMap();
        Integer count= 1;
        for (int i = 0; i < chars.length; i++) {
            if(!map.containsKey(chars[i])){
                map.put(chars[i],count);
            }else {
                map.put(chars[i],(Integer)map.get(chars[i])+1);
            }
        }
        System.out.println(map);*/
        int count=0;
        //算法思维的一种 先简单粗暴的解决,在通过计算方式,合并或者简写省略好多步,进行简化,得到一样的结果
        //另一种就是单纯的思路不同,思路上就领先简化,减少时间
        //直接比较26个字母,看它出现多少次,要写26个计数变量,26个字母
        //是0 的不输出,即只要一个计数变量
        //用字符串的的字母作为比较,即不需要26个字母,
        for (int i = 0; i < chars.length; i++) {
            for (int j = 0; j < chars.length; j++) {
                //字符串第一次出现,str.substring(0,i).contains(chars[i]+"") 一定是不包含,substring不包尾
                //字符串第二次出现,str.substring(0,i).contains(chars[i]+"") 一定是包含,因为已经出现了一次
                if(chars[i] == chars[j] && !str.substring(0,i).contains(chars[i]+"")){
                    count++;
                }
            }
            //进行筛选,是0即没有出现就不输出
            if(count>0){
                System.out.println(chars[i]+"\t"+count);
                count=0;
            }
        }


    }
}

代码:存入6个输入不同的随机数

        List redNum =new ArrayList();
        while (redNum.size()<6){
            int num = (int)(Math.random()*33+1);
            if(!redNum.contains(num)){
                redNum.add(num);
            }
        }

代码:双重for循环 第一层控制行数,第二次控制列数

public class Test06 {
    public static void main(String[] args) {
        //九九乘法表,双重for循环
        for (int i = 1; i <= 9 ; i++) {
            for (int j = 1; j <= i ; j++) {
                System.out.print(i+"*"+j+"="+i*j+"\t");
            }
            System.out.println("");

        }
        //第一层循环控制行,表i行,第二层控制列,表j列
        for (int i = 1; i <=3; i++) {
            for (int j = 1; j <= 4; j++) {
                System.out.print("*" + "\t");//没有ln,不换行
            }
            System.out.println("");//换行
        }
    }
}

代码: 数组的冒泡排序 值的交换
数组冒牌排序第一层for循环是控制轮数,length-1;
第二层for循环时控制每一轮比较的次数,length-1-i;
数组值的互换 定义一个temp,在依次交换
集合直接用set方法改值

import java.util.Arrays;
public class Test08 {
public static void main(String[] args) {
//System.out.println(Arrays.toString(sortArrays(new int[]{4,3,1,2,5})));
int [] nums ={4,3,1,2,5};
int[] arrays= sortArrays(nums);
String str = Arrays.toString(arrays);
System.out.println(str);
}
public static int[] sortArrays(int [] nums) {
//需要进行非空验证
if (nums !=null && nums.length>0){
//使用双重for循环
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;
}
}
}
}
return nums;
}
}

集合大总结

数组与集合的区别:
相同点:都是用于存储数据(数据必须是同一类型)的容器
不同点:
A.数组可以存储基本数据类型 也可以存储引用数据类型 集合只能存储引用数据类型
B.数组的是固定 集合的长度不是固定
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

单列集合Collection

Collection 是单列集合的根接口 子接口有List 和Set,接口不能直接实例化 需要通过实现类来实例化
List集合,实现类有ArrayList 和 LinkedList
Set集合,实现类有HashSet 和 TreeSet
Map 是双列集合的接口 实现类有 HashMap 和TreeMap,HashMap还有一个子类LinkedHashMap;
List集合是有序的,可以重复,有索引值 ,但是其有序是根据索引来决定的,其值不一定有序,相当于数组,排序要自己写方法排序,
其中ArrayList 底层是以数组原理来进行储存的,LinkedList 是以双向链表原理(即单列表成环)进行存储的,ArrayList查询快增删慢,LinkedList 查询慢 增删慢,现在阶段一般使用ArrayList,
在这里插入图片描述
双向链表如上图中的单列表结构,一个节点存储上一个元素地址加数据值加下一个元素的地址,头节点的上一个元素地址记录 最后一个数据节点的地址,最后一个数据节点的下一个元素地址记录头节点的地址,首尾相接形成环。
List可以用普通for循环遍历,增强for循环,转为迭代器,转为数组 四种方法来进行遍历
Set集合是无序的,不可以重复,无索引,不能用普通for循环
其子类HashSet 是无序的,不可以重复,可以有null 但只能有一个null,是以hash表结构(即数组加链表加红黑树)来进行存储,如下图
在这里插入图片描述
数组存hash值通过对key 进行hash散列运算,得到一个值,再以数组长度取模,取模即取余,所以结果一定会在数组长度内(比如数据存在数组Node,第一个数通过取模运算结果索引为3,存Node[3],第二个数通过计算索引为1,存Node[1]),所以无序,不能重复的原因从结构上来解释,就是遇到相同的hash值数据,用equals()比较内容,如果相同不添加,如果不同,就会挂在链表上或红黑树上(超过8个就会转为红黑树结构),例如查寻上图中的通话,先用hashCode()找到对应的hash值数组存储位置,在往链表或红黑树中用equals()查找内容 。
不能重复的原因是调用了hashCode()方法和equals()进行比较,解决了hash冲突
LinkedHashSet 有序 ,不可以重复,其有序是按照输入数据的顺序有序,而不是根据输入数据的数值排序,其是以哈希表和双链接列表实现,双链表其中一条链用来记录输入数据的顺序
TreeSet 有序 不可以重复 以红黑树结构来存储 其有序是根据数值来进行排序,有一个内部方法compareTo 来排序,复杂的引用类型需要自定义comparaTo方法来排序
Set集合常用增强for循环和迭代器来遍历,也可用普通for循环

双列集合Map

Map集合是双列集合,是接口,其实现类HashMap 和TreeMapy以及LinkedHashMap
HashMap 无序,不可以重复,也是数组加链表加红黑树结构存储,同HashSet,只不过是存储键值对,当键的哈希值相同和内容相同时,键值不同,则会更改对应的键值,如果键的哈希值相同内容不同,就会挂在链表或红黑树上。
TreeMap 有序,不可以重复 ,同TreeMap,以红黑树结构存储,根据key的大小来排序
LinkedHashMap,有序,不可以重复,同LinkedHashSet ,其有序时根据数据插入顺序来决定的。
Map通过keySet()获取所有的键,entrySet()获取键值对来遍历, 可用增强for循环和迭代器,建议迭代器
Map用对象类型做key,Map< User, String > map =new HashMap(), 对象类User必须重写equals 和hashcode方法,
否则只能通过遍历来获取数据,不能使用get(key)获取数据,
因为map存数据是先hashcode,在equals,get方法找数据也是如此

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值