博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础笔记
阅读量:5297 次
发布时间:2019-06-14

本文共 20304 字,大约阅读时间需要 67 分钟。

封装

隐藏对象的属性和实现细节,仅对外提供公共访问方式

提高了代码的复用性

提高了安全性

private

仅仅是封装的一种体现形式,不能说封装就是私有

this

代表当前对象的引用

 

 

 

 

构造方法

构造方法不能用对象调用

return;

构造方法的重载

重载:方法名相同,与返回值类型无关(构造方法没有返回值),只看参数列表

 

static:

非静态方法在调用的时候必须创建对象调用

在主方法中调用本类 的静态方法,可以省略类名,系统会默认加类名

静态只能访问静态

 

 

 

 

 

 

 

局部代码块

在方法中,限定变量生命周期,及早释放,提高内存利用率

构造代码块(初始化块)

在类中方法出现

每次调用构造都执行,并在构造方法前执行

静态代码块

随类的执行而执行

只执行一次

优先于主方法执行

 

 

 

继承extends

让类与类之间产生关系

父子类的关系

Class Animal{

String color;

Int leg;

String name;

Public void eat(){

System.out.println(“吃饭”)

}

public void sleep(){

Systrm.out.println(“睡觉”);

}

}

 

Class Cat extends Animal{}

Class Dog extends Animal{}

提高了代码的复用性

增强了代码的维护性

增强了耦合性

开发的原则:高内聚,低耦合

Java只支持单继承

Java可以多重继承

子类只能继承父类所有非私有的成员(成员方法和成员变量)

子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法

不要为了部分功能而去继承

Is a的关系

子父类出现同名变量(开发中不会出现):就近原则,子类有就不用父类的

子类继承父类就是为了使用父类成员

this调用本类的(本类没有,调用父类的)

super调用父类的

 

 

子类继承父类

class Son extends Father{

public Son(){

//thissuper只能存在一个,且必须在第一条语句

//super();//隐藏了一个super();调用父类无参构造

this(“王五”,25);//调用本类的有参构造

System.out.println(“son 空参构造”);

}

public Son(String name,int age){

super();//也隐藏了一个super();//如果没有无参构造,通过super(name,age);调用父类有参

System.out.println(“son 有参构造”);

 

}

}

 

 

 

 

1.jvm调用了man方法,main进栈

2.遇到Zi z = new Zi();会先将Fu.classzi.class分别加载进内存,当zi.class加载进内存,子类的静态代码会随着zi.class一起加载

3.走子类的构造方法,因为Java是分层初始化的,先初始化父类,再初始化子类,所以先走的父类构造,但是在执行父类构造是,发现父类有构造代码块,构造代码块是优先于构造方法执行的,所以第三个输出构造代码块Fu,第四个输出构造方法Fu

4.Fu类初始化结束,子类初始化,第五个输出构造代码块zi,再走构造方法zi

静态代码块-->构造代码块-->构造方法

 

 

继承中成员方法的关系

class Father{

Public void print(){

Public .out.println(“Fu print”);

}

}

class Son extends Fu{

public void method(){

Public.out.println(“Zi print”);

 

}

Public void print(){          //重写

Super.print();          //调用父类的print();

Public .out.println(“Zi print”);

}

 

 

}

 

重写

子父类出现了一模一样的方法

当子类需要父类的功能,而功能主体子类有自己特有的内容,可以重写父类的方法

 class Ios7{

public void call(){

System.out.println(“打电话”);

}

Public void siri(){

Systrm.out.println(“speak English”);

}

}

class Ios8 extends Ios7{

Public void siri(){

System.out.println(“说中文”);

super.siri();//可以不在第一行,可以不写不调用父类方法

}

}

 

1.父类的私有方法不能被重写

2.子类重写父类方法是,访问权限不能更低

子类的权限必须大于等于父类

为了比父类更强大

  1. 父类静态方法,子类也必须通过静态方法进行重写
  2. 子类重写父类方法的时候,最好声明一模一样。

 

 

 

重写override  重载overload

重载可以改变返回值类型,只看参数列表,,,本类中方法名一样,参数列表不同的方法,与返回值类型无关

 

重写是子类出现了和父类方法声明一模一样的方法,与返回类型有关,返回值是一致的

子类对象调用方法的时候:先找子类本身,再找父类(就近原则)

 

 

 

 

final 最终

修饰类,类不能被继承 final class fu{}

修饰变量,变量就变成了常量,只能被赋值一次 public static final int NUM= 10;//常量命名规范,大写,一般会与public static共用

修饰方法,方法不能被重写 public final void print(){}

 

final修饰变量的初始化时机:显示初始化,在对象构造完毕前(在构造方法进行赋值)

成员变量的默认初始化值为无效值,

final修饰基本类型是,值不能被改变

修饰引用类型时,地址值不能被改变,对象中的属性可以改变

 

 

 

重点

面向对象:多态polymorphic

事物存在的多种形态

多态前提:

要有继承关系

要有方法重写

要有父类引用指向子类对象Animal a=new Cat();  a.eat();//调用子类方法

Class Animal{

public void eat(){

System.out.println(“动物吃饭”);

}

}

Class Cat extends Animal{                //有继承关系

Public void eat(){                   //有方法重用

System.out.println(“猫吃鱼”);

}

}

 

 

 

成员变量

编译看左边(父类),运行看左边(父类)

成员方法(非静态)

编译看左边(父类),运行看右边(子类)动态绑定

Class Demo2_Polymorphic{

Public static void main(String[] args){

Father f = new Son();

System.out.println(f.num);          //输出10,这个ffather类型的

Son s = new Son();

System.out println(s.num);         //输出20

}

}

Class Father{

int num = 10;

}

Class Son extends Father{

Int num = 20;

}

 

 

 

 

Class Demo3_Polymorphic{

Public static void main(String[] args){

Father f = new Son();

F.print();        //输出son

}

}

Class Father{

int num = 10;

Public void print(){

System.out.print(“father”);

}

}

Class Son extends Father{

Int num = 20;

Public void print(){

System.out.print(“Son”);

}

 

}

 

 

 

 

静态方法:编译看左边(父类),运行看左边(父类)

静态和类相关,算不上重写,所以访问还是左边

静态和类相关,不算重写,所以访问还是看左边

Class Demo2_Polymorphic{

Public static void main(String[] args){

Father f = new Son();

F.method()       //输出father static method//相当于时Father.method()

}

}

Class Father{

int num = 10;

public void print(){

System.out.print(“father”);

}

public static void method(){

System.out.print(“father static method”);

}

}

Class Son extends Father{

Int num = 20;

Public void print(){

System.out.print(“Son”);

}

public static void method(){

System.out.print(“son static method”);

}

 

}

 

 

 

基本数据类经自动类型提升和强制类型转换

Int i=10;

Byte b = 20;

I=b;          //自动类型提升

B= (byte)i;    //强制类型转换

 

class Demo3_SuperMan{

Public static void main(String[] args){

Person p = new SuperMan();         //父类引用指向子类对象,超人提升为了人

                                //父类引用指向子类对象就是向上转型

System.out.println(p.name);         //结果:John

P.谈生意();                       //结果:谈几个亿的大单子

SuperMan sm = (SuperMan)p;       //向下转型

sm.fly();                         //结果:飞出去救人

 

}

}

class Person{

String name=”John”;

Public void 谈生意(){

System.out println(“谈生意”);

}

}

class SuperMan extends Person{

String name = “SuperMan”;

public void 谈生意() {

System.out.println(“谈几个亿的大单子”);

}

public void fly() {

System.out.println(“飞出去救人”);

}

}

 

 

多态的好处和弊端

弊端:不能使用子类特有的属性和行为

好处:提高了代码的维护性(继承保证)

提高了代码的扩展性(有多态保证)

可以当作形式参数,可以接收任意子类对象

class Demo4_Animal {

Public static void main(String[] args) {

method(new Cat());

method(new Dog());

 

//Animal a = new Cat();//开发很少用父类引用指向子类,直接创建子类对象可以调用子类方法

 

}

/*public static void method(Cat c) {

c.eat();

}

public static void method(Dog d) {

d.eat();

}*/        //扩展性太低

//正确

 

//如果把狗强转成猫,会有ClassCastException异常

Public static void method(Animal a){       //当作参数的时候用多态最好,扩展性强

//关键字instanseof判断前面的引用是否是后边的数据类型

If(a instanceof Cat) {

Cat c = (Cat)a;

c.eat();

c.catchMose();

}else if(a instanceof Dog){

Dog d=(Dog)a;

d.eat();

d.lookHome();

}else{

 

}

}

 

}

class Animal{

Public void eat(){

System.out.println(“动物吃饭”);

}

}

Class Cat extends Animal{

Public void eat(){

System.out.println(“猫吃鱼”);

}

Public void catchMouse(){

System.out.println(“捉老鼠”);

}

}

Class dog extends Animal{

Public void eat(){

System.out.println(“狗吃肉”);

}

Public void lookHome(){

System.out.println(“狗看家”);

}

 

}

 

 

 

 

抽象类

抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口

抽象类是按照多态的方式,由具体的子类实例化,抽象类多态

抽象类的子类,要么是抽象类

要么重写抽象类中的所有抽象方法

abstract class Animal{             //抽象类

public abstract void eat();      //抽象方法,直接加分号,不加大括号

}

//abstract class Cat extends Animal{}//抽象类的子类可以是抽象类

class Cat extends Animal{

public void eat(){               //重写抽象类中的所有抽象方法

System.out.println(“猫吃鱼”);

}

}

 

抽象类的成员特点

成员变量:既可以是变量,也可以是常量,abstract不能修饰成员变量

有构造方法:给子类进行初始化

既可以是抽象的,也可以是非抽象的

抽象方法:强制要求子类做的事情

非抽象方法:子类继承的事情,提高代码的复用性

 

 

abstract class Animal{             //抽象类

private String name;

private int age;

public Animal() {}

public Animal(String name ,int age) {

this.name = name;

this.age = age;

}

 

public abstract void eat();      //抽象方法,直接加分号,不加大括号

}

class Cat extends Animal{

public void eat(){               //重写抽象类中的所有抽象方法

System.out.println(“猫吃鱼”);

}

}

class Cat extends Animal{

public cat() {}

public cat(String name,int age) {

Super(name,age);          //super传给父类进行初始化

}

 

public void eat(){               //重写抽象类中的所有抽象方法

System.out.println(“猫吃鱼”);

}

Public void catchMose() {

System.out.println(“抓老鼠”);

}

}

class Dog extends Animal{

public Dog() {}

public Dog(String name,int age) {

Super(name,age);          //super传给父类进行初始化

}

 

public void eat(){               //重写抽象类中的所有抽象方法

System.out.println(“狗吃肉”);

}

Public void lookHome() {

System.out.println(“看家”);

}

 

}

Class Test1_Animal{

Public static void main(String[] args){

Cat c = new Cat(“加菲8);      //直接创建猫对象

System.out.println(c.getName()+“...”+c.getAge());

c.eat();

c.catchMose();

Dog d = new Dog(“八公”,30);

System.out.println(d.getName()+”...”+d.getAge());

d.eat();

d.lookHome();

}

}

 

 

 

抽象类中可以没有抽象方法,不让它类创建本类对象,交给子类完成

abstract不能和什么关键字共存

abstractstatic

abstract修饰的方法没有方法体

static修饰的可以用类名.调用,但类名.调用抽象方法是没有意义的

abstractfinal:

abstract修饰的方法强制子类重写

final修饰的方法不让子类重写

abstractprivate

abstract修饰的是为了让子类看到并强制重写

private修饰的不让子类访问,所以他们是矛盾的

 

 

 

 

 

接口:interface

interface 接口名()

class 类名 implements 接口名{}

接口不能被实例化

用多态的方式实例化

接口的子类可以是抽象类

也可以是具体类,要重写接口中的所有抽象方法

interface Inter {                      //接口

public abstract void print();         //接口中的方法都是抽象的

}

Class Demo implements Inter {

Public void print() {               //接口实例化

System.out.print(“print”);

}

}

class Demo1_interface{

//Inter i = new Inter();  //接口不能被实例化

Inter i = new Demo();   //父类引用指向子类对象

i.print();

}

 

接口的成员特点

interface Inter{           //接口中没构造方法

//接口中定义的成员变量只能是常量,并且是静态的,公共的

Int num = 10;     //默认修饰符:public static final

//public void print(){}   //接口中不能定义抽象方法

}

Class Demo /*extends Object*/ implements Inter{  //一个类不写继承任何类,默认继承Object

Public void print() {

System.out.print(num);

}

}

Class Demo2_Interface{

public static void main(String[] args){

Demo d = new Demo();

d.print();          //10

}

}

 

 

 

 

 

类与类

继承关系,单继承,可以多层继承

类与接口:

实现关系,可以单实现,也可以多实现

还可以一个类同时实现多个接口

接口与接口:

继承关系,可以单继承,也可以多继承

interface InterA{

public abstract void printA();

}

interface InterB{

public abstract void printB();

}

interface InterC extends InterB,InterA{   //继承关系,可以单继承,也可以多继承

public abstract void printC();

}

 

//Class Demo implements InterA,implements InterB {  //非法

Class Demo implements InterA,InterB {

public void printA(){

System.out.println(“printA”);

}

public void printB(){

System.out.println(“printB”);

}

 

}

 

 

抽象类与接口

抽象类:is a,定义的是该继承体系的共性功能

成员变量:可以是变量,可以是常量

构造方法:有

成员方法:可以抽象,也可以非抽象

接口:like a,定义的是该体系的扩展功能

成员变量:只可以是常量

成员方法:只可以是抽象的

 

 

 

abstract class Animal{

private String name;

private int age;

public Animal(){}

public Animal(String name,int age){

this.name=name;

this.age=age;

}

public abstract class eat();

public abstract class sleep();

}

interface Jumping{

public abstract void jump();

}

class cat extends Animal{

public Cat(){}

public Cat(String name,int age){

Super(name,age);

}

Public void eat() {

System.out.println(“猫吃鱼”);

}

Public void sleep() {

System.out/println(“侧睡”);

}

}

Class JumpCat extends Cat implements Jumping {

public JumpCat(){}

public JumpCat(String name,int age){

Super(name,age);    //通过父类传到Cat类,再通过Cat类传到Animal();

}

 

Public void jump(){

System.out.println(“猫跳高”);

}

}

Class Test1_Animal {

Public static void main (String[] args) {

Cat c= new Cat(“加菲”,8);

c.eat();

c.sleep();

JumpCat jc = new JumpCat(“跳高猫”,3);

jc.eat();

jc.sleep();

jc.jump();

}

}

 

private<默认<protected<public

private仅本类可访问

默认 仅本类和同一包下的子类或无关类可访问

protected 不同包下的无关类不可范文

public 权限最高

 

 

 

 

类:

权限修饰符:默认修饰符,public

状态:final

抽象:acstract

成员变量:

权限修饰符:private,默认,protected,public

状态:static,final

构造方法:private,默认,protected,public

成员方法:private,默认,protected,public

static,final

sbstract

组合规则:public static final

成员方法:public static

          public abstract

          public final

 

 

 

内部类:可直接访问外部类的成员,包括私有

Class Demo1_InnerClass{

Out.Inner oi = new Outer().new Inner();//使用外部类名.内部类名 = 外部类对象.内部类对象

Oi.method();

}

class Outer{

class Inner{

Public void method(){

System.out.println(“Hello world”)

}

}

}

静态成员内部类调用方法:

//外部类名.内部类名 对象名= 外部类名.内部类对象;

Outer.Inner oi = new Outer.Inner();

 

Class Outer{

Public int num = 10;

Class Inner {

Public int num = 20;

Public void show(){

Int num = 30;

System.out.println(num);//30

System.out.println(this.num);//20

System.out.println(Outer.this.num);10

}

}

}

 

 

 

 

 

匿名内部类要写在方法里

继承该类或实现该类的的子类匿名对象

interface Inter {

public void print();

}

Class Outer{

Class Inner implements Inter {

Public void print(){

System.out.println(“print”);

}

}

public void method() {

new Inter () {       //实现Inter接口

Public void print(){  //重写抽象方法

System.out.println(“print”);

}

}.print()

}

}

 

实现多个方法调用

interface Inter {

public void show1();

public void show2();

}

Class Outer{

public void method() {

/*方法一:

new Inter () {       //实现Inter接口

public void show1(){  //重写抽象方法

System.out.println(“show1”);

}

public void show2(){  //重写抽象方法

System.out.println(“show2”);

}

 

}.show1()//调用show1()方法

new Inter () {       //实现Inter接口

public void show1(){  //重写抽象方法

System.out.println(“show1”);

}

public void show2(){  //重写抽象方法

System.out.println(“show2”);

}

 

}.show2()//调用show2()方法

*/

Inter i = new Inter(){

public void show1(){  //重写抽象方法

System.out.println(“show1”);

}

public void show2(){  //重写抽象方法

System.out.println(“show2”);

}

};

i.show1();

i.show2();

//无法调Inter特有方法

}

}

 

 

类名调用方法:Outer.method().show

说明method() 是静态的

 

1-100d 随机数:

Int number = (int)(Math.random()*100)+1

 

静态优先于对象

重写只允许返回值是子父类关系

 

 

Eclipse内容快捷键

Alt+/:

 

快捷键:

 

jar是多个class文件的压缩包

 

 

 

 

 

API

Application Programming Interface

应用程序编程接口

 

Object类层次结构的根类,所有类都直接或间接继承这个类

HashCode()地址值

 

toString():左边:类名

        中间:@

        右边:16进制的哈希地址值

 

byte[] getBytes():把字符串转换为字节数组

char[] toCharArray():把字符串转换为字符数组

static String valueOf(char[] chs):把字符数组转换成字符串

static String valueOf(int i):int类型的数据转换成字符串

 

String toLowerCase():把字符串转换成小写

String toUpperCase():把字符串转换成大写

String concat(String str):把字符串拼接

 

 

 

StringBuffer:线程安全的可变字符序列,效率低

String:不可变的字符序列,效率高

 

 

冒泡排序

两个相邻位置比较,如果前面的元素比后面的元素大就换位置

选择排序

用一个索引位置上的元素,依次与其他索引位置上的元素比较,小的在前,大的在后

package t0702;

 

public class Test {

public static void main(String[] args) {

int[] arr = {24,69,80,57,13};

bubbleSort(arr);

//selectSort(arr);

print(arr);

}

/*

 * 冒泡排序

 * 返回值类型,void

 * 参数列表,int[] arr

 */

public static void bubbleSort(int[] arr) {

for(int i = 0;i<arr.length-1;i++) {//外循环只要比较arr.length-1

for(int j = 0;j <arr.length-1;j++){//-1是为了防止索引越界

if(arr[j]>arr[j+1]){

/*

 * int temp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = temp;

 */

swap(arr,j,j+1);

 

}

}

}

}

public static void print(int[] arr){

for(int i = 0;i<arr.length;i++){

System.out.println(arr[i]+" ");

}

}

/*

 * 选择排序

 * 返回值类型void

 * 参数列表int[] arr

 */

public static void selectSort(int[] arr){

for(int i = 0;i<arr.length-1;i++){

for(int j = i+1;j<arr.length;j++){

if(arr[i]>arr[j]){

/*

 * int temp = arr[i];

arr[i]=arr[j];

arr[j] = temp;

 */

swap(arr,i,j);

}

}

}

}

/*

 * 换位操作

 * 返回值类型,void

 * 参数列表int[],arr.int i,int j

 * 如果某个方法,只针对本类,不想让其它类使用就可以定义为私有的

 */

private static void swap(int[] arr,int i,int j){

int temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

 

}

 

二分查找:有序的

查找元素对应的索引

 

package t0702;

 

public class Test {

 

public static void main(String[] args) {

int[] arr = {11,22,33,44,55,66};

System.out.println(getIndex(arr,55));

 

}

/*

 * 二分查找

 * 返回值类型,void

 * 参数列表int[] arr,int value

 */

public static int getIndex(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){  //中间值小于要找的值

min = mid+1;//最小的索引改变

}else if(arr[mid]>value){  //中间值大于要找的值

max = min-1;  //最大索引改变

}

mid = (min+max) / 2;  //无论是最大的改变,还是最小的改变,中间值都会改变

 

if(min>max) {

return -1;

}

}

return mid;

}

 

}

 

 

Arrays:

package t0702;

 

import java.util.Arrays;

 

public class Test {

 

public static void main(String[] args) {

int[] arr={33,22,11,44,66,55};

System.out.println(Arrays.toString(arr));  //数组转字符

Arrays.sort(arr);         //排序

System.out.println(Arrays.toString(arr));

 

int[] arr2={11,22,33,44,55,66};

System.out.println(Arrays.binarySearch(arr, 22));

System.out.println(Arrays.binarySearch(arr, 66));

System.out.println(Arrays.binarySearch(arr, 88));//-7   负的插入点减1

}

 

 

}

 

转二进制:

Integer.toBinaryString(60)//111100

8进制:

Integer.toOctalString(60)//74

16进制:

Integer.toHexString(60)//3c

 

int ---String 四种方法转化

int i = 100;

String s1= i+"";//1 推荐

String s2 = String.valueOf(i);//2  推荐

Integer i2 = new Integer(i);

String s3 = i2.toString();//3

String s4 = Integer.toString(i);//4

System.out.println(s1);

String---int

String s = "200";

Integer i3 = new Integer(s);//Integer转换成int

int i4 = i3.intValue();

int i5 = Integer.parseInt(s);//String转换成int

 

 

基本类型包装类有8中,其中其中都有parseXxx的方法,可以将这七种字符串表现形式转换成基本数据类型(除char,,,字符串到子父的转换通过toCharArray()把字符串转换为字符数组)

 

 

 

 

 

 

 

 

 

 

Integer i1 = new Integer(97);

Integer i2 = new Integer(97);

I1==i2//false,两个对象,肯定是false

I1.equals(i2);//true,比较属性值

 

 

 

Integer i5=127;

Integer i6=127;

I5==i6;//true

I5.equals(i6);//true

 

Integer i7=128;

Integer i8=128;

I7==i8;//false

I7.equals(i8);//true

-128127byte的取值范围,如果在这个取值范围内,自动装箱就不会新创建对象,而是从常量池中获取

如果超过了byte取值范围就会再创建对象,就为false

 

 

 

 

 

utilbao下的

Date某一瞬间,精确到毫秒

Sun Jun 06 13:31:06 CST 2088

                 8

 

 

日期与字符串相互转换:

DateFormat df1 = DateFormat.getDateInstance();//相当于父类引用指向子类对象,右边的方法返回一个子类对象

 

规定日期格式

Date d = new Date();

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy/MM/dd HH:mm:ss”);

System.out.println(sdf.format(d));

 

将时间字符串换成日期对象

String str=”20000808080808

SimpleDateFormat sdf = new SimpleDateFormat(“yyyyMMddHH:mm:ss”);

Date d = sdf.parse(str);//抛出异常throws ParseException(ctrl+e)

System.out.println(d);

 

活了多少天

 

 

 

Calender c = Calender.getInstance();//父类引用指向子类对象

System.out.println(c.get(Calendar.YEAR));//2018

System.out.println(c.get(Calendar.MONTH));//6,,通过字段获取月,但月是从0开始编号的

System.out.println(c.get(Calendar.DAY_OF_MONTH));//3

System.out.println(c.get(Calendar.DAY_OF_WEEK));//3,,,周日是第一天

 

对星期存储中进行查表

public static String getWeek(int week) {

String[] arr = {“”,”星期日”,”星期一”,”星期二”,”星期三”,”星期四”,”星期五”,”星期六”};

return arr[week];

}

 

 

c.add(Calendar.YEAR,-1);//   2017/7/3,对指定字段进行加减

 

c.set(Calendar.YEAR,2000); //修改制定字段

 

 

 

判断闰年:

 

 

 

 

数组和集合

数组既可以存储基本数据类型,又可以存储引用数据类型(基本数据类型存储的是值,引用数组类型存储的是地址值)

集合只能存储引用数据类型(对象),也可以存储基本数据类型,在存储是会自动装箱变成对象100----new Integer(100)

数组的长度是固定的,不能自动增长

集合的长度是可变的,根据元素的增加而增加

 

元素个数是固定的---用数组

          不固定---用集合

 

Collection

 

 

 

 

object[] arr = c.toArray();//集合转化为数组

for(int i = 0;i<arr.length;i++){

System.out.println(arr[i]);

}

 

Collection c = new ArrayList();

c.add(new Student(“张三”,23));

c.add(new Student(“李四”,24));

c.add(new Student(“王五”,23));

c.add(new Student(“赵六”,26));

Object[] arr = c.toArray();       //将集合转换成数组

for(int i = 0;i < arr.length;i++) {

Student s = (Student)arr[i];  //向下转型

System.out.println(s.getName()+”...”+s.getAge());

}

 

All的方法

boolean addAll(Collection c)

boolean removeAll(Collection c)

boolean containsAll(Collection c)

boolean retainAll(Collection c)

 

IndexOutofBoundsException:索引越界异常

当存储是使用不存在的索引时,就出现索引越界异常

 

 

 

删除的时候不会自动装箱

List list = new ArrayList();

list.add(111);

list.add(222);

list.add(333);

list.remove(111);//错误,删除的时候不会自动装箱,把111当索引了

 

数组:

查询快,修改快

增删慢

链表:

查询慢,修改慢

增删快

 

VectorArrayList的区别(底层都是数组)

Vector是线程安全的,效率低

ArrayList是线程不安全的,效率高

ArrayListLinkedList的区别(都是线程不安全的)

ArrayList底层是数组结果,查询和修改快

LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢

 

 

89101112了解    16能看懂

 

ArrayList newList = new ArrayList<>();

Iterator it = list.iterator();   //根据传入的数据获取迭代器

//去掉集合中的重复数据

while(it.hasNext()){  //遍历老集合

Object obj = it.next();

if(!newList.contains(obj)) {

newList.add(obj);

}

}

 

 

重写equals方法,

public boolean equals(Object obj){

Person p = (Person)obj;

return this.name.equals(p.name) && this.age == p.age;

}

 

 

栈先进后出

队列先进先出

 

list:

addLast(obj);

removeLast();

isEmpty();

 

 

泛型

Collection<E>---泛型<引用数据类型>

提高了安全性

省去了强转的麻烦

 

classCastException 当试图将对象强制转化为不是实例的子类时,抛出该异常

 

 

泛型不要定义成Object

泛型方法

public<T> 返回类型 方法名()(泛型类型 变量名)

静态方法必须要自己声明自己的类型

 

 

 

数组转集合不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法

 

 

增强for循环不可以删除

 

HashSet底层是HashMap

HashSet是单列的,HashMap是双列的

HashSet中数据结构对元素起作用,HashMap中数据结构只对键起作用

 

 

 

 

HashMap

增加:

Map<String,Integer> map = new HashMap();

Integer i1= map.put(“张三”,”23”);

Integer i2= map.put(“李四”,”24”);

Integer i3= map.put(“王五”,”23”);

Integer i4= map.put(“赵六”,”26”);

Integer i5= map.put(“张三”,”26”);

 

System.out.println(map);//[赵六=26,张三=23,李四=24,王五=23]

System.out.println(i1);//null,返回被覆盖的值

Integer i5= map.put(“张三”,”26”);//23

 

 

删除:

Map<String,Integer> map = new HashMap();

map.put(“张三”,”23”);

map.put(“李四”,”24”);

map.put(“王五”,”23”);

map.put(“赵六”,”26”);

Integer value = map.remove(“张三”);//根据键删除,返回值

System.out.println(value);//23

System.out.println(map);//[赵六=26,李四=24,王五=23]

 

System.out.println(map.containsKey(“张三”));//判断是否包含传入的键 true or false

System.out.println(map.containsValue(23));//判断是否包含传入的值 true or false

 

Collection<Integer> c = map.values();

System.out.println(c);//[26,23,24,23],所有值的集合

 

map集合不能直接迭代

迭代器遍历

Set<String> keySet = map.keySet();//获取所有键的集合

Iterator<String> it = keySet.iterator();//获取迭代器

while(it.hasNext()){   //判断集合中是否有元素

String key = it.next();

Integer value = map.get(key);//根据键获取值

System.out.println(key+“=”+value)

}

增强for循环遍历

for(String key:map.keySet()){

System.out.println(key+”=”+map.get(key));

}

//Map.Entry说明EntryMap的内部接口,将键喝值封装成了Entry对象,并存储在Set集合中

Set<Map.entry<String,Integer>> entrySet = map.entrySet();

Iterator<Map.Entry<>String,Integer>> it = entrySet.iterator();

for(MAp.Entry<String,Integer> en : Map.entrySet() {

System.out.println(en.getKey()+”=”+en.getValue());

}

 

LinkedHashMap:

Student类中实现comparable<Student>,重写compareT(Student o);方法,根据年龄排序

 

按姓名比

HashMapHashtable的区别

共同点:底层都是哈希算法,都是双列集合

区别:

1,HAshMap是线程不安全的,效率高,JDK1.2版本的

 Hashtable是线程安全的,效率低

  1. HashMap可以存储null键和null

   Hashtable不可以存储null键和null

集合总结:

单列:

双列:

异常:

RuntimeException运行时异常:

NullPointerException:空指针异常:赋值为null还要对它进行访问

IndexOutOfBoundsException:索引越界异常

ArrayIndexoutOfBoudsException:数组

StringIndexOutOfBoundsException:字符串

ClassCastException:类型转换异常

ArithmeticException(“/ by zero”);违背数学运算法则,例如,除数为零

RuntimeException以外都是编译时的错误

 

try/catch

try:用来检测异常的,

catch:用来捕获异常

finally:释放资源

try...catch

try...catch...finally

try finally

编译时异常:在编译某个程序的时候,有时会出现异常,比如文件找不到了,这样的异常必须在编译的时候处理,如果不处理就编译不通过

运行时异常:程序员犯的错误,可以处理,也可以不处理

jvm默认用e.printStackTrace();处理异常

 

 

thows

主方法抛给jvm:

throwthrows区别

thows表示抛出异常

throw跟的时异常对象

 

finally控制的语句体一定会被执行、用于释放资源

try {

 

} catch(Exception e) {

...

return;//就算这里有return也会在执行完finally再彻底返回

} finally {

 

}

 

 

final,finlly,finalize,,,只是长得像

final:

final可以修饰类,不能被继承

修饰方法,不能被重写,

修饰变量,只能被赋值一次

finlly:try语句中的一个语句体,不能单独使用,用来释放资源

finalize:当垃圾回收器确定不存在对该对象的更多引用时,有对象的垃圾回收器调用此       方法

 

如果catch里面有return语句,请问finally的代码还会执行嘛?如果会,请问时在return前还是return

 

异常注意事项:

1.子类重写父类方法时,子类方法必须抛出相同的异常或父类异常的子类

2.如果父类抛出多个异常,子类重写父类时,只能抛出相同的异常或者时它的子集,子类不能抛出父类没有的异常

3.如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,只能try,不能throws.

4.如果该功能内部可以将问题处理,用try,如果处理不了,交给调用者处理,这是throws

区别:

后续程序需要继续运行就try

后续程序不需要继续运行就throws

 

如果jdk没有提供对应的异常,需要自定义异常

 

 

 

 

 

转载于:https://www.cnblogs.com/CYYWing/p/9277240.html

你可能感兴趣的文章
winform textbox.text设置换行技巧备忘
查看>>
转 NSRange 的用法
查看>>
Multi Thread.
查看>>
指针接收函数
查看>>
C#用大石头Xcode做数据底层注意事项
查看>>
8个数据清洗Python代码,复制可用,最长11行 | 资源
查看>>
函数模板
查看>>
结合 Laravel 5.5 + vue 2.5 开发的博客
查看>>
浅谈------location
查看>>
vue 创建项目
查看>>
uva 784 Maze Exploration
查看>>
深入理解Linux字符设备驱动
查看>>
Js实现select全选和取消选择
查看>>
224. Basic Calculator
查看>>
黑马程序员_第21天
查看>>
cocoapods pod setup
查看>>
20162318 张泰毓 预备作业03
查看>>
极光推送
查看>>
Java时间日期格式转换
查看>>
智能合约 运算
查看>>