Java自学基础

JAVA

基础

快捷键

  1. psvm 快速创建main 方法
  2. sout 快速print输入
  3. array.for for循环
  4. array.fori for循环
  5. alt + insert 导入get/set方法

注释

  1. 单行注释 //xxx
  2. 多行注释 /xxx/
  3. 文档注释 /* xxx */

数据类型

  1. 整数类型 byte short int long

    1.byte b;//指定变量b为byte型 (最小值-128 最大值127)
              一个常量,保存 byte 类型可取的最大值,即 2^7-1。(127)
              一个常量,保存 byte 类型可取的最小值,即 -2^7。(-128)
    2.short s;//指定变量s为short型
              保存 short 可取的最大值的常量,最大值为 215-1。(32 767)
              保存 short 可取的最小值的常量,最小值为 -215。(-32 768)
              只要知道short是32位就可以参考上byte的求法
    
    3.int i;//指定变量i为int型
                值为 231-1 的常量,它表示 int 类型能够表示的最大值。
                值为 -231 的常量,它表示 int 类型能够表示的最小值。
                只要知道int是32位就可以参考上byte的求法
    
    4.long l;//指定变量l为long型
            保持 long 类型的最大值的常量,该值为 263-1。
            保持 long 类型的最小值的常量,该值为 -263。
            只要知道int是64位就可以参考上byte的求法
    
    
    
  2. 浮点类型 float double

  3. 字符类型 char

  4. 布尔类型 boolean

基本类型和包装类型的区别
java的每个基本类型都对应了一个包装类型;比如int的包装类型为Integer,double的包装类型为Double
1.包装类型可以为null,而基本类型不可以
2.包装类型可用于泛型,而基本类型不可以
	List<int> list = new ArrayList<>(); // 提示 Syntaxerror, insert "Dimensions" to complete 											      ReferenceType
	List<Integer> list = new ArrayList<>();
3.基本类型比包装类型更高效
	基本类型在栈中直接存储的具体数值,而包装类型则存储的是堆中的引用
4.两个包装类型的值可以相同,但却不相等
	Integer chenmo = new Integer(10);
	Integer wanger = new Integer(10);

	System.out.println(chenmo == wanger); // false
	System.out.println(chenmo.equals(wanger )); // true
	
自动装箱和自动拆箱
既然有了基本类型和包装类型,肯定有些时候要在它们之间进行转换。把基本类型转换成包装类型的过程叫做装箱(boxing)。反之,把包装类型转换成基本类型的过程叫做拆箱(unboxing)
Java SE5 之前:
Integer chenmo = new Integer(10);  // 手动装箱
int wanger = chenmo.intValue();  // 手动拆箱
之后
Integer chenmo  = 10;  // 自动装箱
int wanger = chenmo;     // 自动拆箱

Integer类的缓存机制

public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        //当前值在缓存数组区间段,则直接返回该缓存值
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        //否则创建新的Integer实例
        return new Integer(i);
    }
    
    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        //IntegerCache初始化时,缓存数值为-128-127的Integer实例(默认是从-128到127)。
        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            //填充缓存数组
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }
Integer的源码,就会发现里面有个静态内部类
该类的作用是将数值等于-128-127(默认)区间的Integer实例缓存到cache数组中。通过valueOf()方法很明显发现,当再次创建值在-128-127区间的Integer实例时,会复用缓存中的实例,也就是直接指向缓存中的Integer实例。注意,这里的创建不包括用new创建,new创建对象不会复用缓存实例
Integer的默认缓存范围为-128到127,可以通过jvm参数改变这个范围。

缓存上界high可以通过jvm参数-XX:AutoBoxCacheMax=size指定,取指定值与127的最大值并且不超过Integer表示范围,
下界不能指定,只能为-128。

类型转换

优先级从低到高 byte, short, char, int, long, float, double

自增自减

int a =3;
int b = a++; 执行完这行代码后,先给b赋值,再自增
int c = ++a; 执行完这行代码前,先自增,再给c赋值
输出结果为:
5
3
5

Scanner对象(类似于python input)

Scanner scanner = new Scanner(System.in);

        System.out.println("使用next方法接受:");
        if (scanner.hasNext()){
            //String str1 = scanner.next();  
            String str = scanner.nextLine();
            //System.out.println("输出的内容为:"+str1);
            System.out.println("输出的内容为:"+str);

        }
        scanner.close();

switch多选择结构

swith case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支switch 语句中的变量类型可以是:    byte  short  int  char    switch 支持字符串String类型    case标签必须为字符串常量或字面量
public class Switch1 {
    public static void main(String[] args) {
        char grade = 'F';
       switch (grade){
           case 'A':
               System.out.println("好");
               break;
           case 'B':
               System.out.println("良");
               break;
           case 'C':
               System.out.println("差");
               break;
           default:
               System.out.println("未知");
       }
    }
}

java修饰符

java分为主要两类修饰符
1. 访问修饰符	
	default  默认访问修饰符(即默认,什么也不写):在同一包内可见,不使用任何修饰符。使用对象:类,接		口,变量,方法	
	private 私有访问修饰符:在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)	
	public  公有访问修饰符:对所有类可见。使用对象:类、接口、变量、方法	
	protected 受保护的访问修饰符: 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
2. 非访问修饰符	
	static 修饰符,用来修饰类方法和类变量。		
		静态变量:static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。		
		静态方法:static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。	
	final 修饰符 		
		final 变量 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。 final 修饰符通常和 static 修饰符一起使用来创建类常量。		
		final 方法 父类中的 final 方法可以被子类继承,但是不能被子类重写.声明 final 方法的主要目的是防止该方法的内容被修改	        
		final 类   final 类不能被继承,没有类能够继承 final 类的任何特性。           

java数组常用方法

  1. 获取数组元素 : Arrays.toString(array)

    System.out.println(Arrays.deepToString(test)); 打印多维数组
    System.out.println(Arrays.toString(test)); 打印一维数组
    不常用的打印:
    StreamArrays.asList(test).stream().forEach(s -> System.out.println(s));
    Stream.of(test).forEach(System.out::println);//       
    Arrays.stream(test).forEach(System.out::println);
    
  2. 数组排序 : Arrays.sort(array)

  3. 比较两个数组的元素是否相等: Arrays.equals(arr1,arr2)

  4. 截取数组(切片): Array.copyOfRange(array,startindex,endindex)

面向对象

封装

private 私有属性和变量,可通过get/set方法获取或者定义这个私有变量以供其他对象使用

继承

extends关键词   
语法:public class 子类 extends 父类(){}
private修饰符 无法被继承final 定义的类  无法被继承super
	注意点:	1. super调用父类的构造方法,必须在构造方法的第一行,	
			2. super必须只能出现在子类的方法或者构造方法中	
			3.  super和this 不能同时调用构造方法
super 和 this 的不同:	
	1.代表对象不同	this 代表调用者本身	super 代表父类对象	
	2.前置条件		this 没有继承也能使用	super 只有继承才能使用	
	3.构造方法		this() 本类的构造		super() 父类的构造

方法重写

需要有继承关系,子类从父类的方法  @override
	1 方法名必须相同
	2 参数列表必须相同
	3 修饰符,范围可以扩大但不能缩小  public>protected>default>private4 抛出的异常,范围可以缩小但不能扩大

多态

1.多态是方法的多态,属性没有多态
2.父类和子类有联系或是继承关系,不然会报类型转换异常
3.存在条件,继承关系,方法需要重写,父类引用指向子类对象 : Father f1 = new Son()

接口

关键词 interface   定义一个接口	接口中定义的方法都是抽象的 public obstract	接口中定义的常量是静态的   public statci final关键词 implements  实现接口,同时必须重写接口中的方法利用接口可多继承

Spring-Boot

常用注解

1.@SpringBootApplication

1. @SpringBootApplication
这个注解是 Spring Boot 项目的基石,创建 SpringBoot 项目之后会默认在主类加上,可以把 @SpringBootApplication看作是 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合
2. @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
3. @ComponentScan:扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类
4. @Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类5

2.Spring Bean 相关

1. @Autowired : 自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中
2. @Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。		   					
3. @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
4. @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
5. @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。
6. @RestController : @RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器 						bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器
7. @Scope : 声明 Spring Bean 的作用域	
					@Bean	
					@Scope("singleton")	
					public Person personSingleton() {   		 
								return new Person();	
								}	
					四种常见的 Spring Bean 的作用域:	
					singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。 	
					prototype : 每次请求都会创建一个新的 bean 实例。	
					request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。	
					session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
8. @Component : 一般用来声明配置类,可以使用 @Component注解替代,不过使用Configuration注解声明配置类更加				语义化

3.请求相关

1.GET:  @GetMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.GET)
2.POST: @PostMapping("users") 等价于@RequestMapping(value="/users",method=RequestMethod.POST)
3.PUT: @PutMapping("/users/{userId}") 等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
4.DELETE: @DeleteMapping("/users/{userId}")等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
5.PATCH: @PutMapping("/users/{userId}")等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.Put)

4.前后端传值

1.@PathVariable : 用于获取路径参数
2.@RequestParam : 用于获取查询参数
3.@RequestBody : 用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用HttpMessageConverter或者自定义的HttpMessageConverter将请求的 body 中的 json 字符串转换为 java 对象

5.读取配置信息

我们的数据源application.yml内容如下:
		JAVA! 
my-profile:  
	name:  XXX
	email: XXX
library:  
	location: XXX
	books:    
		- name: XXX     
			description: XXX 
1.	@value: 使用 @Value("${property}") 读取比较简单的配置信息:	
		@Value("${XXX}")	
		String XXX;
2.  @ConfigurationProperties: 通过@ConfigurationProperties读取配置信息并与 bean 绑定	
		@Component    
		@ConfigurationProperties(prefix = "library")    
		class LibraryProperties {        
			@NotEmpty        
			private String location;        
			private List<Book> books;        
			
			@Setter        
			@Getter        
			@ToString        
			static class Book {            
					String name;            
					String description;        
					}      
			省略getter/setter      ......    
			}
3.  @PropertySource(不常用): @PropertySource读取指定 properties 文件    
			@Component    
			@PropertySource("classpath:website.properties")    
			class WebSite {        
					@Value("${url}")       
					private String url;      
				省略getter/setter      
				......    
				}

6.参数校验

@NotEmpty 被注释的字符串的不能为 null 也不能为空
@NotBlank 被注释的字符串非 null,并且必须包含一个非空白字符
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Pattern(regex=,flag=)被注释的元素必须符合指定的正则表达式@Email 被注释的元素必须是 Email 格式。@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=)被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期

7.全局处理Controller层异常

1.@ControllerAdvice :注解定义全局异常处理类
2.@ExceptionHandler :注解声明异常处理方法

8.JPA相关

1.@Entity声明一个类对应一个数据库实体。
2.@Table 设置表名
3.@Id :声明一个字段为主键。 使用@Id声明之后,我们还需要定义主键的生成策略。我们可以使用 @GeneratedValue 指定主键生成策略。	
		@Id    
		@GeneratedValue(strategy = GenerationType.IDENTITY)    
		private Long id;
4.@Column 声明字段。
5.@Transient :声明不需要与数据库映射的字段,在保存的时候不需要保存进数据库
6.@Lob:声明某个字段为大字段。
7.@Enumerated:声明枚举类型的字段
8.@Modifying 注解提示 JPA 该操作是修改操作,注意还要配合@Transactional注解使用    
		@Repository    
		public interface UserRepository extends JpaRepository<User, Integer> {       
				 @Modifying        
				 @Transactional(rollbackFor = Exception.class)        
				 void deleteByUserName(String userName);	
				}
9.关联关系:	@OneToOne 声明一对一关系	
			@OneToMany 声明一对多关系	
			@ManyToOne声明多对一关系	
			@ManyToMany声明多对多关系	
10. @Transactional :在要开启事务的方法上使用@Transactional注解即可	
		作用于类:当把@Transactional 注解放在类上时,表示所有该类的public 方法都配置相同的事务属性信息
	    作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。

9.json数据处理

1.@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。
2.@JsonIgnore一般用于类的属性上,作用和上面的@JsonIgnoreProperties 一样。
3.@JsonFormat一般用来格式化 json 数据。
4.@JsonUnwrapped 扁平化对象

10.测试相关

1.@ActiveProfiles一般作用于测试类上, 用于声明生效的 Spring 配置文件
2.@Test声明一个方法为测试方法
3.@Transactional被声明的测试方法的数据会回滚,避免污染测试数据
4.@WithMockUser Spring Security 提供的,用来模拟一个真实用户,并且可以赋予权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值