Java 关键点问题汇总(图片加载有问题,内容持续更新ING)

强制类型转换:小数据向大数据进行转换 相当于小杯子向大杯子中倒入东西,会自动进行强制类型转换;相反,大容器向小容器中添加水   则会强制进行强制类型转换

变量命名:第一个字符不能使用数字

变量的第一个字符只能使用字母 $和  _ 下划线

变量声明在一个类下面,该变量叫做字段或属性,成员变量

变量声明在一个方法中,那么该参数作用域只能是方法内的所有代码,其他方法不能访问该参数,类里面的也不能访问

声明在方法内的变量 局部变量,作用域在声明开始的位置到其所处的块结束位置

属性的作用域在方法中,参数的作用域也在方法中,如果属性和参数命名相同了的话  取参数中的数值

Final类别要求

Final参数修饰变量只能改变一次  final修饰类标识类不能被继承 修饰方法标识不能被重写

Final 修饰基本类型变量,表示该变量只有一次赋值机会

Final 常量表示不能够发生变化(可以公开表示不会被修改的)

String类 属于Final类型不能够被继承

Scanner 部分内容:

引用scanner    需要引入的部分:import java.util.Scanner; //ctrl shift +o 快捷添加包

Scanner 函数   需要引入包 java.Util.Scanner  scanner s = new scanner(System.in)

String a =s.nextLine() 输入一个字符形式的内容//

输入一个float形式的内容 float a = s.NextFloat

特殊情况:读取nextint形式    会先进行读取整数在进行读取字符串 nextint 仅仅读取数字信息,故因此要执行了两次的   nextline

Scanner s  = new  scanner(System.in)

System.out。println(“请输入身高”)

Float height = s.nextFloat();

System.out。println(“请输入体重”)

Float weight = s.nextFloat();         //只需要一个sacnner即可实现对应公共

(Ps:float中的字面值中对应的数值才需要加f     eg:1.74f)

PsnextInt使用后会遗留一个空白符"\r"导致nextLine()结束

a^b   异或进行计算 不同为相同为0

长路|    短路||   (长短路或二者都是真为真,都为假为假)      长路短路&&

闰年:year%4==0&&year%100!=0||year%400 = =0

Switch 中的默认参数需要给最初的初始化的数值内容  (注意默认的输入的时候的参数问题)   switch中的每一项输出完之后需要有break参数进行处理

(Switch后面要有break 来进行输出的控制)

Do(循环体结构) while(循环条件)至少会被执行一次  

while 成立的话会一直被循环执行

continue下面的代码不执行了执行下一次循环   continue 继续下一次循环

(例题涉及到的忽略某些项)    if(num%2==0){continue  sys。。} 当是偶数的时候就会自动跳过最后的输出执行下一次循环

Break 结束当前循环

While(1)he while(true)等价

If else 中没有括号会执行最近的一条

Math.random() //设置出随机数随机数的默认范围是0-1     Ps: 默认的时候math的包时自动导入的,不需要手动添加。 一般执行的时候都 math.random*100 进行扩大

数组:int a[] = new int a[]{100,200,300}

/   int a [];      a= new int a[3      int b [] = {100,200}

数组不能直接输出  需要重新进行for循环遍历才可以     如

               System.out.println(a[i]+"") 是错误的

复制数组:System.arraycopy(src,srcPos,dest,destPos,length)

源数组;复制的起始位置;目标数组;复制到目标数组的起始位置;复制的长度

Int a[] = new int[]{1,2,3,4}

数组复制:int[] b = Arrays.copyOfRange(a, 0, 3);

数组Arrays 的作用

Arrays.CopyOfRange 第一个参数表示源数组

        // 第二个参数表示开始位置(取得到)

        // 第三个参数表示结束位置(取不到)

      String context =sArrays.toString(a);

Arrays 提供了sort方法进行排序

ArraysSort(a)     其中a为数组名       PSsort方法只能针对一维数组。

Tips:

Sort处理二维数组的时候   限制性System.Arraycopy 进行数组复制到一个一维数组中然后在使用 sort进行排序;最后在复制回二维数组中。      !!!!!!(二维数组转一维数组

(大问题)

。。。。。。。。。。。。。。。。。。

类和对象     Hero h = new Hero()       new hero 仅代表创建的了一个Hero对象

H这个变量是hero类型 也叫做引用    = 表示h这个引用代表右侧创建的对象 也叫做指向

h指向hero对象

多个引用 一个对象:   Hero h1= new Hero(); Hero h2= h1;///h2指向h1指向的对象

一个引用多个对象时,同一时间只能指向一个对象      Ps;=右侧为指向的谁

Hero h  =  new Hero();  (1)    (2) h = new Hero();    此时1 已失效

方法的重载:方法名一样,但是参数不一样;

形参中的括号中的三个省略号代表   fun(Hero…heros ) 中的省略号代表可以和多个参数进行匹配     

PS:其中的最后一项会默认的变成对应形式的复数形式,访问对应的成员变量时候需要执行    heros[i].name    执行循环的时候执行   直接执行heros.name不会成立

实例化:一个类创造一个对象是类的实例化 

构造方法:方法名和类名 相同(包括大小写)   且没有返回类型  public Hero(){syso}

实例化一个对象的时候必须用构造方法 

如果不写系统会默认给一个 无参数的构造方法          一旦有有参的构造方法就不会再提供无参数的构造方法

This中的关键字带表当前对象    可以理解为“我” 的意思/表示当前对象

ShowaddressMemory   会显示当前的虚拟地址

//通过this访问属性

    public void setName3(String name){

        //name代表的是参数name

        //this.name代表的是属性name

        this.name = name;

}

Tips:当参数名和属性名相同的时候用 this 执行操作    (参数名和属性名相同时应用

参数名和属性名相同的时候,方法体中只能访问到参数name

如果要在一个构造方法中,调用另一个构造方法,可以使用this()   eg:this(name)

前提是有对应的要调用的方法 再在另一个构造方法(和类名相同的构造方法)中进行引用对应的方法

且另一个构造方法中也要是构造函数

。。。。

变量类型和类类型

(形参是)引用类型(包括类,数组,接口)的参数传递:此时实参和形参公用同一块地址数值都会发生改变

基本类型的参数传递:实参不会有影响

变量是类类型的参数此时的变量就不代表指向的意思而是代表引用??????(没太懂的地方)

包:不同包之间的引用需要使用import 

变量类型:成员变量的四种修饰符:private protected  package(默认的类型) public-共有的(没有修饰符的默认为package类型的)

成员变量默认的修饰符是:public static final

类之间的关系:自身   同包子类 不同包子类   同包类  其他类

  1. 属性通常使用private封装起来
    2. 方法一般使用public用于被调用
    3. 会被子类继承的方法,通常使用protected

Privatepackagepublic

当一个属性被static修饰的变量叫做类属性也叫做静态属性;类属性所有对象共享一个值

类属性(也叫做静态属性)      类属性可以理解为有static的属性,同理类变量

对象属性(也叫做实例属性,非静态属性)

访问类属性:对象.类属性    //  .类属性  (推荐用第二种)

对象属性适合每个角色不同的(如英雄名);类属性适合所有角色共享的(如设置血量上限)

类方法在main中可以不用对象直接用:类名。方法调用

实例方法/对象方法/非静态方法必须要在main中有一个对象才能调用(类名实例化一个引用对象,引用.属性的形式调用)

类方法调用同类属性一样

对象属性初始化:(三种形式):

1. 声明该属性的时候初始化 
2. 构造方法中初始化      3. 初始化块    eg{  maxp =30;}

类属性初始化(两种)

1. 声明该属性的时候初始化
2. 静态初始化块    如:static{ item = 6    }   //访问时类属性名.属性

对象属性的初始化的先后顺序:构造方法》初始化》声明块

JVM虚拟机

单例模式:一个类在一个JVM中,只有一个实例存在

饿汉式单例模式:私有化其构造方法,让外部无法通过new来进行实例化;

Public class GiantFragon

//准备一个类属性指向一个实例化对象,因为是类属性所以只有一个

Private static GiantDragon  instance = new GiantDragon() 

//每一次都是获取同一个对象

Public static GianDragon getInstance(){  return instance   }  //外部调用者无论如何都会创建一个实例

懒汉式单例模式:只有在调用getInstance的时候才会创建实例

饿汉和懒汉式区别:饿汉相当于立即加载;懒汉相当于延时加载

(饿汉模式构造类变量的时候就直接进行初始化,懒汉模式 需要时候在进行创建)

面试题:单例模式三元素:******

  1. 构造方法私有化

2.静态属性指向实例

3.public static getInstance方法,返回第二步的静态属性

(例上面的静态属性  instance  

枚举类型enum 是一种特殊的类

Public enum Season{  spring summer autumn    }     //可以很方便的定义常量

(可以结合switch 将属性锁死在这几个范围之内)

。。。。。。。。。。。。。。。。。。。。。。。。。。。。

接口   @override   子类重写父类的方法

引用类型和对象类型不一致情况下的转换问题 (同行情况下引用类型和对象类型是一致的)

Ps子类转父类:(向上转型)所有的子类转向父类都是行得通的   理解为:把子类当作父类来用

没有继承关系的两个类互相转换一定会失败

Instance关键字用来判断是否为一个类

重写:子类可以继承父类的对象方法,继承后重新提供该方法就叫做方法的重写也叫覆盖 override

。。。9.14

操作符的多态: +号的两侧都是整型,那么+代表 数字相加;如果任意一个是字符串,那么就代表的是字符串的连接

实现类的多态:父类的(接口)引用指向子类对象;调用的方法有重写

方法的重写是子类覆盖父类的对象方法 隐藏是子类覆盖父类的类方法

Super关键字  子类构造方法会默认调用父类的 无参的构造方法

Super指的是当前对象的直接父类对象

能调用父类的成员变量super.,成员方法super.成员方法(实参列表);构造方法super(实参列表)

This和super关系?  : ****    核心内容

this现在子类找找不到到父类找;super直接越过子类直接向父类进行查找

当没有写构造方法的时候,JVM会默认的提供一个无参的构造方法

当写了构造方法之后,JVM将不提供无参的构造方法,需要自己写一个

Super注意点:1)在子类重写方法中需要调用关键字super (调用子类会直接进行死循环)

(2)子类的成员变量和父类的成员变量同名如何区分?

局部变量直接属性即可eg (name)实现;

子类通过this.name实现

父类的成员变量通过super.name实现

3)子类无法继承父类的成员变量的方法和属性 且子类无法继承父类的静态变量和静态方法 (继承是对象之间的关系,没有静态的关系)

子类中如果想操作父类私有方法,需要通过getter setter的方法来进行执行   

(父类中增加getName(),setName方法,子类中输出通过 superr.getName的方法即可)

超类:Object类是所有类的父类,默认是继承了Object

Object提供一个toString 方法

垃圾回收:一个对象没有任何引用指向时,满足垃圾回收的条件(finalize方法会被调用,虚拟机JVM直接调用)  public void finalize()方法 实现

Instanceof 用来判断和类名是否相同 hashcode 返回一个对象的哈希值

Object线程:wait notify notifyAll 方法

内部类:非静态内部类,静态内部类,匿名类,本地类

非静态内部类可以在类里面定义:语法new 外部类().new 内部类()

静态内部类:语法:new 外部类.静态内部类();   

PS不需要一个外部类的实例为基础;不可以访问外部类的实例属性和方法;也可以访问外部类的私有静态成员外

匿名类指的是在声明一个类的同时实例化它

JDK默认方法: review 该方法有实现体 并被声明为了default类型

Default  public  void  方法名(){}

UML图表示

方法有下划线,表示是构造方法

抽象方法:子类必须覆盖重写 父类当中所有的抽象方法;不能直接创建new抽象类对象。
必须用一个子类,继承抽象的父类;   public abstract void Animal()

  1. 抽象类不能创建对象
  2. 抽象类可以有构造方法
  3. 抽象类中不一定包含抽象方法
  4. 抽象类的子类,必须覆盖重写所有的抽象方法

抽象类的子类需要对自己的属性值进行赋值的时候通过对  抽象类的属性的setget的属性进行创建   ——子类通过创建对象后的 属性值的set get方法对属性进行赋值

受保护类型的量  protected

子类继承父类的时候会自动继承默认的构造函数(这里指无参的构造函数)。而子类里面已经有一个带有参数的构造函数了,如果没有写那个默认的不带参数的构造函数的话,继承的时候就会报错

//9.15

基本类型转为Integer类型的量   ——在Integer 类型new新的变量的时候括号中给出即可

Int o = 3    

integer o   =   new   IntegerO  //基本类型转为Integer类型 /基本类型转为封装类型

int S =  o.IntValue()   //Integer类型转为基本类型  别忘了后面的括号 /封装类型转为基本类型

  

Integer int 的包装类  Integer必须实例化后才能用使用 Integer 默认值为null

数字封装类有 Byte(占一个字节),Short,Integer,Long,Float,Double 这些类都是抽象类Number的子类

基本类型对应的类的类型就是其封装类   int 的封装类为Integer Char对应的封装类   Character

装箱:不需要调用构造方法,通过=符号自动 基本类型 转换为 类类型  自动转换

Int I = 3       Integer it=i

自动拆箱:    int i3 = it.intValue();    int  K   = it    (也是用= 实现)

装箱:int——integer 拆箱:Integer——int

Int的最大值可以通过其对应的封装类Integer.MAXVALUE/MINVALUE 来实现

ByteInteger之间能不能进行自动拆箱和自动装箱

小的(byte)可以向大的(Integer)装箱   反之不成立

数字转字符串    

 String st = String.valueofi 1

Integer it = I String str2 = it.toString() ;   2

字符串转数字

(调用Integer的静态方法parselnt

String str = 999   int i= Integer.parselntstr 

///9.18

Math类别:

Math.round   math. PI    math.E  //(自然对数)Math.sqrt()//平方

Math.pow2,3//2的三次方     Math.random()//随机数

Round () 四舍五入的方法 执行为mathRoundg

判断是否为质数可以用Sqrt的方法来执行

 %s 表示字符串

Syso.printf   SYSO.format 的作用效果相同 

使用%n  可以实现跨平台的 换行实现    \n 换行符 \r回车符

%-8d 表示左对齐总长度为8    %8d表示右对齐  

%08d 表示总长度为8 不足的位补0

Char 保存一个字符的时候使用

Character 含有的方法:

  (Character.isDigit('a')); //判断是否为数字

 (Character.isWhitespace(' ')); //是否是空白

 (Character.isUpperCase('a')); //是否是大写

 (Character.isLowerCase('a')); //是否是小写

 (Character.toUpperCase('a')); //转换为大写

Character.toLowerCase('A')); //转换为小写

String a = 'a'; //不能够直接把一个字符转换成字符串

String a2 = Character.toString('a'); //转换为字符串

tocharArray()   //字符串转为字符数组

 String 被修饰为final是不能被继承的   因为String 不能被继承

CharAt 获取字符   tocharArray获取对应的字符数组  substring截取字符串 

Split 分隔   trim去掉首位空格    

属性名.方法大小写    String  name =  “”

Substring  indesOf(判断字符或字符串第一次出现的位置)

RepaceALL 替换所有的  ReplaceFirst 只替换一个

name.toLowerCase()        name.toUpperCase()

StringBuffer 是可变长的字符串 

StringBuffer的方法  append(追加delete(删除)insert(插入)reverse(反转)

Capacity  容量

//9.23

Java 的日期类 java.Util.Date

Java.sql.Date 是给数据库访问的时候使用的   

Date(5000)//代表5000毫秒 等于5   getTime()得到一个long形的整数

日期格式化类:SimpleDateFormat  

//y 代表年

        //M 代表月

        //d 代表日

        //H 代表24进制的小时

        //h 代表12进制的小时

        //m 代表分钟

        //s 代表秒

        //S 代表毫秒

SimpleDateFormat sin  = new SinpleDateFormat(“yyyy-MM-dd HH:mm:ss SSS”)  //规范化输出的日期的格式

Carlendar 日历类别 常用于进行翻日历              

Calender C = Calendar.getinstance()   //用于返回一个Calendar 对象

Add方法:在原日期上增加年//     Set方法:直接设置年//

//中级9.26

New FileInputStreamf)试图打开某个文件 

Try catch  抛出异常问题

文件存在顺序执行且不会执行catch中的代码

文件不存在:try中的代码会立刻终止

文件路径中的:FileNotFoundException  一般第一反应是path不存在

其中的printStackTrace用来判断位置  

Catch中的Exception 也可以catchFileFoundException的异常内容

解析异常ParseException

多异常捕捉方法:catchFileNotFoundException|ParseException

(注:instanceof  用于判断一个类是否是另一个类的实例)

异常的抛出过程中 当有finally修饰的内容部分无论是否抛出异常都会被执行

异常的处理要么用try-catch    要么用throws来进行抛出相应的异常项

一但try-catch住了就相当于处理完了这个异常的内容

FileNotFoundException   FileInputStream()  File文件位置 

面试题:throwthrows的区别

throws 出现在方法声明上,而throw通常都出现在方法体内。
2. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象。

Finally中的返回值中有数值的时候会默认的返回finall中的代码 (会默认的取代try catch中的数值)

异常分类: 可查异常,运行时异常和错误3  其中,运行时异常和错误又叫非可查异常

FileNotFoundException为可查的异常处理:不进行处理编译器不会让其进行通过

(要么往外抛,要么谁调用的问题,谁处理)

9.29

File inputstream 文件读取的io

运行时异常:

除数不能为0异常:ArithmeticException 
下标越界异常:ArrayIndexOutOfBoundsException 
空指针异常:NullPointerException 

运行时异常和非运行时异常的区别:error表示程序中的严重错误问题,大多数和编写者执行的操作无关,一般表示和java相关的java虚拟机的问题

运行时异常常常指的是程序本身可以处理的异常问题,运行时异常都是RuntimeException类和其子类的异常,常见的有空指针异常、下行越界异常、类转换异常、数据存储异常。运行时异常指的是虚拟机通常操作中可能遇到的异常,是一种常见的运行错误

运行时异常是不可查异常,不需要进行显式的捕捉
非运行时异常是可查异常,必须进行显式的捕捉,或者抛出  Error不捕获,因为此时表示程序直接无法运行,捕获没有任何意义

Throwable是类,ExceptionError都继承自该类别 因此在进行捕捉的时候可以通过Throwable进行捕获

9.30

创建文件的绝对路径和相对路径:getAbsulutePath();

Getpath ()//获取其中的相对路径  eclipse中就是相当于项目目录位置 

Isfile /是否是一个文件

File f = new File()   //括号中必须要有对应的路径问题

f.list //返回当前文件夹下的字符串数组的形式返回当前文件夹下的所有内容

flistfile 表示返回当前文件下的子文件

输入流 inputstream  outputStream 输入输出流

数据源可以是文件/数据库/网络或者是其他的程序

建立了一个文件的输入输出流可以将数据输出到JVMJava虚拟机中)

输入流是一个抽象类,只能提供方法声明,不提供具体的方法的实现

FileInputStream InputStream的子类    

输入流执行的是  readall   输出流执行的是 wirteall

相同点:都需要在最后执行后执行 f.close()进行关闭的数据流

try中进行数据流的关闭会占用大量资源,因此会执行在finall中来进行数据流的关闭

toCharArrary()  //将字符串转换为字符数组

java中的汉字执行后都会变成JVM的形式

缓存流解决字符流和字节流的弊端:缓存在读取的时候会一次性多的数据读取到缓存中;写数据时候会先把数据写入到缓存区,知道缓存区满了一起写入到硬盘中去

字符流:每写一个字节都访问硬盘

立刻把数据写入到硬盘 flush() 方法

PrintWriter 缓存字符输出流, 可以一次写出一行数据

缓存字符输入流 BufferedReader 可以一次读取一行数据

DataInputStream 数据输入流  DataOutputStream 数据输出流  

System.out 是常用的在控制台输出数据的  System.in 可以从控制台输入数据

EgScanner s = new ScannerSystem.in

流——字节流/字符流——数据流/对象流/缓存流

..

数组的长度不用会产生浪费——因此产生了ArrayList (容器类的概念)

Heros.add()

10.2

Contain判断是否在容器中,判断是否为同一个对象,而不是name相同

Indexof判断对象在ArrayList中的位置;

toArray可以把一个ArrayList对象转换为数组

addALL把容器中的所有对象都添加进去。

ArrayList<E> 就是一种泛型

List<Hero >  generaction  =  new ArrayList<Hero>();  //设置一个泛型

Java1.7提供了一种只需要书写前面的泛型名称即可的放肆

List<Hero> generacttion   = new Arraylist<>();    //泛型的简单书写方式

泛型类编写的目的是:编写的代码可以被不同类型的对象引用

List是一个接口,而ArrayListList接口的一个实现类。ArrayList类继承并实现了List接口

所以List不能被构造,不能创建实例对象

迭代器处理遍历结合中的元素Iterator  迭代器

双向链表结构Deque,可以很方便的在头尾插入删除数据

二叉树 Node 类名   public Node leftNode//左子节点;   public Node rightNode //右子节点

 public Object value

java 实现冒泡排序:每一次都会确定一个最大的数值

HashMap 存储的——键值对  HashMap<String,String> a  = new HashMap<>();

获取键值对通过get() 函数获取   hash中的key是唯一的 是不可以重复的,相同的key指挥保留最后进行插入的数据

HashMap中的HashSet

HashSet 中的元素不允许重复    如: HashSet<String> names = new HashSet<String >()

PSset中不提供get()来获取指定位置的元素,所以遍历需要用到迭代器胡总恶化增强型的for循环

增强形for循环:适用于集合  MapCollection  (集合的两个主要接口);Collection 又分别被ListSetHash中的SetArraryList中的方法)

Interator迭代器   Java集合的顶层接口

注:CollectionMap之间没有关系,Collection是放一个一个对象的,Map 是放键值对的

常考的面试题:ArrayList 与 LinkedList的区别是面试常常会问到的考题

ArrayList 插入,删除数据慢       LinkedList, 插入,删除数据快
ArrayList是顺序结构,所以定位很快,指哪找哪。 就像电影院位置一样,有了电影票,一下就找到位置了。

LinkedList 是链表结构,就像手里的一串佛珠,要找出第99个佛珠,必须得一个一个的数过去,所以定位慢

Collection 类中的类方法有:reserve 、shuffle、 sort、swap(交换)

reserve集合中的翻转:Collections 是容器的工具类,容器的工具类如同Arrays是数组的工具类

Shuffle 混淆List数据的顺序

Sort 排序方法   swap交换    rotate (numbers,2) 向右滚动元素

线程安全化:synchronizedList     

list中可以通过   对象名.get() 来获取对应的数值    1000000d中的d代表方差

ArrayList有顺序 HashSet无顺序且HashSet的具体顺序,既不是按照插入顺序,也不是按照hashcode的顺序(其中不同的JVM执行的不一样)

创建一个List组合数据 通过add(9) //添加 数字9   来进行数据的添加

List类是ArrayList类的泛型等效类 ——

eg:List<Integer> number = new Arraylist<>(); 

List中的数据可以重复(ArrayList创建,通过ADD添加)

Set中的数据不能够重复    (两次add添加只会保留一个具体的数据)

重复判断标准是:首先看hashcode是否相同;如果hashcode不同,则认为是不同数据;如果hashcode相同,再比较equals,如果equals相同,则是相同数据,否则是不同数据.

(int)(Math.random()*10000)   //四位数  random获得的默认的为0-1

Mathradom   *100为0-99             

PS:List是一个接口,而ArrayList是List接口的一个实现类。ArrayList类继承并实现了List接口。 List接口不能被构造,也就是我们说的不能创建实例对

HashMap和Hashtable 的区别:HashMap和Hashtable都实现了Map接口,

都是键值对保存数据的方式

区别1: HashMap可以存放 nullHashtable不能存放null
区别2:HashMap不是
线程安全的类   Hashtable是线程安全的类

Eg:形如:Hashtable<String,String>     hahMap.put(123,null)

 keySet()可以获取所有的key, values()可以获取所有的value

egSet<String> k = hashmap.keySet();  //k V为自己定义的量

Collection<String> v = hashmap.values();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值