<黑马程序员>java基础加强--JDK 5.0 新特性

本文深入探讨了 Java 5 引入的重要新特性,包括静态导入、自动装箱拆箱、增强 for 循环及可变参数等,旨在帮助开发者更高效地使用这些特性。

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

1. 静态导入

1) 导入类的静态属性

为了简化对类的静态成员的引用,JDK 5.0增加的静态导入语法用于导入类的某个静态属性或方法。

语法:
import static 包名.类名.静态属性|静态方法|*
例如:
导入System类的静态属性out
import static java.lang.System.out
在程序中直接使用out.print(str) 输出到控制台


2)导入Math类的所有静态方法
import static java.lang.Math.*
在程序中使用  abs(num) 直接调用类的静态成员方法

int num = abs(-10);


2,自动装箱/拆箱

在java中有8种基本数据类型,为了方便将基本数据类型当做对象来处理,sun公司定义了对应的包装类,如:int  Integer
包装类就是对基本数据类型值的封装
JDK5.0之前,开发人员若想将一个基本数据类型赋值给包装类变量, 需要进行手动包装, 如: Integer x = new Integer(98);
JDK5.0中定义了新特性自动拆箱与自动装箱,开发人员可以直接将基本数据类型的值直接赋值给包装类对象,反之一样。不需要任何的手动装箱与拆箱。
典型应用:
List list = new ArrayList();
list.add(19);
Int num = (Integer) list.get(0);

 基本数据类型的包装类

int --> Integer

byte --> Byte

short --> Short

long --> Long

char --> Character

double --> Double

float --> Float

boolean --> Boolean


1) Integer x = 1; x = x + 1;  经历了什么过程? 装箱à 拆箱 à 装箱

2) 为了优化,虚拟机为包装类提供了缓冲池, Integer池的大小 -128~127 一个字节的大小

3) String池

 Java为了优化字符串操作 提供了一个缓冲池

 面试题:

String s = “abc” 和 String s = new String(“abc”) 的区别

String s = new String(“abc”) 创建了几个对象 

String s = “a” + “b” + “c” + “d” 创建了几个对象

String s1 = “a” String s2 = “b”  String s3 = s1 + s2;  s3==”ab”?

/*1. String s = "abc", 虚拟机首先会检查String池里有没有"abc"对象(通过equals方法)

// 如果有,直接返回引用,如果没有,会在池里创建一个“abc”对象,并返回引用

String s1 = "abc";

String s2 = "abc";

System.out.println(s1==s2); // result: true

*/

/* 2. String str = new String("abc"); 

不管缓冲池是否有"abc", 都会在堆内存创建一个"abc"对象,返回引用

// 此时,负责检查并维护缓冲池,其实堆内存的对象是缓冲池中"abc"对象的一个拷贝

String s1 = new String("abc");

String s2 = new String("abc");

System.out.println(s1==s2); // result: false

*/

/* 3. String s = "a" + "b" + "c" + "d";  java编译器有个合并已知量的优化功能

// 在编译阶段就把"a" + "b" + "c" + "d" 合并为 ”abcd“

String s = "a" + "b" + "c" + "d"; 

// String s = "abcd"; 

System.out.println(s=="abcd");// result: true

*/

/* 4.  String s1 = "a"; String s2 = "b"; String s3 = s1 + s2;

// String是常量,不能相加的,java如何实现的?

 StringBuilder sb = new StringBuidler(s1);

 sb.append(s2);

 s3 = sb.toString();

 

 也就是说实际上s3是方法返回的String对象

 凡是方法返回的字符串对象都是在堆内存的

*/

 String s1 = "a";

 String s2 = "b"; 

 String s3 = s1 + s2; // 堆内存的对象

 System.out.println(s3=="ab");// result: false


3. 增强for循环

JDK5.0以前,遍历数组或集合中的元素都需要些迭代的代码

JDK5.0中定义了一种新的语法——增强for循环,专门用于对
存储对象的容器进行迭代(数组和集合),注意,对于集合,只
能对实现了Iterable接口的对象进行迭代,原因在于,Iterable
接口中定义了iterator方法

语法格式:                                              
for(变量类型 变量 :需迭代的数组或集合){
// 使用变量引用容器中的元素
}

实现原理:
获得对象的迭代器,针对集合对象进行迭代,将每次迭代的值付给for循环
中定义的变量

1,增强for循环迭代数组

String [] arr = {"a", "b", "c"}; //数组的静态定义方式,只试用于数组首次定义的时候

// 传统方式

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

// i依次表示数组的角标

String s = arr[i];

System.out.println(s);

}

System.out.println("-------------------------------------");

// 在jdk5中我们可以使用增强for循环迭代

// 增强for循环括号里写两个参数,第一个是声明一个变量,变量类型必须是数组元素的类型

// 第二个就是需要迭代的容器

// for循环会循环容器的length次, 每次都将容器的第n-1个元素赋值给声明的变量

for(String s : arr) {

// 循环体, 执行arr.length

// 每次都将arr中的第n-1个元素给s

System.out.println(s); //

}

,2,增强for循环迭代单列集合collection

List list = new ArrayList();

list.add("aaa");

list.add("bbb");

list.add("ccc");

// 传统方式1

/* 1.获得迭代器

Iterator iter = list.iterator();

// 2.循环判断迭代器是否有下一个

while(iter.hasNext()) {

String str = (String) iter.next(); // 将迭代器的指针移向下一个,并将迭代当前指向的元素返回

System.out.println(str);

}

*/

// 传统方式2

for(Iterator iter=list.iterator(); iter.hasNext(); ) {

String s = (String) iter.next();

System.out.println(s);

}

System.out.println("--------------------------------");

// 增强for循环, 没有使用泛型的集合能不能使用增强for循环迭代?能

for(Object obj : list) {

String s =  (String) obj;

System.out.println(s);

}


3,增强for循环迭代双列集合Map

Map map = new HashMap();

map.put("a", "aaa");

map.put("b", "bbb");

map.put("c", "ccc");

// 传统方式迭代1

// 1. 获得所有的key

Set keys = map.keySet();

// 2.迭代keys获得所有的key

Iterator iter = keys.iterator();

while(iter.hasNext()) {

String key = (String) iter.next(); // a b c

// 3.根据key获得对应的value

String value = (String) map.get(key);

System.out.println(key + "=" + value);

}

System.out.println("---------------------------------");

// 传统方式2,必须掌握这种方式

// 1.获得所有的键值对Entry对象

Set entrys = map.entrySet();

// 2.迭代出所有的entry

iter = entrys.iterator();

while(iter.hasNext()) {

Map.Entry entry = (Entry) iter.next();

// 分别获得key和value

String key = (String) entry.getKey();

String value = (String) entry.getValue();

System.out.println(key + "=" + value);

}

System.out.println("-------------------------------------");

System.out.println("增强for循环迭代,");

// 增强for循环迭代,

// 原则上map集合是无法使用增强for循环来迭代的,

// 因为增强for循环只能针对实现了Iterable接口的集合进行迭代

// Iterable是jdk5中新定义的接口,就一个方法iterator方法

// 只有实现了Iterable接口的类,才能保证一定有iterator方法

// java有这样的限定是因为增强for循环内部还是用迭代器实现的

// 而实际上,我们可以通过某种方式来使用增强for循环

for(Object obj : map.entrySet()) {

// obj 依次表示Entry

Map.Entry entry = (Entry) obj;

System.out.println(entry.getKey() + "=" + entry.getValue());

}


4,迭代集合时应该注意的问题

// 在使用迭代器迭代集合的过程中,不能对集合进行增删操作

@Test

public void test4() {

List list = new ArrayList();

list.add("wangwu");

list.add("zhangsan");

list.add("lisi");

Iterator iter = list.iterator();

while(iter.hasNext()) {

String name = (String) iter.next();

if("wangwu".equals(name)) {

// 从集合中删掉

//list.remove(name);

// 迭代过程中删除元素需要调用迭代器的方法

iter.remove(); // 删除我迭代的集合被我迭代的最后一个元素

}

}

// 1 2 4

System.out.println(list.size());

}

@Test

public void test5() {

List list = new ArrayList();

list.add("aa");

list.add("bb");

// 使用ListIterator迭代器

ListIterator listIterator = list.listIterator();

while(listIterator.hasNext()) {

listIterator.next();

// 迭代过程中增加元素

listIterator.add("cc");

}

System.out.println(list.size());

}

5,增强for循环注意的问题

//在使用增强for循环时,不能对元素进行赋值

int[] arr = {1,2,3};

for(int num : arr) {

num = 0;

}

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


4. 可变参数

从JDK 5开始, Java 允许为方法定义长度可变的参数。
即方法定义一个形参,但是可以传入0~n个实参,
方法定义如下:
public void foo(int … args){
args
}

Util包中的工具类Arrays的asList(Object[])方法就将形参定义为可变参数
调用此方法分别测试传入多个参、传引用类型数组、传基本数据类型数组、传数组又传参的情况

细节:
调用可变参数的方法时, 编译器将自动创建一个数组保存传递给方法的
可变参数,因此,程序员可以在方法体中以数组的形式访问可变参数

可变参数只能处于参数列表的最后, 因此一个方法最多只能有一个可变的参数

1,设计一个方法求n个数的和

public static int getSum(int... arr) {

// 可变参数在方法中仍被看做一个数组

int sum = 0;

for(int num : arr)

sum += num;

return sum;

}


2)Arrays.asList为例演示传入不同参数的情况

// list长度为3

List list = Arrays.asList("a","b","c");

// list长度为1, 因为考虑1.4语法

String[] arr = {"a","b","c"};

List list = Arrays.asList(arr);

// 同时符合1.4和1.5的语法,此时会优先考虑1.4的语法

// 原因是有了新功能要保证以前的代码不出错,向后兼容

// 现在就需要将arr作为一个元素存入集合

Object obj = arr;

List list2 = Arrays.asList(obj); // 此时只符合1.5的语法,不符合1.4的语法,没有歧义

List list3 = Arrays.asList(new Object[]{arr}); // 优先考虑1.4,所以数组会拆开

//System.out.println(list3.size());

// 基本数据类型数组只符合1.5的语法

int[] nums = {1,2,3};

list = Arrays.asList(nums);

System.out.println(list.size());






内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值