第4天必须掌握知识点 >>>基础结构以及类型
一、Java中数据类型有几种?
基本类型八种:byte short int long float double char boolean
二、java中常见的语法结构
1.顺序结构 从小至下 按照逻辑 运行代码
2.判断结构
其中分为单分支结构以及多分支结构还有嵌套判断结构
>>>单分支结构 备注:如果只有一条判断if() 可以不用写大括号 直接sout输出
If(){
}
>>>多分支结构
If(){
}else{
}
>>>嵌套分支结构
If(){
}else if{
}else if{
}else{
}
3.循环结构
>>>单循环for 快捷方式fori+回车键
For(开始条件; 判断条件;执行条件){
执行语句...
}
>>>嵌套循环for
For(开始条件; 判断条件;执行条件){
For(开始条件; 判断条件;执行条件) {
}
}
>>>死循环while
While(true){
执行语句
}
>>>先执行的do...while
Do{
}while(true){
执行语句
}
4.选择结构
Switch(a);
Case 1 sout break;
Case 2 sout break;
Default+ sout
- 默写方法的书写格式
方法修饰符public+返回值类型void+方法名main+参数列表()+方法体{ }
第5天必须掌握知识点 >>>初识数组
一、理解什么是数组,书写格式以及应用?
数组理解成存储一组数据的组合;
存放多个相同类型的变量。java程序中的数组必须先进行初始化才可以使用,所谓初始化,就是为数组对象的元素分配内存空间,并为每个数组元素指定初始值,而在Java中,数组是静态的,数组一旦初始化,长度便已经确定,不能再随意更改。”
书写格式分静态数组以及动态数组
静态数组:
Int [] a=new int[]{1,2,3,4,5,6};
Int[]a={1,2,3,4,5,6};
动态数组:
Int[]a=new int[6];
- 数组的一些特性以及它的一些用法?
- 数组特性
数组是有个名为下标的东西,理解成数组里面每个元素的名字
a[0]=1; a[1]=2; a[2]=3;a[3]=4;a[4]=5;a[5]=6;
上面就是数组,叫做下标书写格式:首下标a[0]=X;
数组也有长度(length),里面有几个元素长度就是几,其中最大的下标为长度-1(length-1)
- 数组的用法
如果想要查看数组里面的具体元素,不能直接sout+数组名,需要用工具类(toString+数组名)
System.out.Println(Arrays.toString(数组名)) 备注: char类型特殊可以直接查看
如果数组想要排序,从头到尾逐个“过一遍”依次对每个元素均做一次且仅做一次访问。叫做数组的遍历;备注:遍历是访问每一个,并不是排序数组里面的元素。
遍历数组格写法:
for(int i=0; i<数组名.length; i++){
sout(i)>>>>>>这样写输出的只是数组但下标
sout(数组名[i])>>>>>>这样写输出才是遍历后输出数组写法
}
数组排序的写法
大致分为三步>>>第一步创建数组 第二步调排序方法 第三步打印
int[] c6=new int[]{45,23,14,2,96,102,35,78};
Arrays.sort(c6);
System.out.println(Arrays.toString(c6));
数组的复制 扩容 缩容 截取范围玩法
分步来:复制
第一步创建一个数组
第二步使用Arrays的方法并且定一个新的数组名字
第三步执行 类型名+[]+新数组名=Arrays.copyOf(要复制的数组名,数组长度);
查看复制好的新数组sout+(Arrays.toSting(新数组名));
分步来:扩容
原理同上:第三步为 类型名+[]+新数组名=Arrays.copyOf(要扩容的数组名,新的数组长度);
分步来:缩容
原理同上:第三步为 类型名+[]+新数组名=Arrays.copyOf(要缩容的数组名,缩小的数组长度);
分步来:截取
原理同上:第三步为 类型名+[]+新数组名=Arrays.copyOfRange(要截取的数组名,第一个要截取的下标,第二个截止截取的下标);
第6天必须掌握知识点 >>>面向对象OOP
首先学习第一点面向对象其实就是一种思想
其次类是一类事物的总结出来的特征和行为理解成一个模板
对象
对象是根据类创建出一个个独立具体的实例
对象具有各种特征,并且每个特征都可以有自己特定的值
具有各种行为,一个类可以创建多个对象,通过对象的唯一地址值来区分对象
类与对象的关系
类是对象的抽象,对象是类的实体
面向对象的三大特征:
封装:继承:多态
面向对象特征之 封装
封装意思是隐藏对象的属性,仅仅对外提供公共的访问方式
好处:提高安全性&提高重用性
什么是匿名对象?
意思就是没有名字的对象,是创建对象的简化形式
比如:OPPO o=new OPPO(); o.play();
等价于new.OPPO().play();
第7天必须掌握知识点 >>>构造函数、构造代码
第14天必须掌握知识点 >>>collection/E/集合接口实现类(子类)
首先掌握集合概念 泛型概念 实际业务当中的怎么使用 理解透彻
一、泛型
泛型优点1 约束类型功能
<>里面规定是放指定的类型 一般是引用类型以及封装类型
泛型优点2 高级的通用代码
使用
e是形式参数 g h f之类都可以
eg:
private static
for (E ddd : e) {
System.out.println(ddd);
}
}
二、高效for循环使用
for(1 2:3){循环体}
1:本轮遍历到的数据的类型2:遍历到的数据的名字3:指的是要遍历的数据/元2的名字随便
三、collection的方法 可以查看API直接变量名调用即可
需要记忆几个常用的方法调用;集合本质是数组
四、有疑问的问题?
Object[] array=c.toArray(); 这个转换数组类型之所以前面是Object是源代码底层规定,而且返回值类型也是object
第15天必须掌握知识点>>>collection/E/集合接口实现类(set与list map)
一、集合的迭代器(和数组遍历其实是一回事)
操作步骤:
1.获取集合的迭代器 c2.iterator();
2.利用迭代器进行判断当前集合中是否有下一个可迭代的元素 it.hasNext()
3.利用迭代器获取当前迭代到的元素it.next()
备注:
想迭代先用这个集合的对象调用iterator方法
比如c.interator alt+回车接下创建对象 出来的泛型会默认和对象类型一样的
【Iterator
举例:
第一步Iterator
第二步while (it.hasNext()){//循环判断是否有元素可迭代
第三步Integer num=it.next();//根据迭代器获取本轮迭代到的集合中的元素
第四步System.out.println(num);//打印获取到的本轮迭代到的集合中元素
二、理解创建对象意思 阐述
1)Collection
这是创建一个多态对象 ,左边的是一个父类的接口collection 右边是一个子实现类ArrayList
2) ArrayList
这是纯子类的对象
三、Arraylist与colleciton关系
Arraylist 作为子接口,是有顺序的>>>>>list一般都是和下标有关系的
它底层数据结构是数组,内存空间是连续的
特点:
1.可以存放重复的元素原理是索引值不同所以可以重放(索引就是下标意思一样的)
2.元素有下标并且可以存放重复的元素
3.数据量较大情况,增删慢查询快 因为是数组那样的连续的 所以块 链表那样就慢了
四、list的方法
因为继承于colleciton所以也可以用这个样子的调用c.add()方法
几个不好记得方法
>>>>在集合的指定元素引处添加指定元素
list.add(1,"蛇精");
>>>>获取指定下标的元素
System.out.println(list.get(8))
>>>>修改集合元素中指定元素的值
System.out.println(list.set(5,"蝎子精"));
>>>>在list集合的指定元素索引处开始添加list2的所有元素
System.out.println(list.addAll(1,list2));
五、问题与疑问
关于迭代的多种方法
方法一:(循环逻辑 从哪开始 到哪结束 如何变化)
for(int i=0;i System.out.println(list.get(i));这个是根据索引获取对应元素 调用get } 备注:i代表集合中元素的索引值,size代表的是元素个数哥就是长度,size-1就是最大下标值也就是最后一个元素 >>>>逆序迭代的编写思路 【第一步先写出正序迭代,判断是否走到头了 最后一个元素那里,用if判断看是不返回false这个结果,知道迭代器没有下一个元素可以迭代了if(false),然后有元素时候为真就可以进入大括号执行,进入后判断前面是否有元素可以迭代,然后打印获取到的前面的元素。记得加break不然就会从后往前然后前往后循环】 备注:it3.hasNext是判断后续是否有元素可迭/it3.previous判断前面是否有元素可以迭代 ListIterator while (it3.hasNext()) {//判断后续是否有元素可迭代 System.out.println(it3.next()); if (!it3.hasNext()) { System.out.println("开始逆序迭代"); while (it3.hasPrevious()) { System.out.println(it3.previous()); } break; } 六、linkedlist与colleciton关系 linkedlist特点:底层结构为链表 1.linkedlist链表是一种新的数据结构,内存不连续,靠地址引用连起来 2.查询很慢 增删快 因为链表节点随时断连 3.也可以放重复元素 4.元素也有下标,有序 5.linkedlist头节点只有下一个节点的地址,尾节点有上一个节点的地址 七、linkedlist的不好记方法 System.out.println(list2.offer("斗罗大陆"));//添加尾元素 System.out.println(list2.offerFirst("盗墓笔记"));//添加首元素 System.out.println(list2.offerLast("钢铁是怎样炼成的"));//添加尾元素 System.out.println(list2); 八、Map接口(这玩意不是集合的子类) 理解成一种映射关系 成对的 比如泛型 <9527 白骨精> 等价于 九、set接口与collection(接口子类 collection的接口实现类) set这个接口实现类玩意主要是为了去重用的,然后方法也可以继承集合用add 特点: 1.集合中的元素的都是没有顺序的 2.set集合里面元素是不重复 3.set可以存null,但也就是存一个 第16天必须掌握知识点>>>进程、线程与多线程、异步、同步锁 一、进程与线程 进程就是一个打开一个程序一个软件 线程就是一个软件里面的菜单栏里面展开的小功能 依次理解 一个进程可以包含多个线程也可以单个(单线程) 然后那个CPU是同一时刻只能处理一件事 二、理解线程的状态 就绪>执行状态>阻塞状态 线程创建中申请的PCB值得是一个控制块,里面存的是当前线程的情况和活动过程 并且只有就绪才能转执行状态 方式一 1.记住通过继承Thread类并重新run()来完成的 2.重写run()里面是我们的业务 3.创建多个线程对象 4.线程对象调用start,以多线程的方式启动 方式二 1.自定义多线程类实现Runnable接口 2.添加抽象方法run 3.创建自定义类对象,作为目标业务类对象 4.创建多个线程对象thread, 5.以多线程方式启动刚建好的多个线程对象start(); 举例:方式一 记住这个是继承 extends Thread Mythread t1=new Mythread(); Mythread t2=new Mythread(); Mythread t3=new Mythread(); Mythread t4=new Mythread(); t1.start(); t2.start(); t3.start(); t4.start(); class Mythread extends Thread{ @Override public void run() for (int i = 0; i <10 ; i++) { System.out.println(i+"="+getName());} 举例:方式二 这个是用到实现类接口 implements Runnable 通过图中方法让runnable和thread建立关系 然后target就是runnable接口实现类的对象 MyRunnable target=new MyRunnable(); Thread t1=new Thread(target); Thread t2=new Thread(target); Thread t3=new Thread(target); Thread t4=new Thread(target); t1.start(); t2.start(); t3.start(); t4.start(); } } class MyRunnable implements Runnable{ @Override public void run() { for (int i = 0; i <10 ; i++) { 备注:curerntThread()是静态方法,可以被类直接调用,这个方法作用是获取当前正在执行的线程对象,咋们把它当作一个中转站,然后用 getname()再调用当前线程的名称 System.out.println(i+"="+Thread.currentThread().getName()); } 线程池理解 它的工具是Executors,这玩意是辅助创建线程池的工具类 方法:newFixedThreadPooL(int)括号里是定线程的数目; 举例: 上面那个三、中的子类部分不变动,公共类上面就换成了如下,就是提高了效率,不用一个线程创建一个对象了,这么个意思的 TicketRunnable2 target =new TicketRunnable2(); ExecutorService pool = Executors.newFixedThreadPool(5);//使用Exectors工具的方法 第17天必须掌握知识点>>>设计模式&注解&反射 一、单列设计模式 这个概念是主要目的就是为了节约系统内存空间,控制资源的使用 核心是确保对象有一个 这个要用到RunTime接口 关于单例设计模式的两种设计方式: * 1.饿汉式:不管你用不用这个类的对象,都会直接先创建一个 * 2.懒汉式:先不给创建这类的对象,等你需要的时候再创建--延迟加载的思想 * 延迟加载的思想:是指不会在第一时间就把对象创建好占用内存 * 而是什么时候用到,什么时候再去创建对象 * 3,线程安全问题:由于我们存在唯一对象single2,并且多条语句都操作了这个变量 * 如果将程序放到多线程的环境下,旧容易出现数据安全的问题, * 所以解决方案 这玩意是Java 1.5 开始引入的一种标注,相当于给代码打一个 tag、作一个标记。 有毛用? 编译器:让编译器 / APT根据注解的定义,去执行一些逻辑 运行期:让虚拟机根据字节码中的注解,执行一些逻辑 先这样理解:创建一个文件或一段代码,类型为 @interface。这样该 “类” 就变成了一个注解,为什么 “类” 语法格式@+类型+注解名 这个玩意一共分个三类 JDK自带注解>>>展开有5个 1.@SuppressWarnings(“deprecation”) 2.@Override :用来标识重写方法 3.@Deprecated标记就表明这个方法已经过时了,但我就要用,别提示我过期 元注解>>>展开有5个 @Target 注解用在哪里:类上、方法上、属性上等等 @Retention 注解的生命周期:源文件中、字节码文件中、运行中 @Inherited 允许子注解继承 自定义注解>>> 注意:注解的语法写法和常规java的语法写法不同 使用”ElementType.静态常量“的方式自定义注解具体可以加在什么位置 三、怎么理解反射 反射就是可以让运行中的 Java 程序对自身进行检查,或者说“自审”,也有称作“自省”。 反射中单元测试方法:是java中最小的测试单位,使用灵活 > 代表是这个泛型范围更加宽广,理解为多态,反正就是约束类型的 反射前提 反射第一步获取字节码对象: Class.forName(“类的全路径”); 类名.class 对象.getClass(); 第二步使用常用方法 获取包名 类名 clazz.getPackage().getName()//包名 clazz.getSimpleName()//类名 clazz.getName()//完整类名 获取成员变量定义信息 getFields()//获取所有公开的成员变量,包括继承变量 getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量 getField(变量名) getDeclaredField(变量名) 四、理解字节码对象 .class"文件的对象就是字节码对象。jvm会把.class文件加载到内存,并在堆里创建字节码对象并初始化字节码对象的静态属性,并把类型信息等加载到方法区。 先说说字节码是一种包含执行程序,由一序列 op 代码/数据对组成的二进制文件,是一种中间码。字节是电脑里的数据量单位。然后字节码对象。 Class对象(字节码对象) java世界里,一切都是对象,可分为两种对象,Class对象和实例对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。 每一个类都有一个Class对象,每当编译一个新类就产生一个Class对象,基本类型 (boolean, byte, char, short, int, long, float, and double)有Class对象,数组有Class对象,就连关键字void也有Class对象(void.class)。Class对象对应着java.lang.Class类,如果说类是对象抽象和集合的话,那么Class类就是对类的抽象和集合。 Class对象是在类加载的时候由java虚拟机(JVM)以及通过调用类加载器中的 defineClass方法自动构造的,一个类被加载到内存到供我们使用三个阶段:加载,连接,初始化 所有的类都是在对其第一次使用时,动态加载到JVM中的(懒加载)。当程序创建第一个对类的静态成员的引用时,就会加载这个类。使用new创建类对象的时候也会被当作对类的静态成员的引用。因此java程序程序在它开始运行之前并非被完全加载,其各个类都是在必需时才加载的。这一点与许多传统语言都不同。 社区回答理解:每个类被加载之后,系统就会为该类生成一个对应的字节码对象,通过该字节码对象就可以访问到JVM中的对应的类。在Java中获得Class对象通常有三种方式。 第一种:使用类的.class属性 第二种:通过Class类中的静态方法forName(String className),传入类的全限定名(必须添加完整包名)比较常用 第三种:通过对象的getClass方法来实现,其中,getClass()是Object类中的方法,所有的对象都可以调用该方法 Class> clz3 = str.getClass();
//循环启动线程
for (int i = 0; i <5 ; i++) {
pool.execute(target);
}
要加引号呢,因为真正的类是 class 修饰的,而 @interface 修饰的就是一个注解。
反射能直接操作程序的私有属性。也可以当想使用别人的东西或者是资源时候,可以使用反射技术。反正不能直接看到源代码,就可以用反射技术
语法要求:@Test+public+void+没有参数



